@@ -409,9 +409,12 @@ 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 ;
@@ -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 .eccKey = & 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 */
@@ -439,6 +457,10 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
439457 printf ("Hash type not supported... Skipping\n" );
440458 return ;
441459 }
460+ if ((rc & TPM_RC_CURVE ) == TPM_RC_CURVE ) {
461+ printf ("Curve not supported... Skipping\n" );
462+ return ;
463+ }
442464 AssertIntEQ (rc , 0 );
443465
444466 /* Sign with TPM */
@@ -450,16 +472,14 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
450472 rLen = sLen = sigRsSz / 2 ;
451473 r = & sigRs [0 ];
452474 s = & sigRs [rLen ];
453- r = TPM2_ASN_TrimZeros (r , & rLen );
454- s = TPM2_ASN_TrimZeros (s , & sLen );
455475
456476 /* Encode ECDSA Header */
457477 sigSz = (word32 )sizeof (sig );
458478 rc = wc_ecc_rs_raw_to_sig (r , rLen , s , sLen , sig , & sigSz );
459479 AssertIntEQ (rc , 0 );
460480
461481 /* Initialize wolfCrypt ECC key */
462- rc = wc_ecc_init (& wolfKey );
482+ rc = wc_ecc_init_ex (& wolfKey , NULL , tpmDevId );
463483 AssertIntEQ (rc , 0 );
464484
465485 /* Convert TPM key to wolfCrypt key for verification */
@@ -478,7 +498,7 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
478498
479499 /* -- Use wolfCrypt key to sign and verify with TPM -- */
480500 /* Initialize new wolfCrypt ECC key */
481- rc = wc_ecc_init (& wolfKey );
501+ rc = wc_ecc_init_ex (& wolfKey , NULL , tpmDevId );
482502 AssertIntEQ (rc , 0 );
483503
484504 /* Generate new ECC key with wolfCrypt */
@@ -490,6 +510,7 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
490510 rc = wc_ecc_sign_hash (digest , digestSz , sig , & sigSz , wolfTPM2_GetRng (dev ),
491511 & wolfKey );
492512 AssertIntEQ (rc , 0 );
513+ wolfTPM2_UnloadHandle (dev , & eccKey .handle );
493514
494515 /* Decode ECDSA Header */
495516 r = sigRs ;
@@ -519,18 +540,63 @@ static void test_wolfTPM2_EccSignVerifyDig(WOLFTPM2_DEV* dev,
519540 wolfTPM2_UnloadHandle (dev , & eccKey .handle );
520541
521542 printf ("Test TPM Wrapper:\t"
522- "Sign/Verify (DigSz=%d, CurveSz=%d, Hash=%s):"
543+ "Sign/Verify (DigSz=%d, CurveSz=%d, Hash=%s, Flags=%s ):"
523544 "\t%s\n" ,
524545 digestSz , TPM2_GetCurveSize (curve ), TPM2_GetAlgName (hashAlg ),
546+ (flags & FLAGS_USE_CRYPTO_CB ) ? "Crypto CB" : "" ,
525547 rc == 0 ? "Passed" : "Failed" );
548+
549+ if (flags & FLAGS_USE_CRYPTO_CB ) {
550+ wolfTPM2_ClearCryptoDevCb (dev , tpmDevId );
551+ }
552+ }
553+
554+ static void test_wolfTPM2_EccSignVerify_All (WOLFTPM2_DEV * dev , WOLFTPM2_KEY * storageKey , int flags )
555+ {
556+ int i ;
557+ byte digest [TPM_MAX_DIGEST_SIZE ];
558+
559+ for (i = 0 ; i < (int )sizeof (digest ); i ++ ) {
560+ digest [i ] = (byte )i ;
561+ }
562+
563+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 20 ,
564+ TPM_ECC_NIST_P256 , TPM_ALG_SHA256 , flags );
565+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 32 ,
566+ TPM_ECC_NIST_P256 , TPM_ALG_SHA256 , flags );
567+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 48 ,
568+ TPM_ECC_NIST_P256 , TPM_ALG_SHA256 , flags );
569+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 64 ,
570+ TPM_ECC_NIST_P256 , TPM_ALG_SHA256 , flags );
571+
572+ #if (defined(HAVE_ECC384 ) || defined(HAVE_ALL_CURVES )) && ECC_MIN_KEY_SZ <= 384
573+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 20 ,
574+ TPM_ECC_NIST_P384 , TPM_ALG_SHA384 , flags );
575+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 32 ,
576+ TPM_ECC_NIST_P384 , TPM_ALG_SHA384 , flags );
577+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 48 ,
578+ TPM_ECC_NIST_P384 , TPM_ALG_SHA384 , flags );
579+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 64 ,
580+ TPM_ECC_NIST_P384 , TPM_ALG_SHA384 , flags );
581+ #endif
582+
583+ #if (defined(HAVE_ECC521 ) || defined(HAVE_ALL_CURVES )) && ECC_MIN_KEY_SZ <= 521
584+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 20 ,
585+ TPM_ECC_NIST_P521 , TPM_ALG_SHA512 , flags );
586+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 32 ,
587+ TPM_ECC_NIST_P521 , TPM_ALG_SHA512 , flags );
588+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 48 ,
589+ TPM_ECC_NIST_P521 , TPM_ALG_SHA512 , flags );
590+ test_wolfTPM2_EccSignVerifyDig (dev , storageKey , digest , 64 ,
591+ TPM_ECC_NIST_P521 , TPM_ALG_SHA512 , flags );
592+ #endif
526593}
527594
528595/* Test with smaller, same and larger digest sizes using different ECC curves.
529596 * Interop sign and verify with wolfCrypt and TPM */
530597static void test_wolfTPM2_EccSignVerify (void )
531598{
532- int rc , i ;
533- byte digest [TPM_MAX_DIGEST_SIZE ];
599+ int rc ;
534600 WOLFTPM2_DEV dev ;
535601 WOLFTPM2_KEY storageKey ;
536602
@@ -543,29 +609,9 @@ static void test_wolfTPM2_EccSignVerify(void)
543609 (byte * )gStorageKeyAuth , sizeof (gStorageKeyAuth )- 1 );
544610 AssertIntEQ (rc , 0 );
545611
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 );
612+ test_wolfTPM2_EccSignVerify_All (& dev , & storageKey , 0 );
613+ #ifdef WOLF_CRYPTO_CB
614+ test_wolfTPM2_EccSignVerify_All (& dev , & storageKey , FLAGS_USE_CRYPTO_CB );
569615#endif
570616
571617 wolfTPM2_UnloadHandle (& dev , & storageKey .handle );
0 commit comments