tpm: use tpm_buf in tpm_transmit_cmd() as the IO parameter
authorJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Fri, 26 Oct 2018 13:34:22 +0000 (14:34 +0100)
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Wed, 13 Feb 2019 07:47:01 +0000 (09:47 +0200)
Since we pass an initialized struct tpm_buf instance in every call site
now, it is cleaner to pass that directly to the tpm_transmit_cmd() as
the TPM command/response buffer.

Fine-tune a little bit tpm_transmit() and tpm_transmit_cmd() comments
while doing this.

Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
Tested-by: Stefan Berger <stefanb@linux.ibm.com>
Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
Reviewed-by: James Bottomley <James.Bottomley@HansenPartnership.com>
Tested-by: Alexander Steffen <Alexander.Steffen@infineon.com>
drivers/char/tpm/tpm-interface.c
drivers/char/tpm/tpm-sysfs.c
drivers/char/tpm/tpm.h
drivers/char/tpm/tpm1-cmd.c
drivers/char/tpm/tpm2-cmd.c
drivers/char/tpm/tpm2-space.c
drivers/char/tpm/tpm_vtpm_proxy.c

index 624075e..ec54f16 100644 (file)
@@ -307,23 +307,22 @@ out_locality:
 
 /**
  * tpm_transmit - Internal kernel interface to transmit TPM commands.
+ * @chip:      a TPM chip to use
+ * @space:     a TPM space
+ * @buf:       a TPM command buffer
+ * @bufsiz:    length of the TPM command buffer
+ * @flags:     TPM transmit flags
  *
- * @chip: TPM chip to use
- * @space: tpm space
- * @buf: TPM command buffer
- * @bufsiz: length of the TPM command buffer
- * @flags: tpm transmit flags - bitmap
+ * A wrapper around tpm_try_transmit() that handles TPM2_RC_RETRY returns from
+ * the TPM and retransmits the command after a delay up to a maximum wait of
+ * TPM2_DURATION_LONG.
  *
- * A wrapper around tpm_try_transmit that handles TPM2_RC_RETRY
- * returns from the TPM and retransmits the command after a delay up
- * to a maximum wait of TPM2_DURATION_LONG.
- *
- * Note: TPM1 never returns TPM2_RC_RETRY so the retry logic is TPM2
- * only
+ * Note that TPM 1.x never returns TPM2_RC_RETRY so the retry logic is TPM 2.0
+ * only.
  *
  * Return:
- *     the length of the return when the operation is successful.
- *     A negative number for system errors (errno).
+ * * The response length       - OK
+ * * -errno                    - A system error
  */
 ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space,
                     u8 *buf, size_t bufsiz, unsigned int flags)
@@ -374,33 +373,31 @@ ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space,
        }
        return ret;
 }
