On Fri, Jun 28, 2024 at 04:18:56PM +0800, Gary Lin via Grub-devel wrote:
> As the prepartion to support TPM2 Software Stack (TSS2), this commit
> implements the TPM2 buffer handling functions to pack data for the TPM2
> commands and unpack the data from the response.
>
> Cc: Stefan Berger <stef...@linux.ibm.com>
> Signed-off-by: Hernan Gatta <hega...@linux.microsoft.com>
> Signed-off-by: Gary Lin <g...@suse.com>
> ---
>  grub-core/lib/tss2/buffer.c      | 149 +++++++++++++++++++++++++++++++
>  grub-core/lib/tss2/tss2_buffer.h |  66 ++++++++++++++
>  2 files changed, 215 insertions(+)
>  create mode 100644 grub-core/lib/tss2/buffer.c
>  create mode 100644 grub-core/lib/tss2/tss2_buffer.h
>
> diff --git a/grub-core/lib/tss2/buffer.c b/grub-core/lib/tss2/buffer.c
> new file mode 100644
> index 000000000..00a57b464
> --- /dev/null
> +++ b/grub-core/lib/tss2/buffer.c
> @@ -0,0 +1,149 @@
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2024 Free Software Foundation, Inc.
> + *  Copyright (C) 2022 Microsoft Corporation

Wrong order. The "Free Software Foundation" line should go behind the
"Microsoft Corporation".

> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#include <grub/misc.h>
> +
> +#include <tss2_buffer.h>
> +
> +void grub_tpm2_buffer_init (grub_tpm2_buffer_t buffer)
> +{
> +  grub_memset (buffer->data, 0, sizeof (buffer->data));
> +  buffer->size = 0;
> +  buffer->offset = 0;
> +  buffer->cap = sizeof (buffer->data);
> +  buffer->error = 0;
> +}
> +
> +void
> +grub_tpm2_buffer_pack (grub_tpm2_buffer_t buffer, const void* data,

s/void* data/void *data/

> +                    grub_size_t size)
> +{
> +  grub_uint32_t r = buffer->cap - buffer->size;
> +
> +  if (buffer->error)
> +    return;
> +
> +  if (size > r)
> +    {
> +      buffer->error = 1;
> +      return;
> +    }
> +
> +  grub_memcpy (&buffer->data[buffer->size], (void*) data, size);

s/void*/void */

> +  buffer->size += size;
> +}
> +
> +void
> +grub_tpm2_buffer_pack_u8 (grub_tpm2_buffer_t buffer, grub_uint8_t value)
> +{
> +  grub_tpm2_buffer_pack (buffer, (const char*) &value, sizeof (value));

s/const char*/const char */

Wait, why do you cast to "const char*" if the grub_tpm2_buffer_pack()
second argument is "const void *"? I think it should be changed. If yes
please fix similar problems everywhere.

> +}
> +
> +void
> +grub_tpm2_buffer_pack_u16 (grub_tpm2_buffer_t buffer, grub_uint16_t value)
> +{
> +  grub_uint16_t tmp = grub_cpu_to_be16 (value);
> +
> +  grub_tpm2_buffer_pack (buffer, (const char*) &tmp, sizeof (tmp));

Ditto and below please...

> +}
> +
> +void
> +grub_tpm2_buffer_pack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t value)
> +{
> +  grub_uint32_t tmp = grub_cpu_to_be32 (value);
> +
> +  grub_tpm2_buffer_pack (buffer, (const char*) &tmp, sizeof (tmp));
> +}
> +
> +void
> +grub_tpm2_buffer_unpack (grub_tpm2_buffer_t buffer, void* data,

s/void* data/void *data/

> +                      grub_size_t size)
> +{
> +  grub_uint32_t r = buffer->size - buffer->offset;
> +
> +  if (buffer->error)
> +    return;
> +
> +  if (size > r)
> +    {
> +      buffer->error = 1;
> +      return;
> +    }
> +
> +  grub_memcpy (data, &buffer->data[buffer->offset], size);
> +  buffer->offset += size;
> +}
> +
> +void
> +grub_tpm2_buffer_unpack_u8 (grub_tpm2_buffer_t buffer, grub_uint8_t* value)

Again, s/grub_uint8_t* value/grub_uint8_t *value/. Please fix similar issues 
everywhere...

