@@ -19486,6 +19486,48 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t aes_eax_test(void)
1948619486 }
1948719487
1948819488 }
19489+
19490+ /* Regression test: wc_AesEaxDecryptAuth must reject authTagSz below
19491+ * WOLFSSL_MIN_AUTH_TAG_SZ (including zero), otherwise an attacker could
19492+ * bypass tag verification by supplying an empty tag. */
19493+ #if WOLFSSL_MIN_AUTH_TAG_SZ > 0
19494+ {
19495+ byte zero_ct[16];
19496+ byte zero_pt[16];
19497+ byte zero_tag[16];
19498+ XMEMSET(zero_ct, 0, sizeof(zero_ct));
19499+ XMEMSET(zero_tag, 0, sizeof(zero_tag));
19500+
19501+ ret = wc_AesEaxDecryptAuth(vectors[0].key,
19502+ (word32)vectors[0].key_length,
19503+ zero_pt,
19504+ zero_ct, (word32)sizeof(zero_ct),
19505+ vectors[0].iv,
19506+ (word32)vectors[0].iv_length,
19507+ zero_tag, 0,
19508+ vectors[0].aad,
19509+ (word32)vectors[0].aad_length);
19510+ if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) {
19511+ return WC_TEST_RET_ENC_EC(ret);
19512+ }
19513+
19514+ #if WOLFSSL_MIN_AUTH_TAG_SZ > 1
19515+ ret = wc_AesEaxDecryptAuth(vectors[0].key,
19516+ (word32)vectors[0].key_length,
19517+ zero_pt,
19518+ zero_ct, (word32)sizeof(zero_ct),
19519+ vectors[0].iv,
19520+ (word32)vectors[0].iv_length,
19521+ zero_tag, WOLFSSL_MIN_AUTH_TAG_SZ - 1,
19522+ vectors[0].aad,
19523+ (word32)vectors[0].aad_length);
19524+ if (ret != WC_NO_ERR_TRACE(BAD_FUNC_ARG)) {
19525+ return WC_TEST_RET_ENC_EC(ret);
19526+ }
19527+ #endif
19528+ }
19529+ #endif /* WOLFSSL_MIN_AUTH_TAG_SZ > 0 */
19530+
1948919531 return 0;
1949019532}
1949119533
0 commit comments