On Mon, Sep 28, 2020 at 04:24:04PM +0300, Jarkko Sakkinen wrote: > 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: Kent Yoder <key@xxxxxxxxxxxxxxxxxx> > Cc: David Howells <dhowells@xxxxxxxxxx> > Cc: "James E.J. Bottomley" <James.Bottomley@xxxxxxxxxxxxxxxxxxxxx> > Cc: stable@xxxxxxxxxxxxxxx > Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@xxxxxxxxxxxxxxx> > --- > security/keys/trusted-keys/trusted_tpm1.c | 19 +++++++++++++++++-- > 1 file changed, 17 insertions(+), 2 deletions(-) > > diff --git a/security/keys/trusted-keys/trusted_tpm1.c b/security/keys/trusted-keys/trusted_tpm1.c > index b9fe02e5f84f..0f2e893c6b5f 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,6 +608,9 @@ 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 -EIO; > + > if (ret != TPM_NONCE_SIZE) { > pr_info("trusted_key: tpm_get_random failed (%d)\n", ret); > return ret; > @@ -1013,6 +1023,11 @@ 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) { > + ret = -EIO; > + goto out; > + } > + > if (ret != key_len) { > pr_info("trusted_key: key_create failed (%d)\n", ret); > goto out; Ugh. I'll send an update (was not the final version, had unstaged changes). /Jarkko