On Tue, Jun 20, 2017 at 11:38:03AM +0200, Jarkko Sakkinen wrote:
> Migrated pubek_show to struct tpm_buf and cleaned up its implementation.
> Previously the output parameter structure was declared but left
> completely unused. Now it is used to refer different fields of the
> output. We can move it to tpm-sysfs.c as it does not have any use
> outside of that file.
> 
> Signed-off-by: Jarkko Sakkinen <jarkko.sakki...@linux.intel.com>

Can anyone help peer testing this change?

https://patchwork.kernel.org/patch/9799057/

/Jarkko

> ---
>  drivers/char/tpm/tpm-sysfs.c | 87 
> ++++++++++++++++++++++++--------------------
>  drivers/char/tpm/tpm.h       | 13 -------
>  2 files changed, 48 insertions(+), 52 deletions(-)
> 
> diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c
> index eedb8e47bde2..fcb69f1162ab 100644
> --- a/drivers/char/tpm/tpm-sysfs.c
> +++ b/drivers/char/tpm/tpm-sysfs.c
> @@ -20,44 +20,48 @@
>  #include <linux/device.h>
>  #include "tpm.h"
>  
> -#define READ_PUBEK_RESULT_SIZE 314
> +struct tpm_readpubek_out {
> +     u8 algorithm[4];
> +     u8 encscheme[2];
> +     u8 sigscheme[2];
> +     __be32 paramsize;
> +     u8 parameters[12];
> +     __be32 keysize;
> +     u8 modulus[256];
> +     u8 checksum[20];
> +} __packed;
> +
>  #define READ_PUBEK_RESULT_MIN_BODY_SIZE (28 + 256)
>  #define TPM_ORD_READPUBEK 124
> -static const struct tpm_input_header tpm_readpubek_header = {
> -     .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND),
> -     .length = cpu_to_be32(30),
> -     .ordinal = cpu_to_be32(TPM_ORD_READPUBEK)
> -};
> +
>  static ssize_t pubek_show(struct device *dev, struct device_attribute *attr,
>                         char *buf)
>  {
> -     u8 *data;
> -     struct tpm_cmd_t tpm_cmd;
> -     ssize_t err;
> -     int i, rc;
> +     struct tpm_buf tpm_buf;
> +     struct tpm_readpubek_out *out;
> +     ssize_t rc;
> +     int i;
>       char *str = buf;
>       struct tpm_chip *chip = to_tpm_chip(dev);
> +     char anti_replay[20];
>  
> -     memset(&tpm_cmd, 0, sizeof(tpm_cmd));
> -
> -     tpm_cmd.header.in = tpm_readpubek_header;
> -     err = tpm_transmit_cmd(chip, NULL, &tpm_cmd, READ_PUBEK_RESULT_SIZE,
> -                            READ_PUBEK_RESULT_MIN_BODY_SIZE, 0,
> -                            "attempting to read the PUBEK");
> -     if (err)
> -             goto out;
> -
> -     /*
> -        ignore header 10 bytes
> -        algorithm 32 bits (1 == RSA )
> -        encscheme 16 bits
> -        sigscheme 16 bits
> -        parameters (RSA 12->bytes: keybit, #primes, expbit)
> -        keylenbytes 32 bits
> -        256 byte modulus
> -        ignore checksum 20 bytes
> -      */
> -     data = tpm_cmd.params.readpubek_out_buffer;
> +     memset(&anti_replay, 0, sizeof(anti_replay));
> +
> +     rc = tpm_buf_init(&tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK);
> +     if (rc)
> +             return rc;
> +
> +     tpm_buf_append(&tpm_buf, anti_replay, sizeof(anti_replay));
> +
> +     rc = tpm_transmit_cmd(chip, NULL, tpm_buf.data, PAGE_SIZE,
> +                           READ_PUBEK_RESULT_MIN_BODY_SIZE, 0,
> +                           "attempting to read the PUBEK");
> +     if (rc) {
> +             tpm_buf_destroy(&tpm_buf);
> +             return 0;
> +     }
> +
> +     out = (struct tpm_readpubek_out *)&tpm_buf.data[10];
>       str +=
>           sprintf(str,
>                   "Algorithm: %02X %02X %02X %02X\n"
> @@ -68,21 +72,26 @@ static ssize_t pubek_show(struct device *dev, struct 
> device_attribute *attr,
>                   "%02X %02X %02X %02X\n"
>                   "Modulus length: %d\n"
>                   "Modulus:\n",
> -                 data[0], data[1], data[2], data[3],
> -                 data[4], data[5],
> -                 data[6], data[7],
> -                 data[12], data[13], data[14], data[15],
> -                 data[16], data[17], data[18], data[19],
> -                 data[20], data[21], data[22], data[23],
> -                 be32_to_cpu(*((__be32 *) (data + 24))));
> +                 out->algorithm[0], out->algorithm[1], out->algorithm[2],
> +                 out->algorithm[3],
> +                 out->encscheme[0], out->encscheme[1],
> +                 out->sigscheme[0], out->sigscheme[1],
> +                 out->parameters[0], out->parameters[1],
> +                 out->parameters[2], out->parameters[3],
> +                 out->parameters[4], out->parameters[5],
> +                 out->parameters[6], out->parameters[7],
> +                 out->parameters[8], out->parameters[9],
> +                 out->parameters[10], out->parameters[11],
> +                 be32_to_cpu(out->keysize));
>  
>       for (i = 0; i < 256; i++) {
> -             str += sprintf(str, "%02X ", data[i + 28]);
> +             str += sprintf(str, "%02X ", out->modulus[i]);
>               if ((i + 1) % 16 == 0)
>                       str += sprintf(str, "\n");
>       }
> -out:
> +
>       rc = str - buf;
> +     tpm_buf_destroy(&tpm_buf);
>       return rc;
>  }
>  static DEVICE_ATTR_RO(pubek);
> diff --git a/drivers/char/tpm/tpm.h b/drivers/char/tpm/tpm.h
> index cdd261383dea..d9835b31f652 100644
> --- a/drivers/char/tpm/tpm.h
> +++ b/drivers/char/tpm/tpm.h
> @@ -343,17 +343,6 @@ enum tpm_sub_capabilities {
>       TPM_CAP_PROP_TIS_DURATION = 0x120,
>  };
>  
> -struct       tpm_readpubek_params_out {
> -     u8      algorithm[4];
> -     u8      encscheme[2];
> -     u8      sigscheme[2];
> -     __be32  paramsize;
> -     u8      parameters[12]; /*assuming RSA*/
> -     __be32  keysize;
> -     u8      modulus[256];
> -     u8      checksum[20];
> -} __packed;
> -
>  typedef union {
>       struct  tpm_input_header in;
>       struct  tpm_output_header out;
> @@ -387,8 +376,6 @@ struct tpm_startup_in {
>  } __packed;
>  
>  typedef union {
> -     struct  tpm_readpubek_params_out readpubek_out;
> -     u8      readpubek_out_buffer[sizeof(struct tpm_readpubek_params_out)];
>       struct  tpm_pcrread_in  pcrread_in;
>       struct  tpm_pcrread_out pcrread_out;
>       struct  tpm_getrandom_in getrandom_in;
> -- 
> 2.11.0
> 

Reply via email to