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>
This commit is contained in:
parent
e1b72e1b11
commit
d926ee92e8
@ -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);
|
|||||||
*/
|
*/
|
||||||
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)
|
|||||||
|
|
||||||
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 {
|
|||||||
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 {
|
|||||||
|
|
||||||
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);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user