All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ilias Apalodimas <ilias.apalodimas@linaro.org>
To: u-boot@lists.denx.de
Subject: [PATCH v4 08/11] tpm: Add an implementation of define_space
Date: Sun, 7 Feb 2021 13:44:02 +0200	[thread overview]
Message-ID: <YB/SglkZGtsUW0yM@apalos.home> (raw)
In-Reply-To: <20210206142327.v4.8.Id0d4b4dbb1473da74703264f0b20940f1d65dd81@changeid>

On Sat, Feb 06, 2021 at 02:23:39PM -0700, Simon Glass wrote:
> Add support for this so that the TPM can be set up for use with
> Chromium OS verified boot.
> 
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
> 
> Changes in v4:
> - Drop unnecessary update of offset
> 
> Changes in v3:
> - Add a comment to the offset and fix up the value
> 
>  include/tpm-v2.h | 18 ++++++++++++++++++
>  lib/tpm-v2.c     | 47 +++++++++++++++++++++++++++++++++++++++++++++++
>  2 files changed, 65 insertions(+)
> 
> diff --git a/include/tpm-v2.h b/include/tpm-v2.h
> index fab6b86ca2f..2766dc72a65 100644
> --- a/include/tpm-v2.h
> +++ b/include/tpm-v2.h
> @@ -238,6 +238,7 @@ enum tpm2_command_codes {
>  	TPM2_CC_CLEAR		= 0x0126,
>  	TPM2_CC_CLEARCONTROL	= 0x0127,
>  	TPM2_CC_HIERCHANGEAUTH	= 0x0129,
> +	TPM2_CC_NV_DEFINE_SPACE	= 0x012a,
>  	TPM2_CC_PCR_SETAUTHPOL	= 0x012C,
>  	TPM2_CC_DAM_RESET	= 0x0139,
>  	TPM2_CC_DAM_PARAMETERS	= 0x013A,
> @@ -386,6 +387,23 @@ u32 tpm2_self_test(struct udevice *dev, enum tpm2_yes_no full_test);
>  u32 tpm2_clear(struct udevice *dev, u32 handle, const char *pw,
>  	       const ssize_t pw_sz);
>  
> +/**
> + * Issue a TPM_NV_DefineSpace command
> + *
> + * This allows a space to be defined with given attributes and policy
> + *
> + * @dev			TPM device
> + * @space_index		index of the area
> + * @space_size		size of area in bytes
> + * @nv_attributes	TPM_NV_ATTRIBUTES of the area
> + * @nv_policy		policy to use
> + * @nv_policy_size	size of the policy
> + * @return return code of the operation
> + */
> +u32 tpm2_nv_define_space(struct udevice *dev, u32 space_index,
> +			 size_t space_size, u32 nv_attributes,
> +			 const u8 *nv_policy, size_t nv_policy_size);
> +
>  /**
>   * Issue a TPM2_PCR_Extend command.
>   *
> diff --git a/lib/tpm-v2.c b/lib/tpm-v2.c
> index c4e869ec5b5..e9bf4018fed 100644
> --- a/lib/tpm-v2.c
> +++ b/lib/tpm-v2.c
> @@ -81,6 +81,53 @@ u32 tpm2_clear(struct udevice *dev, u32 handle, const char *pw,
>  	return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
>  }
>  
> +u32 tpm2_nv_define_space(struct udevice *dev, u32 space_index,
> +			 size_t space_size, u32 nv_attributes,
> +			 const u8 *nv_policy, size_t nv_policy_size)
> +{
> +	/*
> +	 * Calculate the offset of the nv_policy piece by adding each of the
> +	 * chunks below.
> +	 */
> +	uint offset = 10 + 8 + 13 + 14;
> +	u8 command_v2[COMMAND_BUFFER_SIZE] = {
> +		/* header 10 bytes */
> +		tpm_u16(TPM2_ST_SESSIONS),	/* TAG */
> +		tpm_u32(offset + nv_policy_size),/* Length */
> +		tpm_u32(TPM2_CC_NV_DEFINE_SPACE),/* Command code */
> +
> +		/* handles 8 bytes */
> +		tpm_u32(TPM2_RH_PLATFORM),	/* Primary platform seed */
> +
> +		/* session header 13 bytes */
> +		tpm_u32(9),			/* Header size */
> +		tpm_u32(TPM2_RS_PW),		/* Password authorisation */
> +		tpm_u16(0),			/* nonce_size */
> +		0,				/* session_attrs */
> +		tpm_u16(0),			/* auth_size */
> +
> +		/* message 14 bytes + policy */
> +		tpm_u16(12 + nv_policy_size),	/* size */
> +		tpm_u32(space_index),
> +		tpm_u16(TPM2_ALG_SHA256),
> +		tpm_u32(nv_attributes),
> +		tpm_u16(nv_policy_size),
> +		/* nv_policy */
> +	};
> +	int ret;
> +
> +	/*
> +	 * Fill the command structure starting from the first buffer:
> +	 *     - the password (if any)
> +	 */
> +	ret = pack_byte_string(command_v2, sizeof(command_v2), "s",
> +			       offset, nv_policy, nv_policy_size);
> +	if (ret)
> +		return TPM_LIB_ERROR;
> +
> +	return tpm_sendrecv_command(dev, command_v2, NULL, NULL);
> +}
> +
>  u32 tpm2_pcr_extend(struct udevice *dev, u32 index, u32 algorithm,
>  		    const u8 *digest, u32 digest_len)
>  {
> -- 
> 2.30.0.478.g8a0d178c01-goog
> 
Acked-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>

  reply	other threads:[~2021-02-07 11:44 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-06 21:23 [PATCH v4 00/11] tpm: Support using TPM1 and TPM2 from a single API Simon Glass
2021-02-06 21:23 ` [PATCH v4 01/11] tpm: Don't include cr50 in TPL/SPL Simon Glass
2021-03-03 19:10   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 02/11] tpm: Use logging in the uclass Simon Glass
2021-03-03 19:10   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 03/11] tpm: Add debugging of request in tpm_sendrecv_command() Simon Glass
2021-03-03 19:10   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 04/11] tpm: Add an API that can support v1.2 and v2 Simon Glass
2021-03-03 19:10   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 05/11] tpm: Switch TPMv1 over to use the new API Simon Glass
2021-02-07 11:44   ` Ilias Apalodimas
2021-03-03 19:11   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 06/11] tpm: Add a basic API implementation for TPMv2 Simon Glass
2021-03-03 19:11   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 07/11] tpm: Reduce duplication in a few functions Simon Glass
2021-03-03 19:11   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 08/11] tpm: Add an implementation of define_space Simon Glass
2021-02-07 11:44   ` Ilias Apalodimas [this message]
2021-03-03 19:11   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 09/11] tpm: Add TPM2 support for read/write values Simon Glass
2021-03-03 19:11   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 10/11] tpm: Add TPM2 support for write_lock Simon Glass
2021-03-03 19:11   ` Tom Rini
2021-02-06 21:23 ` [PATCH v4 11/11] tpm: Allow disabling platform hierarchy with TPM2 Simon Glass
2021-03-03 19:11   ` Tom Rini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=YB/SglkZGtsUW0yM@apalos.home \
    --to=ilias.apalodimas@linaro.org \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.