Commit 11189d68 authored by James Bottomley's avatar James Bottomley Committed by Jarkko Sakkinen
Browse files

tpm: add buffer function to point to returned parameters



Replace all instances of &buf.data[TPM_HEADER_SIZE] with a new
function tpm_buf_parameters() because encryption sessions change
where the return parameters are located in the buffer since if a
return session is present they're 4 bytes beyond the header with those
4 bytes giving the parameter length.  If there is no return session,
then they're in the usual place immediately after the header.

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 f1354404
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -221,3 +221,31 @@ u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset)
	return be32_to_cpu(value);
}
EXPORT_SYMBOL_GPL(tpm_buf_read_u32);

static u16 tpm_buf_tag(struct tpm_buf *buf)
{
	struct tpm_header *head = (struct tpm_header *)buf->data;

	return be16_to_cpu(head->tag);
}

/**
 * tpm_buf_parameters - return the TPM response parameters area of the tpm_buf
 * @buf: tpm_buf to use
 *
 * Where the parameters are located depends on the tag of a TPM
 * command (it's immediately after the header for TPM_ST_NO_SESSIONS
 * or 4 bytes after for TPM_ST_SESSIONS). Evaluate this and return a
 * pointer to the first byte of the parameters area.
 *
 * @return: pointer to parameters area
 */
u8 *tpm_buf_parameters(struct tpm_buf *buf)
{
	int offset = TPM_HEADER_SIZE;

	if (tpm_buf_tag(buf) == TPM2_ST_SESSIONS)
		offset += 4;

	return &buf->data[offset];
}
+2 −0
Original line number Diff line number Diff line
@@ -344,6 +344,8 @@ u8 tpm_buf_read_u8(struct tpm_buf *buf, off_t *offset);
u16 tpm_buf_read_u16(struct tpm_buf *buf, off_t *offset);
u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset);

u8 *tpm_buf_parameters(struct tpm_buf *buf);

/*
 * Check if TPM device is in the firmware upgrade mode.
 */