Message ID | 20210128235621.127925-2-jarkko@kernel.org |
---|---|
State | Accepted |
Commit | 5df16caada3fba3b21cb09b85cdedf99507f4ec1 |
Headers | show |
Series | [v5,1/3] KEYS: trusted: Fix incorrect handling of tpm_get_random() | expand |
On Fri, 2021-01-29 at 01:56 +0200, jarkko@kernel.org wrote: > From: Jarkko Sakkinen <jarkko@kernel.org> > > When tpm_get_random() was introduced, it defined the following API for the > return value: > > 1. A positive value tells how many bytes of random data was generated. > 2. A negative value on error. > > However, in the call sites the API was used incorrectly, i.e. as it would > only return negative values and otherwise zero. Returning he positive read > counts to the user space does not make any possible sense. > > Fix this by returning -EIO when tpm_get_random() returns a positive value. > > Fixes: 41ab999c80f1 ("tpm: Move tpm_get_random api into the TPM device driver") > Cc: stable@vger.kernel.org > Cc: Mimi Zohar <zohar@linux.ibm.com> > Cc: "James E.J. Bottomley" <James.Bottomley@HansenPartnership.com> > Cc: David Howells <dhowells@redhat.com> > Cc: Kent Yoder <key@linux.vnet.ibm.com> > Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org> thanks, Reviewed-by: Mimi Zohar <zohar@linux.ibm.com>
diff --git a/security/keys/trusted-keys/trusted_tpm1.c b/security/keys/trusted-keys/trusted_tpm1.c index 74d82093cbaa..204826b734ac 100644 --- a/security/keys/trusted-keys/trusted_tpm1.c +++ b/security/keys/trusted-keys/trusted_tpm1.c @@ -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), @@ -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)