tpm: factor out tpm1_get_random into tpm1-cmd.c
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 Sakkinen <jarkko.sakkinen@linux.intel.com> Tested-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
This commit is contained in:
parent
f4d916b72f
commit
433d390f00
@ -811,14 +811,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
|
||||
@ -829,58 +821,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);
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user