+
 /**
  * tpm_transmit_cmd - send a tpm command to the device
- *    The function extracts tpm out header return code
- *
- * @chip: TPM chip to use
- * @space: tpm space
- * @buf: TPM command buffer
- * @bufsiz: length of the buffer
- * @min_rsp_body_length: minimum expected length of response body
- * @flags: tpm transmit flags - bitmap
- * @desc: command description used in the error message
+ * @chip:                      a TPM chip to use
+ * @space:                     a TPM space
+ * @buf:                       a TPM command buffer
+ * @min_rsp_body_length:       minimum expected length of response body
+ * @flags:                     TPM transmit flags
+ * @desc:                      command description used in the error message
  *
  * Return:
- *     0 when the operation is successful.
- *     A negative number for system errors (errno).
- *     A positive number for a TPM error.
+ * * 0         - OK
+ * * -errno    - A system error
+ * * TPM_RC    - A TPM error
  */
 ssize_t tpm_transmit_cmd(struct tpm_chip *chip, struct tpm_space *space,
-                        void *buf, size_t bufsiz,
-                        size_t min_rsp_body_length, unsigned int flags,
-                        const char *desc)
+                        struct tpm_buf *buf, size_t min_rsp_body_length,
+                        unsigned int flags, const char *desc)
 {
-       const struct tpm_output_header *header = buf;
+       const struct tpm_output_header *header =
+               (struct tpm_output_header *)buf->data;
        int err;
        ssize_t len;
 
-       len = tpm_transmit(chip, space, buf, bufsiz, flags);
+       len = tpm_transmit(chip, space, buf->data, PAGE_SIZE, flags);
        if (len <  0)
                return len;
 
@@ -537,14 +534,22 @@ EXPORT_SYMBOL_GPL(tpm_pcr_extend);
  */
 int tpm_send(struct tpm_chip *chip, void *cmd, size_t buflen)
 {
+       struct tpm_buf buf;
        int rc;
 
        chip = tpm_find_get_ops(chip);
        if (!chip)
                return -ENODEV;
 
-       rc = tpm_transmit_cmd(chip, NULL, cmd, buflen, 0, 0,
+       rc = tpm_buf_init(&buf, 0, 0);
+       if (rc)
+               goto out;
+
+       memcpy(buf.data, cmd, buflen);
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0,
                              "attempting to a send a command");
+       tpm_buf_destroy(&buf);
+out:
        tpm_put_ops(chip);
        return rc;
 }
index b88e08e..c2769e5 100644 (file)
@@ -53,7 +53,7 @@ static ssize_t pubek_show(struct device *dev, struct device_attribute *attr,
 
        tpm_buf_append(&tpm_buf, anti_replay, sizeof(anti_replay));
 
-       rc = tpm_transmit_cmd(chip, NULL, tpm_buf.data, PAGE_SIZE,
+       rc = tpm_transmit_cmd(chip, NULL, &tpm_buf,
                              READ_PUBEK_RESULT_MIN_BODY_SIZE, 0,
                              "attempting to read the PUBEK");
        if (rc) {
index f27d1f3..49bca4d 100644 (file)
@@ -503,9 +503,8 @@ enum tpm_transmit_flags {
 ssize_t tpm_transmit(struct tpm_chip *chip, struct tpm_space *space,
                     u8 *buf, size_t bufsiz, unsigned int flags);
 ssize_t tpm_transmit_cmd(struct tpm_chip *chip, struct tpm_space *space,
-                        void *buf, size_t bufsiz,
-                        size_t min_rsp_body_length, unsigned int flags,
-                        const char *desc);
+                        struct tpm_buf *buf, size_t min_rsp_body_length,
+                        unsigned int flags, const char *desc);
 int tpm_get_timeouts(struct tpm_chip *);
 int tpm_auto_startup(struct tpm_chip *chip);
 
index bda9a16..10a0b76 100644 (file)
@@ -334,11 +334,9 @@ static int tpm1_startup(struct tpm_chip *chip)
 
        tpm_buf_append_u16(&buf, TPM_ST_CLEAR);
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, 0,
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0,
                              "attempting to start the TPM");
-
        tpm_buf_destroy(&buf);
-
        return rc;
 }
 
@@ -461,9 +459,7 @@ int tpm1_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, const u8 *hash,
        tpm_buf_append_u32(&buf, pcr_idx);
        tpm_buf_append(&buf, hash, TPM_DIGEST_SIZE);
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
-                             TPM_DIGEST_SIZE, 0, log_msg);
-
+       rc = tpm_transmit_cmd(chip, NULL, &buf, TPM_DIGEST_SIZE, 0, log_msg);
        tpm_buf_destroy(&buf);
        return rc;
 }
@@ -493,11 +489,9 @@ ssize_t tpm1_getcap(struct tpm_chip *chip, u32 subcap_id, cap_t *cap,
                tpm_buf_append_u32(&buf, 4);
                tpm_buf_append_u32(&buf, subcap_id);
        }
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
-                             min_cap_length, 0, desc);
+       rc = tpm_transmit_cmd(chip, NULL, &buf, min_cap_length, 0, desc);
        if (!rc)
                *cap = *(cap_t *)&buf.data[TPM_HEADER_SIZE + 4];
-
        tpm_buf_destroy(&buf);
        return rc;
 }
@@ -536,7 +530,7 @@ int tpm1_get_random(struct tpm_chip *chip, u8 *dest, size_t max)
        do {
                tpm_buf_append_u32(&buf, num_bytes);
 
-               rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
+               rc = tpm_transmit_cmd(chip, NULL, &buf,
                                      sizeof(out->rng_data_len), 0,
                                      "attempting get random");
                if (rc)
@@ -582,8 +576,7 @@ int tpm1_pcr_read(struct tpm_chip *chip, u32 pcr_idx, u8 *res_buf)
 
        tpm_buf_append_u32(&buf, pcr_idx);
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
-                             TPM_DIGEST_SIZE, 0,
+       rc = tpm_transmit_cmd(chip, NULL, &buf, TPM_DIGEST_SIZE, 0,
                              "attempting to read a pcr value");
        if (rc)
                goto out;
@@ -617,11 +610,8 @@ static int tpm1_continue_selftest(struct tpm_chip *chip)
        if (rc)
                return rc;
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
-                             0, 0, "continue selftest");
-
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0, "continue selftest");
        tpm_buf_destroy(&buf);
