@@ -409,13 +409,16 @@ static void test_wolfTPM2_CSR(void)
409409
410410#if !defined(WOLFTPM2_NO_WOLFCRYPT ) && defined(HAVE_ECC ) && \
411411 !defined(WOLFTPM2_NO_ASN )
412+ #define FLAGS_USE_WOLFCRYPT (1 << 0)
413+ #define FLAGS_USE_CRYPTO_CB (1 << 1)
414+ #define FLAGS_USE_PK_CB (1 << 2) /* requires TLS layer to test */
412415static void test_wolfTPM2_EccSignVerifyDig (WOLFTPM2_DEV * dev ,
413416 WOLFTPM2_KEY * storageKey , const byte * digest , int digestSz ,
414- TPM_ECC_CURVE curve , TPMI_ALG_HASH hashAlg )
417+ TPM_ECC_CURVE curve , TPMI_ALG_HASH hashAlg , int flags )
415418{
416419 int rc ;
417420 int verifyRes = 0 ;
418- WOLFTPM2_KEY eccKey ;
421+ WOLFTPM2_KEYBLOB eccKey ;
419422 TPMT_PUBLIC publicTemplate ;
420423 byte sigRs [MAX_ECC_BYTES * 2 ];
421424 word32 sigRsSz = (word32 )sizeof (sigRs );
@@ -425,6 +428,21 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
425428 word32 rLen , sLen ;
426429 ecc_key wolfKey ;
427430 int curveSize = TPM2_GetCurveSize (curve );
431+ #ifdef WOLF_CRYPTO_CB
432+ int tpmDevId = INVALID_DEVID ;
433+ TpmCryptoDevCtx tpmCtx ;
434+
435+ XMEMSET (& tpmCtx , 0 , sizeof (tpmCtx ));
436+ tpmCtx .dev = dev ;
437+ tpmCtx .ecdsaKey = & eccKey ;
438+ tpmCtx .storageKey = storageKey ;
439+
440+ if (flags & FLAGS_USE_CRYPTO_CB ) {
441+ rc = wolfTPM2_SetCryptoDevCb (dev , wolfTPM2_CryptoDevCb , & tpmCtx ,
442+ & tpmDevId );
443+ AssertIntEQ (rc , 0 );
444+ }
445+ #endif
428446
429447 /* -- Use TPM key to sign and verify with wolfCrypt -- */
430448 /* Create ECC key for signing */
@@ -433,37 +451,45 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
433451 TPMA_OBJECT_sign | TPMA_OBJECT_noDA ),
434452 curve , TPM_ALG_ECDSA , hashAlg );
435453 AssertIntEQ (rc , 0 );
436- rc = wolfTPM2_CreateAndLoadKey (dev , & eccKey , & storageKey -> handle ,
454+
455+ /* Use create key and load key directly instead to make
456+ * sure the private portion is populated */
457+ rc = wolfTPM2_CreateKey (dev , & eccKey , & storageKey -> handle ,
437458 & publicTemplate , (byte * )gKeyAuth , sizeof (gKeyAuth )- 1 );
459+ if (rc == TPM_RC_SUCCESS ) {
460+ rc = wolfTPM2_LoadKey (dev , & eccKey , & storageKey -> handle );
461+ }
438462 if ((rc & TPM_RC_HASH ) == TPM_RC_HASH ) {
439463 printf ("Hash type not supported... Skipping\n" );
440464 return ;
441465 }
466+ if ((rc & TPM_RC_CURVE ) == TPM_RC_CURVE ) {
467+ printf ("Curve not supported... Skipping\n" );
468+ return ;
469+ }
442470 AssertIntEQ (rc , 0 );
443471
444472 /* Sign with TPM */
445- rc = wolfTPM2_SignHashScheme (dev , & eccKey , digest , digestSz ,
473+ rc = wolfTPM2_SignHashScheme (dev , ( WOLFTPM2_KEY * ) & eccKey , digest , digestSz ,
446474 sigRs , (int * )& sigRsSz , TPM_ALG_ECDSA , hashAlg );
447475 AssertIntEQ (rc , 0 );
448476
449477 /* Make sure leading zero's not required are trimmed */
450478 rLen = sLen = sigRsSz / 2 ;
451479 r = & sigRs [0 ];
452480 s = & sigRs [rLen ];
453- r = TPM2_ASN_TrimZeros (r , & rLen );
454- s = TPM2_ASN_TrimZeros (s , & sLen );
455481
456482 /* Encode ECDSA Header */
457483 sigSz = (word32 )sizeof (sig );
458484 rc = wc_ecc_rs_raw_to_sig (r , rLen , s , sLen , sig , & sigSz );
459485 AssertIntEQ (rc , 0 );
460486
461487 /* Initialize wolfCrypt ECC key */
462- rc = wc_ecc_init (& wolfKey );
488+ rc = wc_ecc_init_ex (& wolfKey , NULL , tpmDevId );
463489 AssertIntEQ (rc , 0 );
464490
465491 /* Convert TPM key to wolfCrypt key for verification */
466- rc = wolfTPM2_EccKey_TpmToWolf (dev , & eccKey , & wolfKey );
492+ rc = wolfTPM2_EccKey_TpmToWolf (dev , ( WOLFTPM2_KEY * ) & eccKey , & wolfKey );
467493 AssertIntEQ (rc , 0 );
468494
469495 /* Verify TPM signature with wolfCrypt */
@@ -474,11 +500,13 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
474500 /* Cleanup first wolfCrypt key */
475501 wc_ecc_free (& wolfKey );
476502 wolfTPM2_UnloadHandle (dev , & eccKey .handle );
477-
503+ #ifdef WOLF_CRYPTO_CB
504+ tpmCtx .ecdsaKey = NULL ; /* create new one */
505+ #endif
478506
479507 /* -- Use wolfCrypt key to sign and verify with TPM -- */
480508 /* Initialize new wolfCrypt ECC key */
481- rc = wc_ecc_init (& wolfKey );
509+ rc = wc_ecc_init_ex (& wolfKey , NULL , tpmDevId );
482510 AssertIntEQ (rc , 0 );
483511
484512 /* Generate new ECC key with wolfCrypt */
@@ -490,17 +518,17 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
490518 rc = wc_ecc_sign_hash (digest , digestSz , sig , & sigSz , wolfTPM2_GetRng (dev ),
491519 & wolfKey );
492520 AssertIntEQ (rc , 0 );
521+ wolfTPM2_UnloadHandle (dev , & eccKey .handle );
493522
494523 /* Decode ECDSA Header */
495524 r = sigRs ;
496525 s = & sigRs [MAX_ECC_BYTES ];
497526 rLen = sLen = MAX_ECC_BYTES ;
498- rc = wc_ecc_sig_to_rs (sig ,
499- sigSz , r , & rLen , s , & sLen );
527+ rc = wc_ecc_sig_to_rs (sig , sigSz , r , & rLen , s , & sLen );
500528 AssertIntEQ (rc , 0 );
501529
502530 /* Convert wolfCrypt key to TPM key for verification */
503- rc = wolfTPM2_EccKey_WolfToTpm (dev , & wolfKey , & eccKey );
531+ rc = wolfTPM2_EccKey_WolfToTpm (dev , & wolfKey , ( WOLFTPM2_KEY * ) & eccKey );
504532 AssertIntEQ (rc , 0 );
505533
506534 /* combine R and S at key size (zero pad leading) */
@@ -510,27 +538,73 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
510538 XMEMSET (& sigRs [curveSize ], 0 , curveSize - sLen );
511539
512540 /* Verify wolfCrypt signature with TPM */
513- rc = wolfTPM2_VerifyHashScheme (dev , & eccKey , sigRs , curveSize * 2 ,
514- digest , digestSz , TPM_ALG_ECDSA , hashAlg );
541+ rc = wolfTPM2_VerifyHashScheme (dev , ( WOLFTPM2_KEY * ) & eccKey , sigRs ,
542+ curveSize * 2 , digest , digestSz , TPM_ALG_ECDSA , hashAlg );
515543 AssertIntEQ (rc , 0 );
516544
517545 /* Cleanup */
518546 wc_ecc_free (& wolfKey );
519547 wolfTPM2_UnloadHandle (dev , & eccKey .handle );
520548
521549 printf ("Test TPM Wrapper:\t"
522- "Sign/Verify (DigSz=%d, CurveSz=%d, Hash=%s):"
550+ "Sign/Verify (DigSz=%d, CurveSz=%d, Hash=%s, Flags=%s ):"
523551 "\t%s\n" ,
524552 digestSz , TPM2_GetCurveSize (curve ), TPM2_GetAlgName (hashAlg ),
553+ (flags & FLAGS_USE_CRYPTO_CB ) ? "Crypto CB" : "" ,
525554 rc == 0 ? "Passed" : "Failed" );
555+
556+ if (flags & FLAGS_USE_CRYPTO_CB ) {
557+ wolfTPM2_ClearCryptoDevCb (dev , tpmDevId );
558+ }
559+ }
560+
561+ static void test_wolfTPM2_EccSignVerify_All (WOLFTPM2_DEV * dev ,
562+ WOLFTPM2_KEY * storageKey , int flags )
563+ {
564+ int i ;
565+ byte digest [TPM_MAX_DIGEST_SIZE ];
566+
567+ for (i = 0 ; i < (int )sizeof (digest ); i ++ ) {
568+ digest [i ] = (byte )i ;
569+ }
570+
571+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 20 ,
572+ TPM_ECC_NIST_P256 , TPM_ALG_SHA256 , flags );
573+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 32 ,
574+ TPM_ECC_NIST_P256 , TPM_ALG_SHA256 , flags );
575+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 48 ,
576+ TPM_ECC_NIST_P256 , TPM_ALG_SHA256 , flags );
577+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 64 ,
578+ TPM_ECC_NIST_P256 , TPM_ALG_SHA256 , flags );
579+
580+ #if (defined(HAVE_ECC384 ) || defined(HAVE_ALL_CURVES )) && ECC_MIN_KEY_SZ <= 384
581+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 20 ,
582+ TPM_ECC_NIST_P384 , TPM_ALG_SHA384 , flags );
583+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 32 ,
584+ TPM_ECC_NIST_P384 , TPM_ALG_SHA384 , flags );
585+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 48 ,
586+ TPM_ECC_NIST_P384 , TPM_ALG_SHA384 , flags );
587+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 64 ,
588+ TPM_ECC_NIST_P384 , TPM_ALG_SHA384 , flags );
589+ #endif
590+
591+ #if (defined(HAVE_ECC521 ) || defined(HAVE_ALL_CURVES )) && ECC_MIN_KEY_SZ <= 521
592+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 20 ,
593+ TPM_ECC_NIST_P521 , TPM_ALG_SHA512 , flags );
594+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 32 ,
595+ TPM_ECC_NIST_P521 , TPM_ALG_SHA512 , flags );
596+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 48 ,
597+ TPM_ECC_NIST_P521 , TPM_ALG_SHA512 , flags );
598+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 64 ,
599+ TPM_ECC_NIST_P521 , TPM_ALG_SHA512 , flags );
600+ #endif
526601}
527602
528603/* Test with smaller, same and larger digest sizes using different ECC curves.
529604 * Interop sign and verify with wolfCrypt and TPM */
530605static void test_wolfTPM2_EccSignVerify (void )
531606{
532- int rc , i ;
533- byte digest [TPM_MAX_DIGEST_SIZE ];
607+ int rc ;
534608 WOLFTPM2_DEV dev ;
535609 WOLFTPM2_KEY storageKey ;
536610
@@ -543,29 +617,9 @@ static void test_wolfTPM2_EccSignVerify(void)
543617 (byte * )gStorageKeyAuth , sizeof (gStorageKeyAuth )- 1 );
544618 AssertIntEQ (rc , 0 );
545619
546-
547- for (i = 0 ; i < (int )sizeof (digest ); i ++ ) {
548- digest [i ] = (byte )i ;
549- }
550-
551- test_wolfTPM2_EccSignVerifyDig (& dev , & storageKey , digest , 20 ,
552- TPM_ECC_NIST_P256 , TPM_ALG_SHA256 );
553- test_wolfTPM2_EccSignVerifyDig (& dev , & storageKey , digest , 32 ,
554- TPM_ECC_NIST_P256 , TPM_ALG_SHA256 );
555- test_wolfTPM2_EccSignVerifyDig (& dev , & storageKey , digest , 48 ,
556- TPM_ECC_NIST_P256 , TPM_ALG_SHA256 );
557- test_wolfTPM2_EccSignVerifyDig (& dev , & storageKey , digest , 64 ,
558- TPM_ECC_NIST_P256 , TPM_ALG_SHA256 );
559-
560- #if (defined(HAVE_ECC384 ) || defined(HAVE_ALL_CURVES )) && ECC_MIN_KEY_SZ <= 384
561- test_wolfTPM2_EccSignVerifyDig (& dev , & storageKey , digest , 20 ,
562- TPM_ECC_NIST_P384 , TPM_ALG_SHA384 );
563- test_wolfTPM2_EccSignVerifyDig (& dev , & storageKey , digest , 32 ,
564- TPM_ECC_NIST_P384 , TPM_ALG_SHA384 );
565- test_wolfTPM2_EccSignVerifyDig (& dev , & storageKey , digest , 48 ,
566- TPM_ECC_NIST_P384 , TPM_ALG_SHA384 );
567- test_wolfTPM2_EccSignVerifyDig (& dev , & storageKey , digest , 64 ,
568- TPM_ECC_NIST_P384 , TPM_ALG_SHA384 );
620+ test_wolfTPM2_EccSignVerify_All (& dev , & storageKey , 0 );
621+ #ifdef WOLF_CRYPTO_CB
622+ test_wolfTPM2_EccSignVerify_All (& dev , & storageKey , FLAGS_USE_CRYPTO_CB );
569623#endif
570624
571625 wolfTPM2_UnloadHandle (& dev , & storageKey .handle );
0 commit comments