[PATCH v7 09/21] tpm: factor out tpm1_get_random into tpm1-cmd.c
Jarkko Sakkinen
jarkko.sakkinen at linux.intel.com
Tue Oct 23 18:42:12 UTC 2018
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 at intel.com>
> Reviewed-by: Jarkko Sakkine <jarkko.sakkinen at linux.intel.com>
> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen at 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 at linux.intel.com>
/Jarkko
More information about the Linux-security-module-archive
mailing list