-
        return rc;
 }
 
@@ -746,9 +736,7 @@ int tpm1_pm_suspend(struct tpm_chip *chip, u32 tpm_suspend_pcr)
                return rc;
        /* now do the actual savestate */
        for (try = 0; try < TPM_RETRY; try++) {
-               rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
-                                     0, 0, NULL);
-
+               rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0, NULL);
                /*
                 * If the TPM indicates that it is too busy to respond to
                 * this command then retry before giving up.  It can take
index a6bec13..2bcf470 100644 (file)
@@ -197,8 +197,8 @@ int tpm2_pcr_read(struct tpm_chip *chip, u32 pcr_idx, u8 *res_buf)
        tpm_buf_append(&buf, (const unsigned char *)pcr_select,
                       sizeof(pcr_select));
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, 0,
-                       res_buf ? "attempting to read a pcr value" : NULL);
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0, res_buf ?
+                             "attempting to read a pcr value" : NULL);
        if (rc == 0 && res_buf) {
                out = (struct tpm2_pcr_read_out *)&buf.data[TPM_HEADER_SIZE];
                memcpy(res_buf, out->digest, SHA1_DIGEST_SIZE);
@@ -264,7 +264,7 @@ int tpm2_pcr_extend(struct tpm_chip *chip, u32 pcr_idx, u32 count,
                }
        }
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, 0,
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0,
                              "attempting extend a PCR value");
 
        tpm_buf_destroy(&buf);
@@ -309,7 +309,7 @@ int tpm2_get_random(struct tpm_chip *chip, u8 *dest, size_t max)
        do {
                tpm_buf_reset(&buf, TPM2_ST_NO_SESSIONS, TPM2_CC_GET_RANDOM);
                tpm_buf_append_u16(&buf, num_bytes);
-               err = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
+               err = tpm_transmit_cmd(chip, NULL, &buf,
                                       offsetof(struct tpm2_get_random_out,
                                                buffer),
                                       0, "attempting get random");
@@ -362,9 +362,7 @@ void tpm2_flush_context_cmd(struct tpm_chip *chip, u32 handle,
 
        tpm_buf_append_u32(&buf, handle);
 
-       (void) tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, flags,
-                               "flushing context");
-
+       tpm_transmit_cmd(chip, NULL, &buf, 0, flags, "flushing context");
        tpm_buf_destroy(&buf);
 }
 
@@ -478,8 +476,7 @@ int tpm2_seal_trusted(struct tpm_chip *chip,
                goto out;
        }
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 4, 0,
-                             "sealing data");
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 4, 0, "sealing data");
        if (rc)
                goto out;
 
@@ -561,8 +558,7 @@ static int tpm2_load_cmd(struct tpm_chip *chip,
                goto out;
        }
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 4, flags,
-                             "loading blob");
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 4, flags, "loading blob");
        if (!rc)
                *blob_handle = be32_to_cpup(
                        (__be32 *) &buf.data[TPM_HEADER_SIZE]);
@@ -612,8 +608,7 @@ static int tpm2_unseal_cmd(struct tpm_chip *chip,
                             options->blobauth /* hmac */,
                             TPM_DIGEST_SIZE);
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 6, flags,
-                             "unsealing");
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 6, flags, "unsealing");
        if (rc > 0)
                rc = -EPERM;
 
@@ -703,7 +698,7 @@ ssize_t tpm2_get_tpm_pt(struct tpm_chip *chip, u32 property_id,  u32 *value,
        tpm_buf_append_u32(&buf, TPM2_CAP_TPM_PROPERTIES);
        tpm_buf_append_u32(&buf, property_id);
        tpm_buf_append_u32(&buf, 1);
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, 0, NULL);
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0, NULL);
        if (!rc) {
                out = (struct tpm2_get_cap_out *)
                        &buf.data[TPM_HEADER_SIZE];
@@ -733,8 +728,7 @@ void tpm2_shutdown(struct tpm_chip *chip, u16 shutdown_type)
        if (rc)
                return;
        tpm_buf_append_u16(&buf, shutdown_type);
-       tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, 0,
-                        "stopping the TPM");
+       tpm_transmit_cmd(chip, NULL, &buf, 0, 0, "stopping the TPM");
        tpm_buf_destroy(&buf);
 }
 