> +{
> +  grub_uint32_t r = buffer->size - buffer->offset;
> +
> +  if (buffer->error)
> +    return;
> +
> +  if (sizeof (*value) > r)
> +    {
> +      buffer->error = 1;
> +      return;
> +    }
> +
> +  grub_memcpy (value, &buffer->data[buffer->offset], sizeof (*value));
> +  buffer->offset += sizeof (*value);
> +}
> +
> +void
> +grub_tpm2_buffer_unpack_u16 (grub_tpm2_buffer_t buffer, grub_uint16_t* value)
> +{
> +  grub_uint16_t tmp;
> +  grub_uint32_t r = buffer->size - buffer->offset;
> +
> +  if (buffer->error)
> +    return;
> +
> +  if (sizeof (tmp) > r)
> +    {
> +      buffer->error = 1;
> +      return;
> +    }
> +
> +  grub_memcpy (&tmp, &buffer->data[buffer->offset], sizeof (tmp));
> +  buffer->offset += sizeof (tmp);
> +  *value = grub_be_to_cpu16 (tmp);
> +}
> +
> +void
> +grub_tpm2_buffer_unpack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t* value)
> +{
> +  grub_uint32_t tmp;
> +  grub_uint32_t r = buffer->size - buffer->offset;
> +
> +  if (buffer->error)
> +    return;
> +
> +  if (sizeof (tmp) > r)
> +    {
> +      buffer->error = 1;
> +      return;
> +    }
> +
> +  grub_memcpy (&tmp, &buffer->data[buffer->offset], sizeof (tmp));
> +  buffer->offset += sizeof (tmp);
> +  *value = grub_be_to_cpu32 (tmp);
> +}
> diff --git a/grub-core/lib/tss2/tss2_buffer.h 
> b/grub-core/lib/tss2/tss2_buffer.h
> new file mode 100644
> index 000000000..92648a1cb
> --- /dev/null
> +++ b/grub-core/lib/tss2/tss2_buffer.h
> @@ -0,0 +1,66 @@
> +/*
> + *  GRUB  --  GRand Unified Bootloader
> + *  Copyright (C) 2024 Free Software Foundation, Inc.
> + *  Copyright (C) 2022 Microsoft Corporation

Again, wrong order...

> + *  GRUB is free software: you can redistribute it and/or modify
> + *  it under the terms of the GNU General Public License as published by
> + *  the Free Software Foundation, either version 3 of the License, or
> + *  (at your option) any later version.
> + *
> + *  GRUB is distributed in the hope that it will be useful,
> + *  but WITHOUT ANY WARRANTY; without even the implied warranty of
> + *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> + *  GNU General Public License for more details.
> + *
> + *  You should have received a copy of the GNU General Public License
> + *  along with GRUB.  If not, see <http://www.gnu.org/licenses/>.
> + */
> +
> +#ifndef GRUB_TPM2_BUFFER_HEADER
> +#define GRUB_TPM2_BUFFER_HEADER 1
> +
> +#include <grub/types.h>
> +
> +#define GRUB_TPM2_BUFFER_CAPACITY 4096
> +
> +struct grub_tpm2_buffer
> +{
> +  grub_uint8_t data[GRUB_TPM2_BUFFER_CAPACITY];
> +  grub_size_t size;
> +  grub_size_t offset;
> +  grub_size_t cap;
> +  grub_uint8_t error;
> +};
> +typedef struct grub_tpm2_buffer *grub_tpm2_buffer_t;
> +
> +void
> +grub_tpm2_buffer_init (grub_tpm2_buffer_t buffer);
> +
> +void
> +grub_tpm2_buffer_pack (grub_tpm2_buffer_t buffer, const void* data,
> +                    grub_size_t size);
> +
> +void
> +grub_tpm2_buffer_pack_u8 (grub_tpm2_buffer_t buffer, grub_uint8_t value);
> +
> +void
> +grub_tpm2_buffer_pack_u16 (grub_tpm2_buffer_t buffer, grub_uint16_t value);
> +
> +void
> +grub_tpm2_buffer_pack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t value);
> +
> +void
> +grub_tpm2_buffer_unpack (grub_tpm2_buffer_t buffer, void* data,
> +                      grub_size_t size);
> +
> +void
> +grub_tpm2_buffer_unpack_u8 (grub_tpm2_buffer_t buffer, grub_uint8_t* value);
> +
> +void
> +grub_tpm2_buffer_unpack_u16 (grub_tpm2_buffer_t buffer, grub_uint16_t* 
> value);
> +
> +void
> +grub_tpm2_buffer_unpack_u32 (grub_tpm2_buffer_t buffer, grub_uint32_t* 
> value);

Missing extern for all functions. Please fix it (in all patches).

If you fix all these minor issues you can add my RB to the patch.

Daniel

_______________________________________________
Grub-devel mailing list
Grub-devel@gnu.org
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to