tpm: TPM2B formatted buffers
[linux-2.6-block.git] / drivers / char / tpm / tpm-buf.c
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);