2424 */
2525
2626
27- #include "wolfssl/wolfcrypt/types.h"
28- #include <wolftpm/tpm2.h>
29- #include <wolftpm/tpm2_wrap.h>
30-
31- #include <stdio.h>
3227
33- #include <hal/tpm_io.h>
28+ #include <wolfssl/wolfcrypt/settings.h>
29+ #include <wolfssl/wolfcrypt/ecc.h>
3430#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
3536
3637/* Prefer SHA2-256 for PCR's, and all TPM 2.0 devices support it */
3738#define USE_PCR_ALG TPM_ALG_SHA256
38- enum sign_alg {
39- ECC256 = 0 ,
40- };
4139
4240static void usage (void )
4341{
4442 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 );
4947 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" );
5152}
5253
5354
@@ -98,8 +99,8 @@ static int loadFile(const char* fname, byte** buf, size_t* bufLen)
9899}
99100
100101/* 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 )
103104{
104105 int rc = 0 ;
105106 byte * buf = NULL ;
@@ -114,8 +115,8 @@ static int PolicySign(enum sign_alg alg, const char* keyFile, byte* hash,
114115 #endif
115116 } key ;
116117
117- XMEMSET (& key , 0 , sizeof (key ));
118- XMEMSET (& rng , 0 , sizeof (rng ));
118+ memset (& key , 0 , sizeof (key ));
119+ memset (& rng , 0 , sizeof (rng ));
119120
120121 rc = wc_InitRng (& rng );
121122 if (rc != 0 ) {
@@ -124,20 +125,21 @@ static int PolicySign(enum sign_alg alg, const char* keyFile, byte* hash,
124125 }
125126
126127 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 ;
128132 rc = wc_ecc_init (& key .ecc );
129133 if (rc == 0 ) {
130134 rc = wc_ecc_import_unsigned (& key .ecc , buf ,
131- (buf ) + 32 , buf + 64 ,
132- ECC_SECP256R1 );
135+ (buf ) + keySz , buf + (keySz * 2 ), alg );
133136 if (rc == 0 ) {
134137 mp_int r , s ;
135138 rc = mp_init_multi (& r , & s , NULL , NULL , NULL , NULL );
136139 if (rc == 0 ) {
137140 rc = wc_ecc_sign_hash_ex (hash , hashSz , & rng , & key .ecc , & r , & s );
138141 }
139142 if (rc == 0 ) {
140- word32 keySz = key .ecc .dp -> size ;
141143 mp_to_unsigned_bin (& r , sig );
142144 mp_to_unsigned_bin (& s , sig + keySz );
143145 mp_clear (& r );
@@ -231,10 +233,10 @@ int policy_sign(int argc, char *argv[])
231233 int i ;
232234 int rc = -1 ;
233235 TPM_ALG_ID pcrAlg = USE_PCR_ALG ;
234- enum sign_alg alg ;
236+ int alg = ECC_SECP256R1 ;
235237 byte pcrArray [PCR_SELECT_MAX * 2 ];
236238 word32 pcrArraySz = 0 ;
237- const char * keyFile = NULL ;
239+ const char * keyFile = "wolfboot_signing_private_key.der" ;
238240 const char * outPolicyFile = "policy.bin.sig" ;
239241 byte pcrDigest [WC_MAX_DIGEST_SIZE ];
240242 word32 pcrDigestSz = 0 ;
@@ -257,7 +259,10 @@ int policy_sign(int argc, char *argv[])
257259 }
258260 while (argc > 1 ) {
259261 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 ;
261266 }
262267 else if (strncmp (argv [argc - 1 ], "-pcr=" , strlen ("-pcr=" )) == 0 ) {
263268 const char * pcrStr = argv [argc - 1 ] + strlen ("-pcr=" );
@@ -310,7 +315,18 @@ int policy_sign(int argc, char *argv[])
310315 argc -- ;
311316 }
312317
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+ );
314330
315331 printf ("PCR Index(s) (%s): " , TPM2_GetAlgName (pcrAlg ));
316332 for (i = 0 ; i < (int )pcrArraySz ; i ++ ) {
@@ -327,20 +343,18 @@ int policy_sign(int argc, char *argv[])
327343 printf ("Policy Signing Key: %s\n" , keyFile );
328344 }
329345
330- /* PCR Hash - Use provided hash or read PCR's and get hash */
346+ /* PCR Hash - Use provided PCR digest or Policy digest */
331347 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 ;
339351 }
352+ printf ("PCR Digest (%d bytes):\n" , pcrDigestSz );
353+ printHexString (pcrDigest , pcrDigestSz , pcrDigestSz );
340354
341355 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 ));
344358 digestSz = TPM2_GetHashDigestSize (pcrAlg );
345359 rc = wolfTPM2_PolicyPCRMake (pcrAlg , pcrArray , pcrArraySz ,
346360 pcrDigest , pcrDigestSz , digest , & digestSz );
@@ -358,28 +372,24 @@ int policy_sign(int argc, char *argv[])
358372 printHexString (digest , digestSz , digestSz );
359373
360374 /* 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 ));
363388 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 );
374391 }
375392 }
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- }
383393
384394exit :
385395 if (rc != 0 ) {
0 commit comments