24
24
*/
25
25
26
26
27
- #include "wolfssl/wolfcrypt/types.h"
28
- #include <wolftpm/tpm2.h>
29
- #include <wolftpm/tpm2_wrap.h>
30
-
31
- #include <stdio.h>
32
27
33
- #include <hal/tpm_io.h>
28
+ #include <wolfssl/wolfcrypt/settings.h>
29
+ #include <wolfssl/wolfcrypt/ecc.h>
34
30
#include <wolfssl/wolfcrypt/hash.h>
31
+ #include <wolftpm/tpm2_wrap.h>
32
+ #include "tpm.h"
33
+
34
+ /* Default PCR (test) */
35
+ #define DEFAULT_PCR 16
35
36
36
37
/* Prefer SHA2-256 for PCR's, and all TPM 2.0 devices support it */
37
38
#define USE_PCR_ALG TPM_ALG_SHA256
38
- enum sign_alg {
39
- ECC256 = 0 ,
40
- };
41
39
42
40
static void usage (void )
43
41
{
44
42
printf ("Expected usage:\n" );
45
- printf ("./examples/pcr/policy_sign [-ecc256] [-key=pem/der] [-pcr] [-pcrdisgest ] [-outpolicy=] policy_file \n" );
46
- printf ("* -ecc256: Use ECC256P1 key \n" );
47
- printf ("* -key=keyfile: Private key to sign PCR policy (PEM or DER)\n" );
48
- printf ("* -pcr=index: PCR index < 24 (multiple can be supplied) (default 0 )\n" );
43
+ printf ("./examples/pcr/policy_sign [-ecc256/-ecc384 ] [-key=pem/der] [-pcr= ] [-pcrdigest= ] [-policydigest=][- outpolicy=]\n" );
44
+ printf ("* -ecc256/-ecc384: Key type (currently only ECC) (default SECP256R1) \n" );
45
+ printf ("* -key=keyfile: Private key to sign PCR policy (PEM or DER) (default wolfboot_signing_private_key.der) \n" );
46
+ printf ("* -pcr=index: PCR index < 24 (multiple can be supplied) (default %d )\n" , DEFAULT_PCR );
49
47
printf ("* -pcrdigest=hexstr: PCR Digest (default=Read actual PCR's)\n" );
50
- printf ("* -out=file: Signature file (default policy.bin.sig)\n" );
48
+ printf ("* -policydigest=hexstr: Policy Digest (policy based on PCR digest and PCR(s)\n" );
49
+ printf ("* -outpolicy=file: Signature file (default policy.bin.sig)\n" );
50
+ printf ("Example:\n" );
51
+ printf ("\t./tools/tpm/policy_sign -ecc256 -pcr=0 -pcrdigest=eca4e8eda468b8667244ae972b8240d3244ea72341b2bf2383e79c66643bbecc\n" );
51
52
}
52
53
53
54
@@ -98,8 +99,8 @@ static int loadFile(const char* fname, byte** buf, size_t* bufLen)
98
99
}
99
100
100
101
/* Function to sign policy with external key */
101
- static int PolicySign (enum sign_alg alg , const char * keyFile , byte * hash ,
102
- word32 hashSz , byte * sig , word32 * sigSz )
102
+ static int PolicySign (int alg , const char * keyFile , byte * hash , word32 hashSz ,
103
+ byte * sig , word32 * sigSz )
103
104
{
104
105
int rc = 0 ;
105
106
byte * buf = NULL ;
@@ -114,8 +115,8 @@ static int PolicySign(enum sign_alg alg, const char* keyFile, byte* hash,
114
115
#endif
115
116
} key ;
116
117
117
- XMEMSET (& key , 0 , sizeof (key ));
118
- XMEMSET (& rng , 0 , sizeof (rng ));
118
+ memset (& key , 0 , sizeof (key ));
119
+ memset (& rng , 0 , sizeof (rng ));
119
120
120
121
rc = wc_InitRng (& rng );
121
122
if (rc != 0 ) {
@@ -124,20 +125,21 @@ static int PolicySign(enum sign_alg alg, const char* keyFile, byte* hash,
124
125
}
125
126
126
127
rc = loadFile (keyFile , & buf , & bufSz );
127
- if (rc == 0 && alg == ECC256 ) {
128
+ if (rc == 0 && (alg == ECC_SECP256R1 || alg == ECC_SECP384R1 )) {
129
+ word32 keySz = 32 ;
130
+ if (alg == ECC_SECP384R1 )
131
+ keySz = 48 ;
128
132
rc = wc_ecc_init (& key .ecc );
129
133
if (rc == 0 ) {
130
134
rc = wc_ecc_import_unsigned (& key .ecc , buf ,
131
- (buf ) + 32 , buf + 64 ,
132
- ECC_SECP256R1 );
135
+ (buf ) + keySz , buf + (keySz * 2 ), alg );
133
136
if (rc == 0 ) {
134
137
mp_int r , s ;
135
138
rc = mp_init_multi (& r , & s , NULL , NULL , NULL , NULL );
136
139
if (rc == 0 ) {
137
140
rc = wc_ecc_sign_hash_ex (hash , hashSz , & rng , & key .ecc , & r , & s );
138
141
}
139
142
if (rc == 0 ) {
140
- word32 keySz = key .ecc .dp -> size ;
141
143
mp_to_unsigned_bin (& r , sig );
142
144
mp_to_unsigned_bin (& s , sig + keySz );
143
145
mp_clear (& r );
@@ -231,10 +233,10 @@ int policy_sign(int argc, char *argv[])
231
233
int i ;
232
234
int rc = -1 ;
233
235
TPM_ALG_ID pcrAlg = USE_PCR_ALG ;
234
- enum sign_alg alg ;
236
+ int alg = ECC_SECP256R1 ;
235
237
byte pcrArray [PCR_SELECT_MAX * 2 ];
236
238
word32 pcrArraySz = 0 ;
237
- const char * keyFile = NULL ;
239
+ const char * keyFile = "wolfboot_signing_private_key.der" ;
238
240
const char * outPolicyFile = "policy.bin.sig" ;
239
241
byte pcrDigest [WC_MAX_DIGEST_SIZE ];
240
242
word32 pcrDigestSz = 0 ;
@@ -257,7 +259,10 @@ int policy_sign(int argc, char *argv[])
257
259
}
258
260
while (argc > 1 ) {
259
261
if (XSTRCMP (argv [argc - 1 ], "-ecc256" ) == 0 ) {
260
- alg = ECC256 ;
262
+ alg = ECC_SECP256R1 ;
263
+ }
264
+ else if (XSTRCMP (argv [argc - 1 ], "-ecc384" ) == 0 ) {
265
+ alg = ECC_SECP384R1 ;
261
266
}
262
267
else if (strncmp (argv [argc - 1 ], "-pcr=" , strlen ("-pcr=" )) == 0 ) {
263
268
const char * pcrStr = argv [argc - 1 ] + strlen ("-pcr=" );
@@ -310,7 +315,18 @@ int policy_sign(int argc, char *argv[])
310
315
argc -- ;
311
316
}
312
317
313
- printf ("Sign PCR Policy Example\n" );
318
+ printf ("Sign PCR Policy Tool\n" );
319
+
320
+ if (pcrArraySz == 0 ) {
321
+ pcrArray [pcrArraySz ] = DEFAULT_PCR ;
322
+ pcrArraySz ++ ;
323
+ }
324
+
325
+ printf ("Signing Algorithm: %s\n" ,
326
+ (alg == ECC_SECP256R1 ) ? "ECC256" :
327
+ (alg == ECC_SECP384R1 ) ? "ECC384" :
328
+ "Unknown"
329
+ );
314
330
315
331
printf ("PCR Index(s) (%s): " , TPM2_GetAlgName (pcrAlg ));
316
332
for (i = 0 ; i < (int )pcrArraySz ; i ++ ) {
@@ -327,20 +343,18 @@ int policy_sign(int argc, char *argv[])
327
343
printf ("Policy Signing Key: %s\n" , keyFile );
328
344
}
329
345
330
- /* PCR Hash - Use provided hash or read PCR's and get hash */
346
+ /* PCR Hash - Use provided PCR digest or Policy digest */
331
347
if (pcrDigestSz == 0 && digestSz == 0 ) {
332
- printf ("Error: Specificy PCR's or Policy hash!\n" );
333
- goto exit ;
334
- }
335
-
336
- if (pcrDigestSz > 0 ) {
337
- printf ("PCR Digest (%d bytes):\n" , pcrDigestSz );
338
- printHexString (pcrDigest , pcrDigestSz , pcrDigestSz );
348
+ printf ("Error: Must supply either PCR or Policy digest!\n" );
349
+ usage ();
350
+ return -1 ;
339
351
}
352
+ printf ("PCR Digest (%d bytes):\n" , pcrDigestSz );
353
+ printHexString (pcrDigest , pcrDigestSz , pcrDigestSz );
340
354
341
355
if (digestSz == 0 ) {
342
- /* Build PCR Policy to Sign */
343
- XMEMSET (digest , 0 , sizeof (digest ));
356
+ /* If not supplied, build PCR Policy to Sign */
357
+ memset (digest , 0 , sizeof (digest ));
344
358
digestSz = TPM2_GetHashDigestSize (pcrAlg );
345
359
rc = wolfTPM2_PolicyPCRMake (pcrAlg , pcrArray , pcrArraySz ,
346
360
pcrDigest , pcrDigestSz , digest , & digestSz );
@@ -358,28 +372,24 @@ int policy_sign(int argc, char *argv[])
358
372
printHexString (digest , digestSz , digestSz );
359
373
360
374
/* Sign the PCR policy (use private key provided or do externally) */
361
- if (keyFile != NULL ) {
362
- rc = PolicySign (alg , keyFile , digest , digestSz , sig , & sigSz );
375
+ rc = PolicySign (alg , keyFile , digest , digestSz , sig , & sigSz );
376
+ if (rc == 0 ) {
377
+ pcrMask = 0 ;
378
+ for (i = 0 ; i < (int )pcrArraySz ; i ++ )
379
+ pcrMask |= (1 << pcrArray [i ]);
380
+
381
+ memcpy (policy , & pcrMask , sizeof (pcrMask ));
382
+ memcpy (policy + sizeof (pcrMask ), sig , sigSz );
383
+ printf ("PCR Mask (0x%x) and Policy Signature (%d bytes):\n" ,
384
+ (int )pcrMask , (int )(sigSz + sizeof (pcrMask )));
385
+ printHexString (policy , sizeof (pcrMask ), 0 );
386
+ printHexString (policy + sizeof (pcrMask ), sigSz , 32 );
387
+ rc = writeBin (outPolicyFile , policy , sigSz + sizeof (pcrMask ));
363
388
if (rc == 0 ) {
364
- pcrMask = 0 ;
365
- for (i = 0 ; i < (int )pcrArraySz ; i ++ )
366
- pcrMask |= (1 << pcrArray [i ]);
367
-
368
- memcpy (policy , & pcrMask , sizeof (pcrMask ));
369
- memcpy (policy + sizeof (pcrMask ), sig , sigSz );
370
- printf ("PCR Mask (0x%x) and Policy Signature (%d bytes):\n" , (int )pcrMask ,
371
- (int )(sigSz + sizeof (pcrMask )));
372
- printHexString (policy , sigSz + sizeof (pcrMask ), 32 );
373
- rc = writeBin (outPolicyFile , policy , sigSz + sizeof (pcrMask ));
389
+ printf ("Wrote PCR Mask + Signature (%d bytes) to %s\n" ,
390
+ (int )(sigSz + sizeof (pcrMask )), outPolicyFile );
374
391
}
375
392
}
376
- else {
377
- /* Print policy hash to sign externally and exit early */
378
- printf ("No private key to sign policy!\n" );
379
- printf ("Externally sign the PCR Policy digest\n" );
380
- rc = 0 ;
381
- goto exit ;
382
- }
383
393
384
394
exit :
385
395
if (rc != 0 ) {
0 commit comments