@@ -9543,7 +9543,8 @@ enum TestTls13PendTarget {
95439543 TEST_TLS13_PEND_ECC_KEYGEN ,
95449544 TEST_TLS13_PEND_ECDSA_SIGN ,
95459545 TEST_TLS13_PEND_ECDSA_VERIFY ,
9546- TEST_TLS13_PEND_KDF
9546+ TEST_TLS13_PEND_KDF ,
9547+ TEST_TLS13_PEND_HMAC
95479548};
95489549
95499550typedef struct TestTls13PendCtx {
@@ -9585,6 +9586,9 @@ static int TestTls13PendMatches(int target, wc_CryptoInfo* info)
95859586 case TEST_TLS13_PEND_KDF :
95869587 match = (info -> algo_type == WC_ALGO_TYPE_KDF );
95879588 break ;
9589+ case TEST_TLS13_PEND_HMAC :
9590+ match = (info -> algo_type == WC_ALGO_TYPE_HMAC );
9591+ break ;
95889592 default :
95899593 break ;
95909594 }
@@ -9615,10 +9619,43 @@ static int TestTls13PendCb(int devIdArg, wc_CryptoInfo* info, void* ctx)
96159619
96169620 if (info == NULL || c == NULL )
96179621 return WC_NO_ERR_TRACE (CRYPTOCB_UNAVAILABLE );
9622+ #if defined(HAVE_HKDF ) && !defined(NO_HMAC ) && !defined(HAVE_SELFTEST ) && \
9623+ (!defined(HAVE_FIPS ) || FIPS_VERSION_GE (7 ,0 ))
9624+ if (c -> target == TEST_TLS13_PEND_HMAC &&
9625+ info -> algo_type == WC_ALGO_TYPE_KDF ) {
9626+ /* Serve the key schedule synchronously in software; falling back
9627+ * with the devId set would route its internal HMACs back here and
9628+ * those cannot resume (see wolfcrypt/src/hmac.c). Only the
9629+ * TLS-layer transcript HMACs are left to pend. */
9630+ if (info -> kdf .type == WC_KDF_TYPE_HKDF_EXTRACT ) {
9631+ return wc_HKDF_Extract_ex (info -> kdf .hkdf_extract .hashType ,
9632+ info -> kdf .hkdf_extract .salt , info -> kdf .hkdf_extract .saltSz ,
9633+ info -> kdf .hkdf_extract .inKey , info -> kdf .hkdf_extract .inKeySz ,
9634+ info -> kdf .hkdf_extract .out , NULL , INVALID_DEVID );
9635+ }
9636+ if (info -> kdf .type == WC_KDF_TYPE_HKDF_EXPAND ) {
9637+ return wc_HKDF_Expand_ex (info -> kdf .hkdf_expand .hashType ,
9638+ info -> kdf .hkdf_expand .inKey , info -> kdf .hkdf_expand .inKeySz ,
9639+ info -> kdf .hkdf_expand .info , info -> kdf .hkdf_expand .infoSz ,
9640+ info -> kdf .hkdf_expand .out , info -> kdf .hkdf_expand .outSz ,
9641+ NULL , INVALID_DEVID );
9642+ }
9643+ if (info -> kdf .type == WC_KDF_TYPE_HKDF ) {
9644+ return wc_HKDF_ex (info -> kdf .hkdf .hashType ,
9645+ info -> kdf .hkdf .inKey , info -> kdf .hkdf .inKeySz ,
9646+ info -> kdf .hkdf .salt , info -> kdf .hkdf .saltSz ,
9647+ info -> kdf .hkdf .info , info -> kdf .hkdf .infoSz ,
9648+ info -> kdf .hkdf .out , info -> kdf .hkdf .outSz ,
9649+ NULL , INVALID_DEVID );
9650+ }
9651+ }
9652+ #endif
9653+
96189654 if (!TestTls13PendMatches (c -> target , info ))
96199655 return WC_NO_ERR_TRACE (CRYPTOCB_UNAVAILABLE );
96209656
96219657 c -> seen ++ ;
9658+
96229659 h = TestTls13PendHash (info );
96239660 for (i = 0 ; i < c -> jobCount ; i ++ ) {
96249661 if (c -> jobs [i ] == h ) {
@@ -9849,6 +9886,14 @@ int test_tls13_cryptocb_async(void)
98499886 TEST_SUCCESS );
98509887 ExpectIntEQ (test_tls13_cryptocb_pend_one (TEST_TLS13_PEND_KDF , 1 ),
98519888 TEST_SUCCESS );
9889+ #if !defined(HAVE_SELFTEST ) && \
9890+ (!defined(HAVE_FIPS ) || FIPS_VERSION_GE (7 ,0 ))
9891+ /* Transcript HMACs (Finished verify_data) pending on both sides. */
9892+ ExpectIntEQ (test_tls13_cryptocb_pend_one (TEST_TLS13_PEND_HMAC , 0 ),
9893+ TEST_SUCCESS );
9894+ ExpectIntEQ (test_tls13_cryptocb_pend_one (TEST_TLS13_PEND_HMAC , 1 ),
9895+ TEST_SUCCESS );
9896+ #endif
98529897#endif
98539898#endif
98549899 return EXPECT_RESULT ();
0 commit comments