diff options
Diffstat (limited to 'drivers/char/tpm/tpm-sysfs.c')
-rw-r--r-- | drivers/char/tpm/tpm-sysfs.c | 87 |
1 files changed, 48 insertions, 39 deletions
diff --git a/drivers/char/tpm/tpm-sysfs.c b/drivers/char/tpm/tpm-sysfs.c index 86f38d239476..83a77a445538 100644 --- a/drivers/char/tpm/tpm-sysfs.c +++ b/drivers/char/tpm/tpm-sysfs.c | |||
@@ -20,44 +20,48 @@ | |||
20 | #include <linux/device.h> | 20 | #include <linux/device.h> |
21 | #include "tpm.h" | 21 | #include "tpm.h" |
22 | 22 | ||
23 | #define READ_PUBEK_RESULT_SIZE 314 | 23 | struct tpm_readpubek_out { |
24 | u8 algorithm[4]; | ||
25 | u8 encscheme[2]; | ||
26 | u8 sigscheme[2]; | ||
27 | __be32 paramsize; | ||
28 | u8 parameters[12]; | ||
29 | __be32 keysize; | ||
30 | u8 modulus[256]; | ||
31 | u8 checksum[20]; | ||
32 | } __packed; | ||
33 | |||
24 | #define READ_PUBEK_RESULT_MIN_BODY_SIZE (28 + 256) | 34 | #define READ_PUBEK_RESULT_MIN_BODY_SIZE (28 + 256) |
25 | #define TPM_ORD_READPUBEK 124 | 35 | #define TPM_ORD_READPUBEK 124 |
26 | static const struct tpm_input_header tpm_readpubek_header = { | 36 | |
27 | .tag = cpu_to_be16(TPM_TAG_RQU_COMMAND), | ||
28 | .length = cpu_to_be32(30), | ||
29 | .ordinal = cpu_to_be32(TPM_ORD_READPUBEK) | ||
30 | }; | ||
31 | static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, | 37 | static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, |
32 | char *buf) | 38 | char *buf) |
33 | { | 39 | { |
34 | u8 *data; | 40 | struct tpm_buf tpm_buf; |
35 | struct tpm_cmd_t tpm_cmd; | 41 | struct tpm_readpubek_out *out; |
36 | ssize_t err; | 42 | ssize_t rc; |
37 | int i, rc; | 43 | int i; |
38 | char *str = buf; | 44 | char *str = buf; |
39 | struct tpm_chip *chip = to_tpm_chip(dev); | 45 | struct tpm_chip *chip = to_tpm_chip(dev); |
46 | char anti_replay[20]; | ||
40 | 47 | ||
41 | memset(&tpm_cmd, 0, sizeof(tpm_cmd)); | 48 | memset(&anti_replay, 0, sizeof(anti_replay)); |
42 | 49 | ||
43 | tpm_cmd.header.in = tpm_readpubek_header; | 50 | rc = tpm_buf_init(&tpm_buf, TPM_TAG_RQU_COMMAND, TPM_ORD_READPUBEK); |
44 | err = tpm_transmit_cmd(chip, NULL, &tpm_cmd, READ_PUBEK_RESULT_SIZE, | 51 | if (rc) |
45 | READ_PUBEK_RESULT_MIN_BODY_SIZE, 0, | 52 | return rc; |
46 | "attempting to read the PUBEK"); | 53 | |
47 | if (err) | 54 | tpm_buf_append(&tpm_buf, anti_replay, sizeof(anti_replay)); |
48 | goto out; | 55 | |
49 | 56 | rc = tpm_transmit_cmd(chip, NULL, tpm_buf.data, PAGE_SIZE, | |
50 | /* | 57 | READ_PUBEK_RESULT_MIN_BODY_SIZE, 0, |
51 | ignore header 10 bytes | 58 | "attempting to read the PUBEK"); |
52 | algorithm 32 bits (1 == RSA ) | 59 | if (rc) { |
53 | encscheme 16 bits | 60 | tpm_buf_destroy(&tpm_buf); |
54 | sigscheme 16 bits | 61 | return 0; |
55 | parameters (RSA 12->bytes: keybit, #primes, expbit) | 62 | } |
56 | keylenbytes 32 bits | 63 | |
57 | 256 byte modulus | 64 | out = (struct tpm_readpubek_out *)&tpm_buf.data[10]; |
58 | ignore checksum 20 bytes | ||
59 | */ | ||
60 | data = tpm_cmd.params.readpubek_out_buffer; | ||
61 | str += | 65 | str += |
62 | sprintf(str, | 66 | sprintf(str, |
63 | "Algorithm: %02X %02X %02X %02X\n" | 67 | "Algorithm: %02X %02X %02X %02X\n" |
@@ -68,21 +72,26 @@ static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, | |||
68 | "%02X %02X %02X %02X\n" | 72 | "%02X %02X %02X %02X\n" |
69 | "Modulus length: %d\n" | 73 | "Modulus length: %d\n" |
70 | "Modulus:\n", | 74 | "Modulus:\n", |
71 | data[0], data[1], data[2], data[3], | 75 | out->algorithm[0], out->algorithm[1], out->algorithm[2], |
72 | data[4], data[5], | 76 | out->algorithm[3], |
73 | data[6], data[7], | 77 | out->encscheme[0], out->encscheme[1], |
74 | data[12], data[13], data[14], data[15], | 78 | out->sigscheme[0], out->sigscheme[1], |
75 | data[16], data[17], data[18], data[19], | 79 | out->parameters[0], out->parameters[1], |
76 | data[20], data[21], data[22], data[23], | 80 | out->parameters[2], out->parameters[3], |
77 | be32_to_cpu(*((__be32 *) (data + 24)))); | 81 | out->parameters[4], out->parameters[5], |
82 | out->parameters[6], out->parameters[7], | ||
83 | out->parameters[8], out->parameters[9], | ||
84 | out->parameters[10], out->parameters[11], | ||
85 | be32_to_cpu(out->keysize)); | ||
78 | 86 | ||
79 | for (i = 0; i < 256; i++) { | 87 | for (i = 0; i < 256; i++) { |
80 | str += sprintf(str, "%02X ", data[i + 28]); | 88 | str += sprintf(str, "%02X ", out->modulus[i]); |
81 | if ((i + 1) % 16 == 0) | 89 | if ((i + 1) % 16 == 0) |
82 | str += sprintf(str, "\n"); | 90 | str += sprintf(str, "\n"); |
83 | } | 91 | } |
84 | out: | 92 | |
85 | rc = str - buf; | 93 | rc = str - buf; |
94 | tpm_buf_destroy(&tpm_buf); | ||
86 | return rc; | 95 | return rc; |
87 | } | 96 | } |
88 | static DEVICE_ATTR_RO(pubek); | 97 | static DEVICE_ATTR_RO(pubek); |