]> www.infradead.org Git - users/hch/block.git/commitdiff
tpm: TPM2B formatted buffers
authorJarkko Sakkinen <jarkko@kernel.org>
Mon, 29 Apr 2024 20:27:55 +0000 (16:27 -0400)
committerJarkko Sakkinen <jarkko@kernel.org>
Thu, 9 May 2024 19:30:51 +0000 (22:30 +0300)
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: James Bottomley <James.Bottomley@HansenPartnership.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Tested-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
drivers/char/tpm/tpm-buf.c
include/linux/tpm.h

index 2f2710ca6f6d1dd31d3dde26d1305f4e77beecbb..d679dc1cecc7958fc22d8e0e239bdbf361fa9e54 100644 (file)
@@ -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);
@@ -73,8 +103,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;
@@ -87,7 +115,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);
 
index 1d7b39b5c383accc9abf7196529235c50c107408..715db4a91c1f91f3fec6ce9b8fd188060ee432ef 100644 (file)
@@ -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);