mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 04:33:26 +02:00
Merge tag 'tpmdd-next-v5.12-rc1-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd
Pull tpm updates from Jarkko Sakkinen: "New features: - Cr50 I2C TPM driver - sysfs exports of PCR registers in TPM 2.0 chips Bug fixes: - bug fixes for tpm_tis driver, which had a racy wait for hardware state change to be ready to send a command to the TPM chip. The bug has existed already since 2006, but has only made itself known in recent past. This is the same as the "last time" :-) - Otherwise there's bunch of fixes for not as alarming regressions. I think the list is about the same as last time, except I added fixes for some disjoint bugs in trusted keys that I found some time ago" * tag 'tpmdd-next-v5.12-rc1-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/jarkko/linux-tpmdd: KEYS: trusted: Reserve TPM for seal and unseal operations KEYS: trusted: Fix migratable=1 failing KEYS: trusted: Fix incorrect handling of tpm_get_random() tpm/ppi: Constify static struct attribute_group ABI: add sysfs description for tpm exports of PCR registers tpm: add sysfs exports for all banks of PCR registers keys: Update comment for restrict_link_by_key_or_keyring_chain tpm: Remove tpm_dev_wq_lock char: tpm: add i2c driver for cr50 tpm: Fix fall-through warnings for Clang tpm_tis: Clean up locality release tpm_tis: Fix check_locality for correct locality acquisition
This commit is contained in:
@@ -403,9 +403,12 @@ static int osap(struct tpm_buf *tb, struct osapsess *s,
|
||||
int ret;
|
||||
|
||||
ret = tpm_get_random(chip, ononce, TPM_NONCE_SIZE);
|
||||
if (ret != TPM_NONCE_SIZE)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (ret != TPM_NONCE_SIZE)
|
||||
return -EIO;
|
||||
|
||||
tpm_buf_reset(tb, TPM_TAG_RQU_COMMAND, TPM_ORD_OSAP);
|
||||
tpm_buf_append_u16(tb, type);
|
||||
tpm_buf_append_u32(tb, handle);
|
||||
@@ -496,8 +499,12 @@ static int tpm_seal(struct tpm_buf *tb, uint16_t keytype,
|
||||
goto out;
|
||||
|
||||
ret = tpm_get_random(chip, td->nonceodd, TPM_NONCE_SIZE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (ret != TPM_NONCE_SIZE)
|
||||
goto out;
|
||||
return -EIO;
|
||||
|
||||
ordinal = htonl(TPM_ORD_SEAL);
|
||||
datsize = htonl(datalen);
|
||||
pcrsize = htonl(pcrinfosize);
|
||||
@@ -601,9 +608,12 @@ static int tpm_unseal(struct tpm_buf *tb,
|
||||
|
||||
ordinal = htonl(TPM_ORD_UNSEAL);
|
||||
ret = tpm_get_random(chip, nonceodd, TPM_NONCE_SIZE);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (ret != TPM_NONCE_SIZE) {
|
||||
pr_info("trusted_key: tpm_get_random failed (%d)\n", ret);
|
||||
return ret;
|
||||
return -EIO;
|
||||
}
|
||||
ret = TSS_authhmac(authdata1, keyauth, TPM_NONCE_SIZE,
|
||||
enonce1, nonceodd, cont, sizeof(uint32_t),
|
||||
@@ -791,7 +801,7 @@ static int getoptions(char *c, struct trusted_key_payload *pay,
|
||||
case Opt_migratable:
|
||||
if (*args[0].from == '0')
|
||||
pay->migratable = 0;
|
||||
else
|
||||
else if (*args[0].from != '1')
|
||||
return -EINVAL;
|
||||
break;
|
||||
case Opt_pcrlock:
|
||||
@@ -1013,8 +1023,12 @@ static int trusted_instantiate(struct key *key,
|
||||
case Opt_new:
|
||||
key_len = payload->key_len;
|
||||
ret = tpm_get_random(chip, payload->key, key_len);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
if (ret != key_len) {
|
||||
pr_info("trusted_key: key_create failed (%d)\n", ret);
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
}
|
||||
if (tpm2)
|
||||
|
@@ -83,6 +83,12 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = tpm_buf_init(&buf, TPM2_ST_SESSIONS, TPM2_CC_CREATE);
|
||||
if (rc) {
|
||||
tpm_put_ops(chip);
|
||||
return rc;
|
||||
}
|
||||
|
||||
tpm_buf_append_u32(&buf, options->keyhandle);
|
||||
tpm2_buf_append_auth(&buf, TPM2_RS_PW,
|
||||
NULL /* nonce */, 0,
|
||||
@@ -130,7 +136,7 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = tpm_send(chip, buf.data, tpm_buf_length(&buf));
|
||||
rc = tpm_transmit_cmd(chip, &buf, 4, "sealing data");
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
@@ -157,6 +163,7 @@ out:
|
||||
rc = -EPERM;
|
||||
}
|
||||
|
||||
tpm_put_ops(chip);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -211,7 +218,7 @@ static int tpm2_load_cmd(struct tpm_chip *chip,
|
||||
goto out;
|
||||
}
|
||||
|
||||
rc = tpm_send(chip, buf.data, tpm_buf_length(&buf));
|
||||
rc = tpm_transmit_cmd(chip, &buf, 4, "loading blob");
|
||||
if (!rc)
|
||||
*blob_handle = be32_to_cpup(
|
||||
(__be32 *) &buf.data[TPM_HEADER_SIZE]);
|
||||
@@ -260,7 +267,7 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip,
|
||||
options->blobauth /* hmac */,
|
||||
TPM_DIGEST_SIZE);
|
||||
|
||||
rc = tpm_send(chip, buf.data, tpm_buf_length(&buf));
|
||||
rc = tpm_transmit_cmd(chip, &buf, 6, "unsealing");
|
||||
if (rc > 0)
|
||||
rc = -EPERM;
|
||||
|
||||
@@ -304,12 +311,19 @@ int tpm2_unseal_trusted(struct tpm_chip *chip,
|
||||
u32 blob_handle;
|
||||
int rc;
|
||||
|
||||
rc = tpm2_load_cmd(chip, payload, options, &blob_handle);
|
||||
rc = tpm_try_get_ops(chip);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = tpm2_load_cmd(chip, payload, options, &blob_handle);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
rc = tpm2_unseal_cmd(chip, payload, options, blob_handle);
|
||||
tpm2_flush_context(chip, blob_handle);
|
||||
|
||||
out:
|
||||
tpm_put_ops(chip);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
Reference in New Issue
Block a user