On Tue, Dec 09, 2025 at 09:39:02AM +0200, Jarkko Sakkinen wrote:
> Since the number of handles is fixed to a single handle, eliminate all uses
> of buf->handles and deduce values during compile-time.
> 
> Signed-off-by: Jarkko Sakkinen <[email protected]>
> ---
>  drivers/char/tpm/tpm-buf.c                | 25 -----------------------
>  drivers/char/tpm/tpm2-cmd.c               |  4 ++--
>  drivers/char/tpm/tpm2-sessions.c          |  4 ++--
>  include/linux/tpm.h                       |  1 -
>  security/keys/trusted-keys/trusted_tpm2.c |  2 +-
>  5 files changed, 5 insertions(+), 31 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c
> index 73be8a87b472..752c69b8a4f5 100644
> --- a/drivers/char/tpm/tpm-buf.c
> +++ b/drivers/char/tpm/tpm-buf.c
> @@ -40,7 +40,6 @@ static void __tpm_buf_reset(struct tpm_buf *buf, u16 
> buf_size, u16 tag, u32 ordi
>       buf->flags = 0;
>       buf->length = sizeof(*head);
>       buf->capacity = buf_size - sizeof(*buf);
> -     buf->handles = 0;
>       head->tag = cpu_to_be16(tag);
>       head->length = cpu_to_be32(sizeof(*head));
>       head->ordinal = cpu_to_be32(ordinal);
> @@ -56,7 +55,6 @@ static void __tpm_buf_reset_sized(struct tpm_buf *buf, u16 
> buf_size)
>       buf->flags = TPM_BUF_TPM2B;
>       buf->length = 2;
>       buf->capacity = buf_size - sizeof(*buf);
> -     buf->handles = 0;
>       buf->data[0] = 0;
>       buf->data[1] = 0;
>  }
> @@ -177,29 +175,6 @@ void tpm_buf_append_u32(struct tpm_buf *buf, const u32 
> value)
>  }
>  EXPORT_SYMBOL_GPL(tpm_buf_append_u32);
>  
> -/**
> - * tpm_buf_append_handle() - Add a handle
> - * @buf:     &tpm_buf instance
> - * @handle:  a TPM object handle
> - *
> - * Add a handle to the buffer, and increase the count tracking the number of
> - * handles in the command buffer. Works only for command buffers.
> - */
> -void tpm_buf_append_handle(struct tpm_buf *buf, u32 handle)
> -{
> -     if (buf->flags & TPM_BUF_INVALID)
> -             return;
> -
> -     if (buf->flags & TPM_BUF_TPM2B) {
> -             WARN(1, "tpm-buf: invalid type: TPM2B\n");
> -             buf->flags |= TPM_BUF_INVALID;
> -             return;
> -     }
> -
> -     tpm_buf_append_u32(buf, handle);
> -     buf->handles++;
> -}
> -
>  /**
>   * tpm_buf_read() - Read from a TPM buffer
>   * @buf:     &tpm_buf instance
> diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
> index 5b04e74b6377..d14e249831c7 100644
> --- a/drivers/char/tpm/tpm2-cmd.c
> +++ b/drivers/char/tpm/tpm2-cmd.c
> @@ -205,7 +205,7 @@ int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx,
>                       return rc;
>               tpm_buf_append_hmac_session(chip, buf, 0, NULL, 0);
>       } else {
> -             tpm_buf_append_handle(buf, pcr_idx);
> +             tpm_buf_append_u32(buf, pcr_idx);
>               tpm_buf_append_auth(chip, buf, NULL, 0);
>       }
>  
> @@ -281,7 +281,7 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, 
> size_t max)
>                                                   TPM2_SA_CONTINUE_SESSION,
>                                                   NULL, 0);
>               } else  {
> -                     offset = buf->handles * 4 + TPM_HEADER_SIZE;
> +                     offset = TPM_HEADER_SIZE + sizeof(u32);
>                       head = (struct tpm_header *)buf->data;
>                       if (tpm_buf_length(buf) == offset)
>                               head->tag = cpu_to_be16(TPM2_ST_NO_SESSIONS);
> diff --git a/drivers/char/tpm/tpm2-sessions.c 
> b/drivers/char/tpm/tpm2-sessions.c
> index 62a200ae72d7..dfd1abe673bc 100644
> --- a/drivers/char/tpm/tpm2-sessions.c
> +++ b/drivers/char/tpm/tpm2-sessions.c
> @@ -261,7 +261,7 @@ int tpm_buf_append_name(struct tpm_chip *chip, struct 
> tpm_buf *buf,
>       }
>  
>       if (!tpm2_chip_auth(chip)) {
> -             tpm_buf_append_handle(buf, handle);
> +             tpm_buf_append_u32(buf, handle);
>               return 0;
>       }
>  
> @@ -289,7 +289,7 @@ void tpm_buf_append_auth(struct tpm_chip *chip, struct 
> tpm_buf *buf,
>                        u8 *passphrase, int passphrase_len)
>  {
>       /* offset tells us where the sessions area begins */
> -     int offset = buf->handles * 4 + TPM_HEADER_SIZE;
> +     int offset = TPM_HEADER_SIZE + sizeof(u32);
>       u32 len = 9 + passphrase_len;
>  
>       if (tpm_buf_length(buf) != offset) {
> diff --git a/include/linux/tpm.h b/include/linux/tpm.h
> index db716841973f..e20647cc0a0f 100644
> --- a/include/linux/tpm.h
> +++ b/include/linux/tpm.h
> @@ -437,7 +437,6 @@ void tpm_buf_append_u32(struct tpm_buf *buf, const u32 
> value);
>  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);
> -void tpm_buf_append_handle(struct tpm_buf *buf, u32 handle);
>  
>  /*
>   * Check if TPM device is in the firmware upgrade mode.
> diff --git a/security/keys/trusted-keys/trusted_tpm2.c 
> b/security/keys/trusted-keys/trusted_tpm2.c
> index 7756aa839d81..0a07a18da2ed 100644
> --- a/security/keys/trusted-keys/trusted_tpm2.c
> +++ b/security/keys/trusted-keys/trusted_tpm2.c
> @@ -495,7 +495,7 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip,
>               if (tpm2_chip_auth(chip)) {
>                       tpm_buf_append_hmac_session(chip, buf, TPM2_SA_ENCRYPT, 
> NULL, 0);
>               } else  {
> -                     offset = buf->handles * 4 + TPM_HEADER_SIZE;
> +                     offset = TPM_HEADER_SIZE + sizeof(u32);

Maybe it would be sensible to define:

/*
 * Offset of the authorization area of a TPM command with a single
 * handle.
 */
#define TPM2_AUTH_OFFSET        (TPM_HEADER_SIZE + sizeof(u32))

This would overall clarify how this code works.

>                       head = (struct tpm_header *)buf->data;
>                       if (tpm_buf_length(buf) == offset)
>                               head->tag = cpu_to_be16(TPM2_ST_NO_SESSIONS);
> -- 
> 2.52.0
> 

BR, Jarkko

Reply via email to