tpm1: implement tpm1_pcr_read_dev() using tpm_buf structure
authorTomas Winkler <tomas.winkler@intel.com>
Fri, 19 Oct 2018 18:23:03 +0000 (21:23 +0300)
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Tue, 13 Nov 2018 11:46:31 +0000 (13:46 +0200)
Implement tpm1_pcr_read_dev() using tpm_buf and remove
now unneeded structures from tpm.h

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>
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm1-cmd.c

index 6895f183396bdd598e97158c716a33d82ab25397..51d147675b1f74a2cabf955d22028291dcb1a01b 100644 (file)
@@ -382,13 +382,10 @@ typedef union {
        struct  tpm_output_header out;
 } tpm_cmd_header;
 
-struct tpm_pcrread_out {
-       u8      pcr_result[TPM_DIGEST_SIZE];
+struct tpm_cmd_t {
+       tpm_cmd_header  header;
 } __packed;
 
-struct tpm_pcrread_in {
-       __be32  pcr_idx;
-} __packed;
 
 /* 128 bytes is an arbitrary cap. This could be as large as TPM_BUFSIZE - 18
  * bytes, but 128 is still a relatively large number of random bytes and
@@ -396,17 +393,6 @@ struct tpm_pcrread_in {
  * compiler warnings about stack frame size. */
 #define TPM_MAX_RNG_DATA       128
 
-typedef union {
-       struct  tpm_pcrread_in  pcrread_in;
-       struct  tpm_pcrread_out pcrread_out;
-} tpm_cmd_params;
-
-struct tpm_cmd_t {
-       tpm_cmd_header  header;
-       tpm_cmd_params  params;
-} __packed;
-
-
 /* A string buffer type for constructing TPM commands. This is based on the
  * ideas of string buffer code in security/keys/trusted.h but is heap based
  * in order to keep the stack usage minimal.
index b5c4fa158c308f0c99d2039aee0fb9b53c72afb8..d30f336518f6e8acbb2bc71ebdfe93c3ba277c6b 100644 (file)
@@ -571,29 +571,33 @@ out:
        return rc;
 }
 
-#define TPM_ORDINAL_PCRREAD 21
-#define READ_PCR_RESULT_SIZE 30
-#define READ_PCR_RESULT_BODY_SIZE 20
-static const struct tpm_input_header pcrread_header = {
-       .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND),
-       .length = cpu_to_be32(14),
-       .ordinal = cpu_to_be32(TPM_ORDINAL_PCRREAD)
-};
-
+#define TPM_ORD_PCRREAD 21
 int tpm1_pcr_read_dev(struct tpm_chip *chip, int pcr_idx, u8 *res_buf)
 {
+       struct tpm_buf buf;
        int rc;
-       struct tpm_cmd_t cmd;
 
-       cmd.header.in = pcrread_header;
-       cmd.params.pcrread_in.pcr_idx = cpu_to_be32(pcr_idx);
-       rc = tpm_transmit_cmd(chip, NULL, &cmd, READ_PCR_RESULT_SIZE,
-                             READ_PCR_RESULT_BODY_SIZE, 0,
+       rc = tpm_buf_init(&buf, TPM_TAG_RQU_COMMAND, TPM_ORD_PCRREAD);
+       if (rc)
+               return rc;
+
+       tpm_buf_append_u32(&buf, pcr_idx);
+
+       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
+                             TPM_DIGEST_SIZE, 0,
                              "attempting to read a pcr value");
+       if (rc)
+               goto out;
 
-       if (rc == 0)
-               memcpy(res_buf, cmd.params.pcrread_out.pcr_result,
-                      TPM_DIGEST_SIZE);
+       if (tpm_buf_length(&buf) < TPM_DIGEST_SIZE) {
+               rc = -EFAULT;
+               goto out;
+       }
+
+       memcpy(res_buf, &buf.data[TPM_HEADER_SIZE], TPM_DIGEST_SIZE);
+
+out:
+       tpm_buf_destroy(&buf);
        return rc;
 }