Commit e0cce98f authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'tpmdd-next-6.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd

Pull tpm fixes from Jarkko Sakkinen:
 "This fixes two unaddressed review comments for the HMAC encryption
  patch set. They are cosmetic but we are better off, if such
  unnecessary glitches do not exist in the release.

  The important part is enabling the HMAC encryption by default only on
  x86-64 because that is the only sufficiently tested arch.

  Finally, there is a bug fix for SPI transfer buffer allocation, which
  did not take into account the SPI header size"

* tag 'tpmdd-next-6.10-rc2' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd:
  tpm: Enable TCG_TPM2_HMAC by default only for X86_64
  tpm: Rename TPM2_OA_TMPL to TPM2_OA_NULL_KEY and make it local
  tpm: Open code tpm_buf_parameters()
  tpm_tis_spi: Account for SPI header when allocating TPM SPI xfer buffer
parents 8d6bc6a2 d3e43a8f
...@@ -29,7 +29,7 @@ if TCG_TPM ...@@ -29,7 +29,7 @@ if TCG_TPM
config TCG_TPM2_HMAC config TCG_TPM2_HMAC
bool "Use HMAC and encrypted transactions on the TPM bus" bool "Use HMAC and encrypted transactions on the TPM bus"
default y default X86_64
select CRYPTO_ECDH select CRYPTO_ECDH
select CRYPTO_LIB_AESCFB select CRYPTO_LIB_AESCFB
select CRYPTO_LIB_SHA256 select CRYPTO_LIB_SHA256
......
...@@ -223,30 +223,4 @@ u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset) ...@@ -223,30 +223,4 @@ u32 tpm_buf_read_u32(struct tpm_buf *buf, off_t *offset)
} }
EXPORT_SYMBOL_GPL(tpm_buf_read_u32); 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];
}
...@@ -281,6 +281,7 @@ struct tpm2_get_random_out { ...@@ -281,6 +281,7 @@ struct tpm2_get_random_out {
int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max)
{ {
struct tpm2_get_random_out *out; struct tpm2_get_random_out *out;
struct tpm_header *head;
struct tpm_buf buf; struct tpm_buf buf;
u32 recd; u32 recd;
u32 num_bytes = max; u32 num_bytes = max;
...@@ -288,6 +289,7 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) ...@@ -288,6 +289,7 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max)
int total = 0; int total = 0;
int retries = 5; int retries = 5;
u8 *dest_ptr = dest; u8 *dest_ptr = dest;
off_t offset;
if (!num_bytes || max > TPM_MAX_RNG_DATA) if (!num_bytes || max > TPM_MAX_RNG_DATA)
return -EINVAL; return -EINVAL;
...@@ -320,7 +322,13 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max) ...@@ -320,7 +322,13 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max)
goto out; goto out;
} }
out = (struct tpm2_get_random_out *)tpm_buf_parameters(&buf); head = (struct tpm_header *)buf.data;
offset = TPM_HEADER_SIZE;
/* Skip the parameter size field: */
if (be16_to_cpu(head->tag) == TPM2_ST_SESSIONS)
offset += 4;
out = (struct tpm2_get_random_out *)&buf.data[offset];
recd = min_t(u32, be16_to_cpu(out->size), num_bytes); recd = min_t(u32, be16_to_cpu(out->size), num_bytes);
if (tpm_buf_length(&buf) < if (tpm_buf_length(&buf) <
TPM_HEADER_SIZE + TPM_HEADER_SIZE +
......
...@@ -80,6 +80,9 @@ ...@@ -80,6 +80,9 @@
/* maximum number of names the TPM must remember for authorization */ /* maximum number of names the TPM must remember for authorization */
#define AUTH_MAX_NAMES 3 #define AUTH_MAX_NAMES 3
#define AES_KEY_BYTES AES_KEYSIZE_128
#define AES_KEY_BITS (AES_KEY_BYTES*8)
static int tpm2_create_primary(struct tpm_chip *chip, u32 hierarchy, static int tpm2_create_primary(struct tpm_chip *chip, u32 hierarchy,
u32 *handle, u8 *name); u32 *handle, u8 *name);
...@@ -954,6 +957,20 @@ int tpm2_start_auth_session(struct tpm_chip *chip) ...@@ -954,6 +957,20 @@ int tpm2_start_auth_session(struct tpm_chip *chip)
} }
EXPORT_SYMBOL(tpm2_start_auth_session); EXPORT_SYMBOL(tpm2_start_auth_session);
/*
* A mask containing the object attributes for the kernel held null primary key
* used in HMAC encryption. For more information on specific attributes look up
* to "8.3 TPMA_OBJECT (Object Attributes)".
*/
#define TPM2_OA_NULL_KEY ( \
TPM2_OA_NO_DA | \
TPM2_OA_FIXED_TPM | \
TPM2_OA_FIXED_PARENT | \
TPM2_OA_SENSITIVE_DATA_ORIGIN | \
TPM2_OA_USER_WITH_AUTH | \
TPM2_OA_DECRYPT | \
TPM2_OA_RESTRICTED)
/** /**
* tpm2_parse_create_primary() - parse the data returned from TPM_CC_CREATE_PRIMARY * tpm2_parse_create_primary() - parse the data returned from TPM_CC_CREATE_PRIMARY
* *
...@@ -1018,7 +1035,7 @@ static int tpm2_parse_create_primary(struct tpm_chip *chip, struct tpm_buf *buf, ...@@ -1018,7 +1035,7 @@ static int tpm2_parse_create_primary(struct tpm_chip *chip, struct tpm_buf *buf,
val = tpm_buf_read_u32(buf, &offset_t); val = tpm_buf_read_u32(buf, &offset_t);
/* object properties */ /* object properties */
if (val != TPM2_OA_TMPL) if (val != TPM2_OA_NULL_KEY)
return -EINVAL; return -EINVAL;
/* auth policy (empty) */ /* auth policy (empty) */
...@@ -1178,7 +1195,7 @@ static int tpm2_create_primary(struct tpm_chip *chip, u32 hierarchy, ...@@ -1178,7 +1195,7 @@ static int tpm2_create_primary(struct tpm_chip *chip, u32 hierarchy,
tpm_buf_append_u16(&template, TPM_ALG_SHA256); tpm_buf_append_u16(&template, TPM_ALG_SHA256);
/* object properties */ /* object properties */
tpm_buf_append_u32(&template, TPM2_OA_TMPL); tpm_buf_append_u32(&template, TPM2_OA_NULL_KEY);
/* sauth policy (empty) */ /* sauth policy (empty) */
tpm_buf_append_u16(&template, 0); tpm_buf_append_u16(&template, 0);
......
...@@ -37,6 +37,7 @@ ...@@ -37,6 +37,7 @@
#include "tpm_tis_spi.h" #include "tpm_tis_spi.h"
#define MAX_SPI_FRAMESIZE 64 #define MAX_SPI_FRAMESIZE 64
#define SPI_HDRSIZE 4
/* /*
* TCG SPI flow control is documented in section 6.4 of the spec[1]. In short, * TCG SPI flow control is documented in section 6.4 of the spec[1]. In short,
...@@ -247,7 +248,7 @@ static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr, ...@@ -247,7 +248,7 @@ static int tpm_tis_spi_write_bytes(struct tpm_tis_data *data, u32 addr,
int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy, int tpm_tis_spi_init(struct spi_device *spi, struct tpm_tis_spi_phy *phy,
int irq, const struct tpm_tis_phy_ops *phy_ops) int irq, const struct tpm_tis_phy_ops *phy_ops)
{ {
phy->iobuf = devm_kmalloc(&spi->dev, MAX_SPI_FRAMESIZE, GFP_KERNEL); phy->iobuf = devm_kmalloc(&spi->dev, SPI_HDRSIZE + MAX_SPI_FRAMESIZE, GFP_KERNEL);
if (!phy->iobuf) if (!phy->iobuf)
return -ENOMEM; return -ENOMEM;
......
...@@ -394,21 +394,6 @@ enum tpm2_object_attributes { ...@@ -394,21 +394,6 @@ enum tpm2_object_attributes {
TPM2_OA_SIGN = BIT(18), TPM2_OA_SIGN = BIT(18),
}; };
/*
* definitions for the canonical template. These are mandated
* by the TCG key template documents
*/
#define AES_KEY_BYTES AES_KEYSIZE_128
#define AES_KEY_BITS (AES_KEY_BYTES*8)
#define TPM2_OA_TMPL (TPM2_OA_NO_DA | \
TPM2_OA_FIXED_TPM | \
TPM2_OA_FIXED_PARENT | \
TPM2_OA_SENSITIVE_DATA_ORIGIN | \
TPM2_OA_USER_WITH_AUTH | \
TPM2_OA_DECRYPT | \
TPM2_OA_RESTRICTED)
enum tpm2_session_attributes { enum tpm2_session_attributes {
TPM2_SA_CONTINUE_SESSION = BIT(0), TPM2_SA_CONTINUE_SESSION = BIT(0),
TPM2_SA_AUDIT_EXCLUSIVE = BIT(1), TPM2_SA_AUDIT_EXCLUSIVE = BIT(1),
...@@ -437,8 +422,6 @@ u8 tpm_buf_read_u8(struct tpm_buf *buf, off_t *offset); ...@@ -437,8 +422,6 @@ u8 tpm_buf_read_u8(struct tpm_buf *buf, off_t *offset);
u16 tpm_buf_read_u16(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); 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. * Check if TPM device is in the firmware upgrade mode.
*/ */
......
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