@@ -763,7 +757,7 @@ static int tpm2_do_selftest(struct tpm_chip *chip)
                        return rc;
 
                tpm_buf_append_u8(&buf, full);
-               rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, 0,
+               rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0,
                                      "attempting the self test");
                tpm_buf_destroy(&buf);
 
@@ -800,7 +794,7 @@ int tpm2_probe(struct tpm_chip *chip)
        tpm_buf_append_u32(&buf, TPM2_CAP_TPM_PROPERTIES);
        tpm_buf_append_u32(&buf, TPM_PT_TOTAL_COMMANDS);
        tpm_buf_append_u32(&buf, 1);
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, 0, NULL);
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0, NULL);
        /* We ignore TPM return codes on purpose. */
        if (rc >=  0) {
                out = (struct tpm_output_header *)buf.data;
@@ -839,7 +833,7 @@ static ssize_t tpm2_get_pcr_allocation(struct tpm_chip *chip)
        tpm_buf_append_u32(&buf, 0);
        tpm_buf_append_u32(&buf, 1);
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 9, 0,
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 9, 0,
                              "get tpm pcr allocation");
        if (rc)
                goto out;
@@ -911,8 +905,7 @@ static int tpm2_get_cc_attrs_tbl(struct tpm_chip *chip)
        tpm_buf_append_u32(&buf, TPM2_CC_FIRST);
        tpm_buf_append_u32(&buf, nr_commands);
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE,
-                             9 + 4 * nr_commands, 0, NULL);
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 9 + 4 * nr_commands, 0, NULL);
        if (rc) {
                tpm_buf_destroy(&buf);
                goto out;
@@ -969,7 +962,7 @@ static int tpm2_startup(struct tpm_chip *chip)
                return rc;
 
        tpm_buf_append_u16(&buf, TPM2_SU_CLEAR);
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, PAGE_SIZE, 0, 0,
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, 0,
                              "attempting to start the TPM");
        tpm_buf_destroy(&buf);
 
index dcdfde3..1131a8e 100644 (file)
@@ -83,7 +83,7 @@ static int tpm2_load_context(struct tpm_chip *chip, u8 *buf,
        body_size = sizeof(*ctx) + be16_to_cpu(ctx->blob_size);
        tpm_buf_append(&tbuf, &buf[*offset], body_size);
 
-       rc = tpm_transmit_cmd(chip, NULL, tbuf.data, PAGE_SIZE, 4,
+       rc = tpm_transmit_cmd(chip, NULL, &tbuf, 4,
                              TPM_TRANSMIT_NESTED, NULL);
        if (rc < 0) {
                dev_warn(&chip->dev, "%s: failed with a system error %d\n",
@@ -132,7 +132,7 @@ static int tpm2_save_context(struct tpm_chip *chip, u32 handle, u8 *buf,
 
        tpm_buf_append_u32(&tbuf, handle);
 
-       rc = tpm_transmit_cmd(chip, NULL, tbuf.data, PAGE_SIZE, 0,
+       rc = tpm_transmit_cmd(chip, NULL, &tbuf, 0,
                              TPM_TRANSMIT_NESTED, NULL);
        if (rc < 0) {
                dev_warn(&chip->dev, "%s: failed with a system error %d\n",
index ecbb63f..ed9a163 100644 (file)
@@ -416,8 +416,7 @@ static int vtpm_proxy_request_locality(struct tpm_chip *chip, int locality)
 
        proxy_dev->state |= STATE_DRIVER_COMMAND;
 
-       rc = tpm_transmit_cmd(chip, NULL, buf.data, tpm_buf_length(&buf), 0,
-                             TPM_TRANSMIT_NESTED,
+       rc = tpm_transmit_cmd(chip, NULL, &buf, 0, TPM_TRANSMIT_NESTED,
                              "attempting to set locality");
 
        proxy_dev->state &= ~STATE_DRIVER_COMMAND;