[PATCH v5 01/21] tpm2: add new tpm2 commands according to TCG 1.36
Jarkko Sakkinen
jarkko.sakkinen at linux.intel.com
Tue Oct 2 00:38:12 UTC 2018
Looks good. Just some minor bits.
On Sat, Sep 29, 2018 at 01:30:15AM +0300, Tomas Winkler wrote:
> 1. TPM2_CC_LAST has moved from 182 to 193
> 2. Convert tpm2_ordinal_duration from an array into a switch statement,
> as there are not so many commands that require special duration
> relative to a number of commands, the switch statement function
> is called tpm2_ordinal_duration_index().
> 3. Fix kdoc comments for tpm2_calc_ordinal_duration().
>
> Signed-off-by: Tomas Winkler <tomas.winkler at intel.com>
> Tested-by: Jarkko Sakkinen <jarkko.sakkinen at linux.intel.com>
> ---
>
> V2-V3: Rebase.
> V4: 1. Fix kdoc
> 2. Rename tpm2_ordinal_duration() to tpm2_ordinal_duration_index()
> 3. Move the two functions close to each other in the file.
> V5: Adjust the kdoc to the new standard.
>
> drivers/char/tpm/tpm.h | 41 +++++---
> drivers/char/tpm/tpm2-cmd.c | 241 +++++++++++++++++---------------------------
> 2 files changed, 118 insertions(+), 164 deletions(-)
>
> diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
> index f20dc8ece348..0f08518b525d 100644
> --- a/drivers/char/tpm/tpm.h
> +++ b/drivers/char/tpm/tpm.h
> @@ -134,22 +134,31 @@ enum tpm2_algorithms {
> };
>
> enum tpm2_command_codes {
> - TPM2_CC_FIRST = 0x011F,
> - TPM2_CC_CREATE_PRIMARY = 0x0131,
> - TPM2_CC_SELF_TEST = 0x0143,
> - TPM2_CC_STARTUP = 0x0144,
> - TPM2_CC_SHUTDOWN = 0x0145,
> - TPM2_CC_CREATE = 0x0153,
> - TPM2_CC_LOAD = 0x0157,
> - TPM2_CC_UNSEAL = 0x015E,
> - TPM2_CC_CONTEXT_LOAD = 0x0161,
> - TPM2_CC_CONTEXT_SAVE = 0x0162,
> - TPM2_CC_FLUSH_CONTEXT = 0x0165,
> - TPM2_CC_GET_CAPABILITY = 0x017A,
> - TPM2_CC_GET_RANDOM = 0x017B,
> - TPM2_CC_PCR_READ = 0x017E,
> - TPM2_CC_PCR_EXTEND = 0x0182,
> - TPM2_CC_LAST = 0x018F,
> + TPM2_CC_FIRST = 0x011F,
> + TPM2_CC_HIERARCHY_CONTROL = 0x0121,
> + TPM2_CC_HIERARCHY_CHANGE_AUTH = 0x0129,
> + TPM2_CC_CREATE_PRIMARY = 0x0131,
> + TPM2_CC_SEQUENCE_COMPLETE = 0x013E,
> + TPM2_CC_SELF_TEST = 0x0143,
> + TPM2_CC_STARTUP = 0x0144,
> + TPM2_CC_SHUTDOWN = 0x0145,
> + TPM2_CC_NV_READ = 0x014E,
> + TPM2_CC_CREATE = 0x0153,
> + TPM2_CC_LOAD = 0x0157,
> + TPM2_CC_SEQUENCE_UPDATE = 0x015C,
> + TPM2_CC_UNSEAL = 0x015E,
> + TPM2_CC_CONTEXT_LOAD = 0x0161,
> + TPM2_CC_CONTEXT_SAVE = 0x0162,
> + TPM2_CC_FLUSH_CONTEXT = 0x0165,
> + TPM2_CC_VERIFY_SIGNATURE = 0x0177,
> + TPM2_CC_GET_CAPABILITY = 0x017A,
> + TPM2_CC_GET_RANDOM = 0x017B,
> + TPM2_CC_PCR_READ = 0x017E,
> + TPM2_CC_PCR_EXTEND = 0x0182,
> + TPM2_CC_EVENT_SEQUENCE_COMPLETE = 0x0185,
> + TPM2_CC_HASH_SEQUENCE_START = 0x0186,
> + TPM2_CC_CREATE_LOADED = 0x0191,
> + TPM2_CC_LAST = 0x0193, /* Spec 1.36 */
> };
>
> enum tpm2_permanent_handles {
> diff --git a/drivers/char/tpm/tpm2-cmd.c b/drivers/char/tpm/tpm2-cmd.c
> index 3acf4fd4e5a5..f08478c78bf7 100644
> --- a/drivers/char/tpm/tpm2-cmd.c
> +++ b/drivers/char/tpm/tpm2-cmd.c
> @@ -40,129 +40,100 @@ static struct tpm2_hash tpm2_hash_map[] = {
> {HASH_ALGO_SM3_256, TPM2_ALG_SM3_256},
> };
>
> -/*
> - * Array with one entry per ordinal defining the maximum amount
> - * of time the chip could take to return the result. The values
> - * of the SHORT, MEDIUM, and LONG durations are taken from the
> - * PC Client Profile (PTP) specification.
> - * LONG_LONG is for commands that generates keys which empirically
> - * takes longer time on some systems.
> +/**
> + * tpm2_ordinal_duration_index() - returns an index to the chip duration table
> + * @ordinal: TPM command ordinal.
> + *
> + * The function returns an index to the chip duration table
> + * (enum tpm_duration), that describes the maximum amount of
> + * time the chip could take to return the result for a particular ordinal.
> + *
> + * The values of the MEDIUM, and LONG durations are taken
> + * from the PC Client Profile (PTP) specification (750, 2000 msec)
> + *
> + * LONG_LONG is for commands that generates keys which empirically takes
> + * a longer time on some systems.
> + *
> + * Return:
> + * * TPM_MEDIUM
A semicolon missing.
> + * * TPM_LONG,
> + * * TPM_LONG_LONG
A semicolon missing.
> + * * TPM_UNDEFINED.
> */
> -static const u8 tpm2_ordinal_duration[TPM2_CC_LAST - TPM2_CC_FIRST + 1] = {
> - TPM_UNDEFINED, /* 11F */
> - TPM_UNDEFINED, /* 120 */
> - TPM_LONG, /* 121 */
> - TPM_UNDEFINED, /* 122 */
> - TPM_UNDEFINED, /* 123 */
> - TPM_UNDEFINED, /* 124 */
> - TPM_UNDEFINED, /* 125 */
> - TPM_UNDEFINED, /* 126 */
> - TPM_UNDEFINED, /* 127 */
> - TPM_UNDEFINED, /* 128 */
> - TPM_LONG, /* 129 */
> - TPM_UNDEFINED, /* 12a */
> - TPM_UNDEFINED, /* 12b */
> - TPM_UNDEFINED, /* 12c */
> - TPM_UNDEFINED, /* 12d */
> - TPM_UNDEFINED, /* 12e */
> - TPM_UNDEFINED, /* 12f */
> - TPM_UNDEFINED, /* 130 */
> - TPM_LONG_LONG, /* 131 */
> - TPM_UNDEFINED, /* 132 */
> - TPM_UNDEFINED, /* 133 */
> - TPM_UNDEFINED, /* 134 */
> - TPM_UNDEFINED, /* 135 */
> - TPM_UNDEFINED, /* 136 */
> - TPM_UNDEFINED, /* 137 */
> - TPM_UNDEFINED, /* 138 */
> - TPM_UNDEFINED, /* 139 */
> - TPM_UNDEFINED, /* 13a */
> - TPM_UNDEFINED, /* 13b */
> - TPM_UNDEFINED, /* 13c */
> - TPM_UNDEFINED, /* 13d */
> - TPM_MEDIUM, /* 13e */
> - TPM_UNDEFINED, /* 13f */
> - TPM_UNDEFINED, /* 140 */
> - TPM_UNDEFINED, /* 141 */
> - TPM_UNDEFINED, /* 142 */
> - TPM_LONG, /* 143 */
> - TPM_MEDIUM, /* 144 */
> - TPM_UNDEFINED, /* 145 */
> - TPM_UNDEFINED, /* 146 */
> - TPM_UNDEFINED, /* 147 */
> - TPM_UNDEFINED, /* 148 */
> - TPM_UNDEFINED, /* 149 */
> - TPM_UNDEFINED, /* 14a */
> - TPM_UNDEFINED, /* 14b */
> - TPM_UNDEFINED, /* 14c */
> - TPM_UNDEFINED, /* 14d */
> - TPM_LONG, /* 14e */
> - TPM_UNDEFINED, /* 14f */
> - TPM_UNDEFINED, /* 150 */
> - TPM_UNDEFINED, /* 151 */
> - TPM_UNDEFINED, /* 152 */
> - TPM_LONG_LONG, /* 153 */
> - TPM_UNDEFINED, /* 154 */
> - TPM_UNDEFINED, /* 155 */
> - TPM_UNDEFINED, /* 156 */
> - TPM_UNDEFINED, /* 157 */
> - TPM_UNDEFINED, /* 158 */
> - TPM_UNDEFINED, /* 159 */
> - TPM_UNDEFINED, /* 15a */
> - TPM_UNDEFINED, /* 15b */
> - TPM_MEDIUM, /* 15c */
> - TPM_UNDEFINED, /* 15d */
> - TPM_UNDEFINED, /* 15e */
> - TPM_UNDEFINED, /* 15f */
> - TPM_UNDEFINED, /* 160 */
> - TPM_UNDEFINED, /* 161 */
> - TPM_UNDEFINED, /* 162 */
> - TPM_UNDEFINED, /* 163 */
> - TPM_UNDEFINED, /* 164 */
> - TPM_UNDEFINED, /* 165 */
> - TPM_UNDEFINED, /* 166 */
> - TPM_UNDEFINED, /* 167 */
> - TPM_UNDEFINED, /* 168 */
> - TPM_UNDEFINED, /* 169 */
> - TPM_UNDEFINED, /* 16a */
> - TPM_UNDEFINED, /* 16b */
> - TPM_UNDEFINED, /* 16c */
> - TPM_UNDEFINED, /* 16d */
> - TPM_UNDEFINED, /* 16e */
> - TPM_UNDEFINED, /* 16f */
> - TPM_UNDEFINED, /* 170 */
> - TPM_UNDEFINED, /* 171 */
> - TPM_UNDEFINED, /* 172 */
> - TPM_UNDEFINED, /* 173 */
> - TPM_UNDEFINED, /* 174 */
> - TPM_UNDEFINED, /* 175 */
> - TPM_UNDEFINED, /* 176 */
> - TPM_LONG, /* 177 */
> - TPM_UNDEFINED, /* 178 */
> - TPM_UNDEFINED, /* 179 */
> - TPM_MEDIUM, /* 17a */
> - TPM_LONG, /* 17b */
> - TPM_UNDEFINED, /* 17c */
> - TPM_UNDEFINED, /* 17d */
> - TPM_UNDEFINED, /* 17e */
> - TPM_UNDEFINED, /* 17f */
> - TPM_UNDEFINED, /* 180 */
> - TPM_UNDEFINED, /* 181 */
> - TPM_MEDIUM, /* 182 */
> - TPM_UNDEFINED, /* 183 */
> - TPM_UNDEFINED, /* 184 */
> - TPM_MEDIUM, /* 185 */
> - TPM_MEDIUM, /* 186 */
> - TPM_UNDEFINED, /* 187 */
> - TPM_UNDEFINED, /* 188 */
> - TPM_UNDEFINED, /* 189 */
> - TPM_UNDEFINED, /* 18a */
> - TPM_UNDEFINED, /* 18b */
> - TPM_UNDEFINED, /* 18c */
> - TPM_UNDEFINED, /* 18d */
> - TPM_UNDEFINED, /* 18e */
> - TPM_UNDEFINED /* 18f */
> -};
> +static u8 tpm2_ordinal_duration_index(u32 ordinal)
> +{
> + switch (ordinal) {
> + /* Startup */
> + case TPM2_CC_STARTUP: /* 144 */
> + return TPM_MEDIUM;
> +
> + case TPM2_CC_SELF_TEST: /* 143 */
> + return TPM_LONG;
> +
> + case TPM2_CC_GET_RANDOM: /* 17B */
> + return TPM_LONG;
> +
> + case TPM2_CC_SEQUENCE_UPDATE: /* 15C */
> + return TPM_MEDIUM;
> + case TPM2_CC_SEQUENCE_COMPLETE: /* 13E */
> + return TPM_MEDIUM;
> + case TPM2_CC_EVENT_SEQUENCE_COMPLETE: /* 185 */
> + return TPM_MEDIUM;
> + case TPM2_CC_HASH_SEQUENCE_START: /* 186 */
> + return TPM_MEDIUM;
> +
> + case TPM2_CC_VERIFY_SIGNATURE: /* 177 */
> + return TPM_LONG;
> +
> + case TPM2_CC_PCR_EXTEND: /* 182 */
> + return TPM_MEDIUM;
> +
> + case TPM2_CC_HIERARCHY_CONTROL: /* 121 */
> + return TPM_LONG;
> + case TPM2_CC_HIERARCHY_CHANGE_AUTH: /* 129 */
> + return TPM_LONG;
> +
> + case TPM2_CC_GET_CAPABILITY: /* 17A */
> + return TPM_MEDIUM;
> +
> + case TPM2_CC_NV_READ: /* 14E */
> + return TPM_LONG;
> +
> + case TPM2_CC_CREATE_PRIMARY: /* 131 */
> + return TPM_LONG_LONG;
> + case TPM2_CC_CREATE: /* 153 */
> + return TPM_LONG_LONG;
> + case TPM2_CC_CREATE_LOADED: /* 191 */
> + return TPM_LONG_LONG;
> +
> + default:
> + return TPM_UNDEFINED;
> + }
> +}
> +
> +/**
> + * tpm2_calc_ordinal_duration() - calculate the maximum command duration
> + * @chip: TPM chip to use.
> + * @ordinal: TPM command ordinal.
> + *
> + * The function returns the maximum amount of time the chip could take
> + * to return the result for a particular ordinal in jiffies.
> + *
> + * Return: A maximal duration time for an ordinal in jiffies.
> + */
> +unsigned long tpm2_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal)
> +{
> + unsigned int index;
> +
> + index = tpm2_ordinal_duration_index(ordinal);
> +
> + if (index != TPM_UNDEFINED)
> + return chip->duration[index];
> + else
> + return msecs_to_jiffies(TPM2_DURATION_DEFAULT);
> +}
> +EXPORT_SYMBOL_GPL(tpm2_calc_ordinal_duration);
> +
>
> struct tpm2_pcr_read_out {
> __be32 update_cnt;
> @@ -748,32 +719,6 @@ void tpm2_shutdown(struct tpm_chip *chip, u16 shutdown_type)
> tpm_buf_destroy(&buf);
> }
>
> -/*
> - * tpm2_calc_ordinal_duration() - maximum duration for a command
> - *
> - * @chip: TPM chip to use.
> - * @ordinal: command code number.
> - *
> - * Return: maximum duration for a command
> - */
> -unsigned long tpm2_calc_ordinal_duration(struct tpm_chip *chip, u32 ordinal)
> -{
> - int index = TPM_UNDEFINED;
> - int duration = 0;
> -
> - if (ordinal >= TPM2_CC_FIRST && ordinal <= TPM2_CC_LAST)
> - index = tpm2_ordinal_duration[ordinal - TPM2_CC_FIRST];
> -
> - if (index != TPM_UNDEFINED)
> - duration = chip->duration[index];
> -
> - if (duration <= 0)
> - duration = msecs_to_jiffies(TPM2_DURATION_DEFAULT);
> -
> - return duration;
> -}
> -EXPORT_SYMBOL_GPL(tpm2_calc_ordinal_duration);
> -
> /**
> * tpm2_do_selftest() - ensure that all self tests have passed
> *
> --
> 2.14.4
>
/Jarkko
More information about the Linux-security-module-archive
mailing list