Commit d926ee92 authored by Jarkko Sakkinen's avatar Jarkko Sakkinen

tpm: TPM2B formatted buffers

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: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
Reviewed-by: default avatarStefan Berger <stefanb@linux.ibm.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Tested-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
parent e1b72e1b
...@@ -47,6 +47,36 @@ void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal) ...@@ -47,6 +47,36 @@ void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal)
} }
EXPORT_SYMBOL_GPL(tpm_buf_reset); 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) void tpm_buf_destroy(struct tpm_buf *buf)
{ {
free_page((unsigned long)buf->data); free_page((unsigned long)buf->data);
...@@ -73,8 +103,6 @@ EXPORT_SYMBOL_GPL(tpm_buf_length); ...@@ -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) 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. */ /* Return silently if overflow has already happened. */
if (buf->flags & TPM_BUF_OVERFLOW) if (buf->flags & TPM_BUF_OVERFLOW)
return; return;
...@@ -87,7 +115,11 @@ void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length) ...@@ -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); memcpy(&buf->data[buf->length], new_data, new_length);
buf->length += 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); EXPORT_SYMBOL_GPL(tpm_buf_append);
......
...@@ -300,6 +300,8 @@ struct tpm_header { ...@@ -300,6 +300,8 @@ struct tpm_header {
enum tpm_buf_flags { enum tpm_buf_flags {
/* the capacity exceeded: */ /* the capacity exceeded: */
TPM_BUF_OVERFLOW = BIT(0), TPM_BUF_OVERFLOW = BIT(0),
/* TPM2B format: */
TPM_BUF_TPM2B = BIT(1),
}; };
/* /*
...@@ -328,6 +330,8 @@ struct tpm2_hash { ...@@ -328,6 +330,8 @@ struct tpm2_hash {
int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal); int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal);
void tpm_buf_reset(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); void tpm_buf_destroy(struct tpm_buf *buf);
u32 tpm_buf_length(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); void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment