|
@@ -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);
|