Messages in this thread | | | Date | Tue, 23 Oct 2018 21:42:12 +0300 (EEST) | From | Jarkko Sakkinen <> | Subject | Re: [PATCH v7 09/21] tpm: factor out tpm1_get_random into tpm1-cmd.c |
| |
On Fri, 19 Oct 2018, Tomas Winkler wrote: > Factor out get random implementation from tpm-interface.c > into tpm1_get_random function in tpm1-cmd.c. > No functional changes. > > Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> > Reviewed-by: Jarkko Sakkine <jarkko.sakkinen@linux.intel.com> > Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > --- > V2-V3: Rebase > V4-V7: Resend > > drivers/char/tpm/tpm-interface.c | 58 +++++----------------------------------- > drivers/char/tpm/tpm.h | 1 + > drivers/char/tpm/tpm1-cmd.c | 55 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 63 insertions(+), 51 deletions(-) > > diff --git a/drivers/char/tpm/tpm-interface.c b/drivers/char/tpm/tpm-interface.c > index 486e211b03a0..a72bf6ea8f05 100644 > --- a/drivers/char/tpm/tpm-interface.c > +++ b/drivers/char/tpm/tpm-interface.c > @@ -812,14 +812,6 @@ int tpm_pm_resume(struct device *dev) > } > EXPORT_SYMBOL_GPL(tpm_pm_resume); > > -#define TPM_ORD_GET_RANDOM 70 > -#define TPM_GETRANDOM_RESULT_SIZE 18 > -static const struct tpm_input_header tpm_getrandom_header = { > - .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND), > - .length = cpu_to_be32(14), > - .ordinal = cpu_to_be32(TPM_ORD_GET_RANDOM) > -}; > - > /** > * tpm_get_random() - get random bytes from the TPM's RNG > * @chip: a &struct tpm_chip instance, %NULL for the default chip > @@ -830,58 +822,22 @@ static const struct tpm_input_header tpm_getrandom_header = { > */ > int tpm_get_random(struct tpm_chip *chip, u8 *out, size_t max) > { > - struct tpm_cmd_t tpm_cmd; > - u32 recd, num_bytes = min_t(u32, max, TPM_MAX_RNG_DATA), rlength; > - int err, total = 0, retries = 5; > - u8 *dest = out; > + int rc; > > - if (!out || !num_bytes || max > TPM_MAX_RNG_DATA) > + if (!out || max > TPM_MAX_RNG_DATA) > return -EINVAL; > > chip = tpm_find_get_ops(chip); > if (!chip) > return -ENODEV; > > - if (chip->flags & TPM_CHIP_FLAG_TPM2) { > - err = tpm2_get_random(chip, out, max); > - tpm_put_ops(chip); > - return err; > - } > - > - do { > - tpm_cmd.header.in = tpm_getrandom_header; > - tpm_cmd.params.getrandom_in.num_bytes = cpu_to_be32(num_bytes); > - > - err = tpm_transmit_cmd(chip, NULL, &tpm_cmd, > - TPM_GETRANDOM_RESULT_SIZE + num_bytes, > - offsetof(struct tpm_getrandom_out, > - rng_data), > - 0, "attempting get random"); > - if (err) > - break; > - > - recd = be32_to_cpu(tpm_cmd.params.getrandom_out.rng_data_len); > - if (recd > num_bytes) { > - total = -EFAULT; > - break; > - } > - > - rlength = be32_to_cpu(tpm_cmd.header.out.length); > - if (rlength < TPM_HEADER_SIZE + > - offsetof(struct tpm_getrandom_out, rng_data) + > - recd) { > - total = -EFAULT; > - break; > - } > - memcpy(dest, tpm_cmd.params.getrandom_out.rng_data, recd); > - > - dest += recd; > - total += recd; > - num_bytes -= recd; > - } while (retries-- && total < max); > + if (chip->flags & TPM_CHIP_FLAG_TPM2) > + rc = tpm2_get_random(chip, out, max); > + else > + rc = tpm1_get_random(chip, out, max); > > tpm_put_ops(chip); > - return total ? total : -EIO; > + return rc; > } > EXPORT_SYMBOL_GPL(tpm_get_random); > > diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h > index 05c386b3ab12..22f89f41ad52 100644 > --- a/drivers/char/tpm/tpm.h > +++ b/drivers/char/tpm/tpm.h > @@ -551,6 +551,7 @@ int tpm1_pcr_extend(struct tpm_chip *chip, int pcr_idx, const u8 *hash, > const char *log_msg); > ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap, > const char *desc, size_t min_cap_length); > +int tpm1_get_random(struct tpm_chip *chip, u8 *out, size_t max); > unsigned long tpm_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal); > int tpm_pm_suspend(struct device *dev); > int tpm_pm_resume(struct device *dev); > diff --git a/drivers/char/tpm/tpm1-cmd.c b/drivers/char/tpm/tpm1-cmd.c > index 3bd079587ef5..e02f0c1c822f 100644 > --- a/drivers/char/tpm/tpm1-cmd.c > +++ b/drivers/char/tpm/tpm1-cmd.c > @@ -469,3 +469,58 @@ ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap, > return rc; > } > EXPORT_SYMBOL_GPL(tpm1_getcap); > + > +#define TPM_ORD_GET_RANDOM 70 > +#define TPM_GETRANDOM_RESULT_SIZE 18 > +static const struct tpm_input_header tpm_getrandom_header = { > + .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND), > + .length = cpu_to_be32(14), > + .ordinal = cpu_to_be32(TPM_ORD_GET_RANDOM) > +}; > + > +int tpm1_get_random(struct tpm_chip *chip, u8 *out, size_t max) > +{ > + struct tpm_cmd_t tpm_cmd; > + u32 recd; > + u32 num_bytes = min_t(u32, max, TPM_MAX_RNG_DATA); > + u32 rlength; > + int err, total = 0, retries = 5; > + u8 *dest = out; > + > + if (!out || !num_bytes || max > TPM_MAX_RNG_DATA) > + return -EINVAL; > + > + do { > + tpm_cmd.header.in = tpm_getrandom_header; > + tpm_cmd.params.getrandom_in.num_bytes = cpu_to_be32(num_bytes); > + > + err = tpm_transmit_cmd(chip, NULL, &tpm_cmd, > + TPM_GETRANDOM_RESULT_SIZE + num_bytes, > + offsetof(struct tpm_getrandom_out, > + rng_data), > + 0, "attempting get random"); > + if (err) > + break; > + > + recd = be32_to_cpu(tpm_cmd.params.getrandom_out.rng_data_len); > + if (recd > num_bytes) { > + total = -EFAULT; > + break; > + } > + > + rlength = be32_to_cpu(tpm_cmd.header.out.length); > + if (rlength < TPM_HEADER_SIZE + > + offsetof(struct tpm_getrandom_out, rng_data) + > + recd) { > + total = -EFAULT; > + break; > + } > + memcpy(dest, tpm_cmd.params.getrandom_out.rng_data, recd); > + > + dest += recd; > + total += recd; > + num_bytes -= recd; > + } while (retries-- && (size_t)total < max); > + > + return total ? total : -EIO; > +} >
Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
/Jarkko
| |