lkml.org 
[lkml]   [2023]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    SubjectRe: [PATCH v6 6/8] tpm: TPM2B formatted buffers
    From


    On 11/23/23 21:02, Jarkko Sakkinen wrote:
    > Declare tpm_buf_init_sized() and tpm_buf_reset_sized() for creating TPM2B
    > formatted buffers. These buffers are also known as sized buffers in the
    > specifications and literature.
    >
    > Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>

    Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>

    > ---
    > v2: [2021-11-21] Refine the API according to the comments for
    > https://lore.kernel.org/linux-integrity/20231024011531.442587-5-jarkko@kernel.org/
    > ---
    > drivers/char/tpm/tpm-buf.c | 38 +++++++++++++++++++++++++++++++++++---
    > include/linux/tpm.h | 4 ++++
    > 2 files changed, 39 insertions(+), 3 deletions(-)
    >
    > diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c
    > index 3f39893f3bb1..099b4a56c5d5 100644
    > --- a/drivers/char/tpm/tpm-buf.c
    > +++ b/drivers/char/tpm/tpm-buf.c
    > @@ -47,6 +47,36 @@ void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal)
    > }
    > EXPORT_SYMBOL_GPL(tpm_buf_reset);
    >
    > +/**
    > + * tpm_buf_init_sized() - Allocate and initialize a sized (TPM2B) buffer
    > + * @buf: A @tpm_buf
    > + *
    > + * Return: 0 or -ENOMEM
    > + */
    > +int tpm_buf_init_sized(struct tpm_buf *buf)
    > +{
    > + buf->data = (u8 *)__get_free_page(GFP_KERNEL);
    > + if (!buf->data)
    > + return -ENOMEM;
    > +
    > + tpm_buf_reset_sized(buf);
    > + return 0;
    > +}
    > +EXPORT_SYMBOL_GPL(tpm_buf_init_sized);
    > +
    > +/**
    > + * tpm_buf_reset_sized() - Initialize a sized buffer
    > + * @buf: A &tpm_buf
    > + */
    > +void tpm_buf_reset_sized(struct tpm_buf *buf)
    > +{
    > + buf->flags = TPM_BUF_TPM2B;
    > + buf->length = 2;
    > + buf->data[0] = 0;
    > + buf->data[1] = 0;
    > +}
    > +EXPORT_SYMBOL_GPL(tpm_buf_reset_sized);
    > +
    > void tpm_buf_destroy(struct tpm_buf *buf)
    > {
    > free_page((unsigned long)buf->data);
    > @@ -72,8 +102,6 @@ EXPORT_SYMBOL_GPL(tpm_buf_length);
    > */
    > void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length)
    > {
    > - struct tpm_header *head = (struct tpm_header *)buf->data;
    > -
    > /* Return silently if overflow has already happened. */
    > if (buf->flags & TPM_BUF_OVERFLOW)
    > return;
    > @@ -86,7 +114,11 @@ void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length)
    >
    > memcpy(&buf->data[buf->length], new_data, new_length);
    > buf->length += new_length;
    > - head->length = cpu_to_be32(buf->length);
    > +
    > + if (buf->flags & TPM_BUF_TPM2B)
    > + ((__be16 *)buf->data)[0] = cpu_to_be16(buf->length - 2);
    > + else
    > + ((struct tpm_header *)buf->data)->length = cpu_to_be32(buf->length);
    > }
    > EXPORT_SYMBOL_GPL(tpm_buf_append);
    >
    > diff --git a/include/linux/tpm.h b/include/linux/tpm.h
    > index 1d7b39b5c383..715db4a91c1f 100644
    > --- a/include/linux/tpm.h
    > +++ b/include/linux/tpm.h
    > @@ -300,6 +300,8 @@ struct tpm_header {
    > enum tpm_buf_flags {
    > /* the capacity exceeded: */
    > TPM_BUF_OVERFLOW = BIT(0),
    > + /* TPM2B format: */
    > + TPM_BUF_TPM2B = BIT(1),
    > };
    >
    > /*
    > @@ -328,6 +330,8 @@ struct tpm2_hash {
    >
    > int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal);
    > void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal);
    > +int tpm_buf_init_sized(struct tpm_buf *buf);
    > +void tpm_buf_reset_sized(struct tpm_buf *buf);
    > void tpm_buf_destroy(struct tpm_buf *buf);
    > u32 tpm_buf_length(struct tpm_buf *buf);
    > void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length);

    \
     
     \ /
      Last update: 2023-11-27 22:09    [W:8.950 / U:3.528 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site