Skip to content

Commit d926ee9

Browse files
committed
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: 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>
1 parent e1b72e1 commit d926ee9

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

drivers/char/tpm/tpm-buf.c

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,36 @@ void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal)
4747
}
4848
EXPORT_SYMBOL_GPL(tpm_buf_reset);
4949

50+
/**
51+
* tpm_buf_init_sized() - Allocate and initialize a sized (TPM2B) buffer
52+
* @buf: A @tpm_buf
53+
*
54+
* Return: 0 or -ENOMEM
55+
*/
56+
int tpm_buf_init_sized(struct tpm_buf *buf)
57+
{
58+
buf->data = (u8 *)__get_free_page(GFP_KERNEL);
59+
if (!buf->data)
60+
return -ENOMEM;
61+
62+
tpm_buf_reset_sized(buf);
63+
return 0;
64+
}
65+
EXPORT_SYMBOL_GPL(tpm_buf_init_sized);
66+
67+
/**
68+
* tpm_buf_reset_sized() - Initialize a sized buffer
69+
* @buf: A &tpm_buf
70+
*/
71+
void tpm_buf_reset_sized(struct tpm_buf *buf)
72+
{
73+
buf->flags = TPM_BUF_TPM2B;
74+
buf->length = 2;
75+
buf->data[0] = 0;
76+
buf->data[1] = 0;
77+
}
78+
EXPORT_SYMBOL_GPL(tpm_buf_reset_sized);
79+
5080
void tpm_buf_destroy(struct tpm_buf *buf)
5181
{
5282
free_page((unsigned long)buf->data);
@@ -73,8 +103,6 @@ EXPORT_SYMBOL_GPL(tpm_buf_length);
73103
*/
74104
void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length)
75105
{
76-
struct tpm_header *head = (struct tpm_header *)buf->data;
77-
78106
/* Return silently if overflow has already happened. */
79107
if (buf->flags & TPM_BUF_OVERFLOW)
80108
return;
@@ -87,7 +115,11 @@ void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length)
87115

88116
memcpy(&buf->data[buf->length], new_data, new_length);
89117
buf->length += new_length;
90-
head->length = cpu_to_be32(buf->length);
118+
119+
if (buf->flags & TPM_BUF_TPM2B)
120+
((__be16 *)buf->data)[0] = cpu_to_be16(buf->length - 2);
121+
else
122+
((struct tpm_header *)buf->data)->length = cpu_to_be32(buf->length);
91123
}
92124
EXPORT_SYMBOL_GPL(tpm_buf_append);
93125

include/linux/tpm.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,8 @@ struct tpm_header {
300300
enum tpm_buf_flags {
301301
/* the capacity exceeded: */
302302
TPM_BUF_OVERFLOW = BIT(0),
303+
/* TPM2B format: */
304+
TPM_BUF_TPM2B = BIT(1),
303305
};
304306

305307
/*
@@ -328,6 +330,8 @@ struct tpm2_hash {
328330

329331
int tpm_buf_init(struct tpm_buf *buf, u16 tag, u32 ordinal);
330332
void tpm_buf_reset(struct tpm_buf *buf, u16 tag, u32 ordinal);
333+
int tpm_buf_init_sized(struct tpm_buf *buf);
334+
void tpm_buf_reset_sized(struct tpm_buf *buf);
331335
void tpm_buf_destroy(struct tpm_buf *buf);
332336
u32 tpm_buf_length(struct tpm_buf *buf);
333337
void tpm_buf_append(struct tpm_buf *buf, const u8 *new_data, u16 new_length);

0 commit comments

Comments
 (0)