[PATCH v4 4/6] tpm: sandbox: Update for needed TPM2 capabilities

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Jan 26 07:41:55 CET 2023


On Wed, Jan 25, 2023 at 11:18:08AM -0600, Eddie James wrote:
> The driver needs to support getting the PCRs in the capabilities
> command. Fix various other things and support the max number
> of PCRs for TPM2.
>
> Signed-off-by: Eddie James <eajames at linux.ibm.com>
> Reviewed-by: Simon Glass <sjg at chromium.org>
> ---
>  drivers/tpm/tpm2_tis_sandbox.c | 100 ++++++++++++++++++++++++---------
>  1 file changed, 72 insertions(+), 28 deletions(-)
>
> diff --git a/drivers/tpm/tpm2_tis_sandbox.c b/drivers/tpm/tpm2_tis_sandbox.c
> index dd94bdc31f..ea7fb5e3cb 100644
> --- a/drivers/tpm/tpm2_tis_sandbox.c
> +++ b/drivers/tpm/tpm2_tis_sandbox.c
> @@ -22,11 +22,6 @@ enum tpm2_hierarchy {
>  	TPM2_HIERARCHY_NB,
>  };
>
> -/* Subset of supported capabilities */
> -enum tpm2_capability {
> -	TPM_CAP_TPM_PROPERTIES = 0x6,
> -};
> -
>  /* Subset of supported properties */
>  #define TPM2_PROPERTIES_OFFSET 0x0000020E
>
> @@ -38,7 +33,8 @@ enum tpm2_cap_tpm_property {
>  	TPM2_PROPERTY_NB,
>  };
>
> -#define SANDBOX_TPM_PCR_NB 1
> +#define SANDBOX_TPM_PCR_NB TPM2_MAX_PCRS
> +#define SANDBOX_TPM_PCR_SELECT_MAX	((SANDBOX_TPM_PCR_NB + 7) / 8)
>
>  /*
>   * Information about our TPM emulation. This is preserved in the sandbox
> @@ -433,7 +429,7 @@ static int sandbox_tpm2_xfer(struct udevice *dev, const u8 *sendbuf,
>  	int i, j;
>
>  	/* TPM2_GetProperty */
> -	u32 capability, property, property_count;
> +	u32 capability, property, property_count, val;
>
>  	/* TPM2_PCR_Read/Extend variables */
>  	int pcr_index = 0;
> @@ -542,19 +538,32 @@ static int sandbox_tpm2_xfer(struct udevice *dev, const u8 *sendbuf,
>  	case TPM2_CC_GET_CAPABILITY:
>  		capability = get_unaligned_be32(sent);
>  		sent += sizeof(capability);
> -		if (capability != TPM_CAP_TPM_PROPERTIES) {
> -			printf("Sandbox TPM only support TPM_CAPABILITIES\n");
> -			return TPM2_RC_HANDLE;
> -		}
> -
>  		property = get_unaligned_be32(sent);
>  		sent += sizeof(property);
> -		property -= TPM2_PROPERTIES_OFFSET;
> -
>  		property_count = get_unaligned_be32(sent);
>  		sent += sizeof(property_count);
> -		if (!property_count ||
> -		    property + property_count > TPM2_PROPERTY_NB) {
> +
> +		switch (capability) {
> +		case TPM2_CAP_PCRS:
> +			break;
> +		case TPM2_CAP_TPM_PROPERTIES:
> +			if (!property_count) {
> +				rc = TPM2_RC_HANDLE;
> +				return sandbox_tpm2_fill_buf(recv, recv_len,
> +							     tag, rc);
> +			}
> +
> +			if (property > TPM2_PROPERTIES_OFFSET &&
> +			    ((property - TPM2_PROPERTIES_OFFSET) +
> +			     property_count > TPM2_PROPERTY_NB)) {
> +				rc = TPM2_RC_HANDLE;
> +				return sandbox_tpm2_fill_buf(recv, recv_len,
> +							     tag, rc);
> +			}
> +			break;
> +		default:
> +			printf("Sandbox TPM2 only supports TPM2_CAP_PCRS or "
> +			       "TPM2_CAP_TPM_PROPERTIES\n");
>  			rc = TPM2_RC_HANDLE;
>  			return sandbox_tpm2_fill_buf(recv, recv_len, tag, rc);
>  		}
> @@ -578,18 +587,53 @@ static int sandbox_tpm2_xfer(struct udevice *dev, const u8 *sendbuf,
>  		put_unaligned_be32(capability, recv);
>  		recv += sizeof(capability);
>
> -		/* Give the number of properties that follow */
> -		put_unaligned_be32(property_count, recv);
> -		recv += sizeof(property_count);
> -
> -		/* Fill with the properties */
> -		for (i = 0; i < property_count; i++) {
> -			put_unaligned_be32(TPM2_PROPERTIES_OFFSET + property +
> -					   i, recv);
> -			recv += sizeof(property);
> -			put_unaligned_be32(tpm->properties[property + i],
> -					   recv);
> -			recv += sizeof(property);
> +		switch (capability) {
> +		case TPM2_CAP_PCRS:
> +			/* Give the number of algorithms supported - just SHA256 */
> +			put_unaligned_be32(1, recv);
> +			recv += sizeof(u32);
> +
> +			/* Give SHA256 algorithm */
> +			put_unaligned_be16(TPM2_ALG_SHA256, recv);
> +			recv += sizeof(u16);
> +
> +			/* Select the PCRs supported */
> +			*recv = SANDBOX_TPM_PCR_SELECT_MAX;
> +			recv++;
> +
> +			/* Activate all the PCR bits */
> +			for (i = 0; i < SANDBOX_TPM_PCR_SELECT_MAX; ++i) {
> +				*recv = 0xff;
> +				recv++;
> +			}
> +			break;
> +		case TPM2_CAP_TPM_PROPERTIES:
> +			/* Give the number of properties that follow */
> +			put_unaligned_be32(property_count, recv);
> +			recv += sizeof(property_count);
> +
> +			/* Fill with the properties */
> +			for (i = 0; i < property_count; i++) {
> +				put_unaligned_be32(property + i, recv);
> +				recv += sizeof(property);
> +				if (property > TPM2_PROPERTIES_OFFSET) {
> +					val = tpm->properties[(property -
> +						TPM2_PROPERTIES_OFFSET) + i];
> +				} else {
> +					switch (property) {
> +					case TPM2_PT_PCR_COUNT:
> +						val = SANDBOX_TPM_PCR_NB;
> +						break;
> +					default:
> +						val = 0xffffffff;
> +						break;
> +					}
> +				}
> +
> +				put_unaligned_be32(val, recv);
> +				recv += sizeof(property);
> +			}
> +			break;
>  		}
>
>  		/* Add trailing \0 */
> --
> 2.31.1
>
Acked-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>



More information about the U-Boot mailing list