aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/tpm/tpm-sysfs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/char/tpm/tpm-sysfs.c')
-rw-r--r--drivers/char/tpm/tpm-sysfs.c87
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 23struct 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
26static 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};
31static ssize_t pubek_show(struct device *dev, struct device_attribute *attr, 37static 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 }
84out: 92
85 rc = str - buf; 93 rc = str - buf;
94 tpm_buf_destroy(&tpm_buf);
86 return rc; 95 return rc;
87} 96}
88static DEVICE_ATTR_RO(pubek); 97static DEVICE_ATTR_RO(pubek);