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