Re: [PATCH v6 10/20] tpm: add buffer function to point to returned parameters

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Tue Jan 2, 2024 at 7:03 PM EET, James Bottomley wrote:
> Replace all instances of &buf.data[TPM_HEADER_SIZE] with a new
> function tpm_buf_parameters() because encryption sessions change
> where the return parameters are located in the buffer since if a
> return session is present they're 4 bytes beyond the header with those
> 4 bytes giving the parameter length.  If there is no return session,
> then they're in the usual place immediately after the header.
>
> Signed-off-by: James Bottomley <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx>
> Reviewed-by: Stefan Berger <stefanb@xxxxxxxxxxxxx>
>
> ---
> v4: add kdoc
> v5: update kdoc add review
> ---
>  drivers/char/tpm/tpm-buf.c | 28 ++++++++++++++++++++++++++++
>  include/linux/tpm.h        |  2 ++
>  2 files changed, 30 insertions(+)
>
> diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c
> index 32619e9ab4fa..bb81180495d1 100644
> --- a/drivers/char/tpm/tpm-buf.c
> +++ b/drivers/char/tpm/tpm-buf.c
> @@ -220,3 +220,31 @@ u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset)
>  	return be32_to_cpu(value);
>  }
>  EXPORT_SYMBOL_GPL(tpm_buf_read_u32);
> +
> +static u16 tpm_buf_tag(struct tpm_buf *buf)
> +{
> +	struct tpm_header *head = (struct tpm_header *)buf->data;
> +
> +	return be16_to_cpu(head->tag);
> +}
> +
> +/**
> + * tpm_buf_parameters - return the TPM response parameters area of the tpm_buf
> + * @buf: tpm_buf to use
> + *
> + * Where the parameters are located depends on the tag of a TPM
> + * command (it's immediately after the header for TPM_ST_NO_SESSIONS
> + * or 4 bytes after for TPM_ST_SESSIONS). Evaluate this and return a
> + * pointer to the first byte of the parameters area.
> + *
> + * @return: pointer to parameters area
> + */
> +u8 *tpm_buf_parameters(struct tpm_buf *buf)

Not sure about the name but neither have any better suggestion. It
will do.

> +{
> +	int offset = TPM_HEADER_SIZE;
> +
> +	if (tpm_buf_tag(buf) == TPM2_ST_SESSIONS)
> +		offset += 4;
> +
> +	return &buf->data[offset];
> +}
> diff --git a/include/linux/tpm.h b/include/linux/tpm.h
> index e8172f81c562..6be263509e81 100644
> --- a/include/linux/tpm.h
> +++ b/include/linux/tpm.h
> @@ -344,6 +344,8 @@ u8 tpm_buf_read_u8(struct tpm_buf *buf, off_t *offset);
>  u16 tpm_buf_read_u16(struct tpm_buf *buf, off_t *offset);
>  u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset);
>  
> +u8 *tpm_buf_parameters(struct tpm_buf *buf);
> +
>  /*
>   * Check if TPM device is in the firmware upgrade mode.
>   */

Reviewed-by: Jarkko Sakkinen <jarkko@xxxxxxxxxx>

BR, Jarkko





[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux Kernel]     [Linux Kernel Hardening]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux SCSI]

  Powered by Linux