1717
1818#include "test_pkcs11.h"
1919
20+ #include "wolfpkcs11/pkcs11.h"
21+
2022#include <wolfssl/wolfcrypt/types.h>
2123#include <wolfssl/wolfcrypt/settings.h>
24+ #include <wolfssl/wolfcrypt/wc_port.h>
25+ #include <wolfssl/wolfcrypt/wc_pkcs11.h>
26+ #include <wolfssl/wolfcrypt/sha256.h>
2227#include <string.h>
2328#include <stdio.h>
2429
25- #include "wolfpkcs11/pkcs11.h"
26-
2730extern const char pkcs11_library_name [];
2831extern const CK_FUNCTION_LIST wolfpkcs11nsFunctionList ;
2932
3033static const CK_BYTE test_token_label [32 ] = {
3134 'E' ,'c' ,'c' ,'K' ,'e' ,'y' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,
3235 ' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' '
3336};
37+ static const char test_token_name [] = "EccKey" ;
3438static const CK_BYTE test_so_pin [] = "0123456789ABCDEF" ;
35- static const CK_BYTE test_user_pin [] = "ABCDEF0123456789" ;
39+ static const CK_BYTE test_user_pin [] = "0123456789ABCDEF" ;
40+ static const CK_BYTE test_so_pin_label [] = "SO-PIN" ;
3641static const CK_BYTE test_key_id [] = { 0x57 , 0x42 , 0x50 , 0x31 };
3742static const CK_BYTE test_pub_label [] = "wolfBoot PKCS11 demo pub" ;
3843static const CK_BYTE test_priv_label [] = "wolfBoot PKCS11 demo priv" ;
@@ -73,6 +78,22 @@ static int test_pkcs11_ck_ok(const char *label, CK_RV rv)
7378 return 0 ;
7479}
7580
81+ static void test_pkcs11_log_blob_checksum (const struct test_pkcs11_blob * blob ,
82+ const char * prefix )
83+ {
84+ byte digest [WC_SHA256_DIGEST_SIZE ];
85+ word32 blob_len = (word32 )(blob -> payload_len + blob -> sig_len );
86+ word32 i ;
87+
88+ if (wc_Sha256Hash (blob -> data , blob_len , digest ) != 0 )
89+ return ;
90+
91+ printf ("pkcs11: %s blob_sha256=" , prefix );
92+ for (i = 0 ; i < (word32 )sizeof (digest ); i ++ )
93+ printf ("%02x" , digest [i ]);
94+ printf ("\r\n" );
95+ }
96+
7697static int test_pkcs11_find_one (CK_SESSION_HANDLE session ,
7798 CK_ATTRIBUTE_PTR tmpl , CK_ULONG tmpl_count , CK_OBJECT_HANDLE * obj )
7899{
@@ -159,32 +180,46 @@ static int test_pkcs11_log_obj_attr(CK_SESSION_HANDLE session, CK_OBJECT_HANDLE
159180 return 0 ;
160181}
161182
162- static int test_pkcs11_init_token_if_needed (void )
183+ static int test_pkcs11_provision_token (void )
163184{
185+ int ret ;
164186 CK_RV rv ;
165- CK_TOKEN_INFO info ;
166- CK_SESSION_HANDLE session ;
187+ CK_SESSION_HANDLE session = CK_INVALID_HANDLE ;
188+ Pkcs11Token token ;
189+ Pkcs11Dev dev ;
167190
168- rv = wolfpkcs11nsFunctionList .C_GetTokenInfo (TEST_PKCS11_SLOT_ID , & info );
169- if (rv == CKR_OK && (info .flags & CKF_TOKEN_INITIALIZED ))
170- return 0 ;
191+ printf ("pkcs11: provisioning token\r\n" );
192+
193+ dev .heap = NULL ;
194+ dev .func = (CK_FUNCTION_LIST * )& wolfpkcs11nsFunctionList ;
195+
196+ ret = wc_Pkcs11Token_Init (& token , & dev , (int )TEST_PKCS11_SLOT_ID ,
197+ test_token_name , test_user_pin , (int )(sizeof (test_user_pin ) - 1 ));
198+ if (ret != 0 ) {
199+ printf ("pkcs11: wc_Pkcs11Token_Init ret=%d\r\n" , ret );
200+ return -1 ;
201+ }
171202
172- printf ("pkcs11: initializing token\r\n" );
173203 rv = wolfpkcs11nsFunctionList .C_InitToken (TEST_PKCS11_SLOT_ID ,
174204 (CK_UTF8CHAR_PTR )test_so_pin , (CK_ULONG )(sizeof (test_so_pin ) - 1 ),
175205 (CK_UTF8CHAR_PTR )test_token_label );
176- if (test_pkcs11_ck_ok ("C_InitToken" , rv ) < 0 )
206+ if (test_pkcs11_ck_ok ("C_InitToken" , rv ) < 0 ) {
207+ wc_Pkcs11Token_Final (& token );
177208 return -1 ;
209+ }
178210
179211 rv = wolfpkcs11nsFunctionList .C_OpenSession (TEST_PKCS11_SLOT_ID ,
180212 CKF_SERIAL_SESSION | CKF_RW_SESSION , NULL , NULL , & session );
181- if (test_pkcs11_ck_ok ("C_OpenSession(SO)" , rv ) < 0 )
213+ if (test_pkcs11_ck_ok ("C_OpenSession(SO)" , rv ) < 0 ) {
214+ wc_Pkcs11Token_Final (& token );
182215 return -1 ;
216+ }
183217
184218 rv = wolfpkcs11nsFunctionList .C_Login (session , CKU_SO ,
185219 (CK_UTF8CHAR_PTR )test_so_pin , (CK_ULONG )(sizeof (test_so_pin ) - 1 ));
186220 if (test_pkcs11_ck_ok ("C_Login(SO)" , rv ) < 0 ) {
187221 (void )wolfpkcs11nsFunctionList .C_CloseSession (session );
222+ wc_Pkcs11Token_Final (& token );
188223 return -1 ;
189224 }
190225
@@ -193,11 +228,13 @@ static int test_pkcs11_init_token_if_needed(void)
193228 if (test_pkcs11_ck_ok ("C_InitPIN" , rv ) < 0 ) {
194229 (void )wolfpkcs11nsFunctionList .C_Logout (session );
195230 (void )wolfpkcs11nsFunctionList .C_CloseSession (session );
231+ wc_Pkcs11Token_Final (& token );
196232 return -1 ;
197233 }
198234
199235 (void )wolfpkcs11nsFunctionList .C_Logout (session );
200236 (void )wolfpkcs11nsFunctionList .C_CloseSession (session );
237+ wc_Pkcs11Token_Final (& token );
201238 return 0 ;
202239}
203240
@@ -310,7 +347,7 @@ static int test_pkcs11_sign_payload(CK_SESSION_HANDLE session,
310347 CK_ULONG payload_len = (CK_ULONG )(sizeof (test_payload ) - 1 );
311348 CK_ULONG sig_len = (CK_ULONG )(sizeof (blob -> data ) - payload_len );
312349
313- mech .mechanism = CKM_ECDSA ;
350+ mech .mechanism = CKM_ECDSA_SHA256 ;
314351 mech .pParameter = NULL ;
315352 mech .ulParameterLen = 0 ;
316353
@@ -333,6 +370,7 @@ static int test_pkcs11_sign_payload(CK_SESSION_HANDLE session,
333370
334371 printf ("pkcs11: signed payload len=%lu sig_len=%lu\r\n" ,
335372 (unsigned long )blob -> payload_len , (unsigned long )blob -> sig_len );
373+ test_pkcs11_log_blob_checksum (blob , "created" );
336374 return 0 ;
337375}
338376
@@ -376,6 +414,7 @@ static int test_pkcs11_load_blob(CK_SESSION_HANDLE session,
376414
377415 printf ("pkcs11: restored blob payload_len=%lu sig_len=%lu\r\n" ,
378416 (unsigned long )blob -> payload_len , (unsigned long )blob -> sig_len );
417+ test_pkcs11_log_blob_checksum (blob , "restored" );
379418 return 0 ;
380419}
381420
@@ -385,7 +424,7 @@ static int test_pkcs11_verify_blob(CK_SESSION_HANDLE session,
385424 CK_RV rv ;
386425 CK_MECHANISM mech ;
387426
388- mech .mechanism = CKM_ECDSA ;
427+ mech .mechanism = CKM_ECDSA_SHA256 ;
389428 mech .pParameter = NULL ;
390429 mech .ulParameterLen = 0 ;
391430
@@ -421,52 +460,76 @@ static int test_pkcs11_log_key_attrs(CK_SESSION_HANDLE session,
421460
422461int test_pkcs11_start (void )
423462{
463+ int wc_ret ;
424464 CK_RV rv ;
425465 CK_SESSION_HANDLE session = CK_INVALID_HANDLE ;
426466 CK_OBJECT_HANDLE pub_obj = CK_INVALID_HANDLE ;
427467 CK_OBJECT_HANDLE priv_obj = CK_INVALID_HANDLE ;
428468 CK_OBJECT_HANDLE data_obj = CK_INVALID_HANDLE ;
429469 struct test_pkcs11_blob blob ;
430470 int ret ;
471+ int key_state ;
472+ int data_state ;
473+ int result = PKCS11_TEST_FAIL ;
431474
432475 memset (& blob , 0 , sizeof (blob ));
433476
434477 printf ("pkcs11: start\r\n" );
435478 printf ("pkcs11: secure provider=%s\r\n" , pkcs11_library_name );
436479
437- rv = wolfpkcs11nsFunctionList .C_Initialize (NULL );
438- if (test_pkcs11_ck_ok ("C_Initialize" , rv ) < 0 )
480+ wc_ret = wolfCrypt_Init ();
481+ if (wc_ret != 0 ) {
482+ printf ("pkcs11: wolfCrypt_Init ret=%d\r\n" , wc_ret );
439483 return -1 ;
484+ }
440485
441- if (test_pkcs11_init_token_if_needed () < 0 ) {
442- (void )wolfpkcs11nsFunctionList .C_Finalize (NULL );
486+ rv = wolfpkcs11nsFunctionList .C_Initialize (NULL );
487+ if (test_pkcs11_ck_ok ("C_Initialize" , rv ) < 0 ) {
488+ wolfCrypt_Cleanup ();
443489 return -1 ;
444490 }
445491
446492 ret = test_pkcs11_open_user_session (& session );
447493 if (ret == -2 ) {
448- (void )wolfpkcs11nsFunctionList .C_Finalize (NULL );
449- return -1 ;
494+ printf ("pkcs11: first boot path, provisioning token\r\n" );
495+ if (test_pkcs11_provision_token () < 0 ) {
496+ (void )wolfpkcs11nsFunctionList .C_Finalize (NULL );
497+ wolfCrypt_Cleanup ();
498+ return -1 ;
499+ }
500+ ret = test_pkcs11_open_user_session (& session );
450501 }
451502 if (ret < 0 ) {
452503 (void )wolfpkcs11nsFunctionList .C_Finalize (NULL );
504+ wolfCrypt_Cleanup ();
453505 return -1 ;
454506 }
455507
456- ret = test_pkcs11_find_keypair (session , & pub_obj , & priv_obj );
457- if (ret < 0 ) {
508+ key_state = test_pkcs11_find_keypair (session , & pub_obj , & priv_obj );
509+ if (key_state < 0 ) {
510+ ret = -1 ;
511+ goto cleanup ;
512+ }
513+
514+ data_state = test_pkcs11_find_data_obj (session , & data_obj );
515+ if (data_state < 0 ) {
458516 (void )wolfpkcs11nsFunctionList .C_Logout (session );
459517 (void )wolfpkcs11nsFunctionList .C_CloseSession (session );
460518 (void )wolfpkcs11nsFunctionList .C_Finalize (NULL );
519+ wolfCrypt_Cleanup ();
461520 return -1 ;
462521 }
463522
464- if (ret == 1 ) {
523+ if (key_state == 1 && data_state == 1 ) {
465524 printf ("pkcs11: first boot path, creating persistent objects\r\n" );
466525 if (test_pkcs11_generate_keypair (session , & pub_obj , & priv_obj ) < 0 )
467526 ret = -1 ;
468- if (ret == 1 || ret == 0 )
527+ else
528+ ret = 0 ;
529+ if (ret == 0 )
469530 ret = test_pkcs11_sign_payload (session , priv_obj , & blob );
531+ if (ret == 0 )
532+ ret = test_pkcs11_verify_blob (session , pub_obj , & blob );
470533 if (ret == 0 )
471534 ret = test_pkcs11_store_blob (session , & blob , & data_obj );
472535 if (ret == 0 )
@@ -477,12 +540,12 @@ int test_pkcs11_start(void)
477540 ret = test_pkcs11_log_obj_attr (session , data_obj , "data" , CKA_OBJECT_ID );
478541 if (ret == 0 )
479542 printf ("pkcs11: created persistent PKCS11 objects\r\n" );
543+ if (ret == 0 )
544+ result = PKCS11_TEST_FIRST_BOOT_OK ;
480545 }
481- else {
546+ else if ( key_state == 0 && data_state == 0 ) {
482547 printf ("pkcs11: second boot path, restoring persistent objects\r\n" );
483- ret = test_pkcs11_find_data_obj (session , & data_obj );
484- if (ret == 0 )
485- ret = test_pkcs11_load_blob (session , data_obj , & blob );
548+ ret = test_pkcs11_load_blob (session , data_obj , & blob );
486549 if (ret == 0 )
487550 ret = test_pkcs11_log_key_attrs (session , pub_obj , priv_obj );
488551 if (ret == 0 )
@@ -491,18 +554,27 @@ int test_pkcs11_start(void)
491554 ret = test_pkcs11_verify_blob (session , pub_obj , & blob );
492555 if (ret == 0 )
493556 printf ("pkcs11: restored persistent PKCS11 objects\r\n" );
557+ if (ret == 0 )
558+ result = PKCS11_TEST_SECOND_BOOT_OK ;
559+ }
560+ else {
561+ printf ("pkcs11: inconsistent persistent state key_state=%d data_state=%d\r\n" ,
562+ key_state , data_state );
563+ ret = -1 ;
494564 }
495565
566+ cleanup :
496567 (void )wolfpkcs11nsFunctionList .C_Logout (session );
497568 (void )wolfpkcs11nsFunctionList .C_CloseSession (session );
498569 (void )wolfpkcs11nsFunctionList .C_Finalize (NULL );
570+ (void )wolfCrypt_Cleanup ();
499571
500572 if (ret == 0 )
501573 printf ("pkcs11: success\r\n" );
502574 else
503575 printf ("pkcs11: failure\r\n" );
504576
505- return ret ;
577+ return ( ret == 0 ) ? result : PKCS11_TEST_FAIL ;
506578}
507579
508580#else
0 commit comments