diff options
| -rw-r--r-- | drivers/char/tpm/tpm-buf.c | 28 | ||||
| -rw-r--r-- | include/linux/tpm.h | 2 | 
2 files changed, 30 insertions, 0 deletions
| diff --git a/drivers/char/tpm/tpm-buf.c b/drivers/char/tpm/tpm-buf.c index cc14fa3fd8c2..6e4595cc98bc 100644 --- a/drivers/char/tpm/tpm-buf.c +++ b/drivers/char/tpm/tpm-buf.c @@ -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]; +} diff --git a/include/linux/tpm.h b/include/linux/tpm.h index e8172f81c562..6be263509e81 100644 --- a/include/linux/tpm.h +++ b/include/linux/tpm.h @@ -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.   */ | 
