@@ -34758,6 +34758,42 @@ static int test_DhAgree_rejects_p_minus_1(void)
3475834758 return EXPECT_RESULT();
3475934759}
3476034760
34761+ /* Test: Ed448 must reject identity public key (0,1) */
34762+ static int test_ed448_rejects_identity_key(void)
34763+ {
34764+ EXPECT_DECLS;
34765+ #if defined(HAVE_ED448) && !defined(HAVE_SELFTEST) && \
34766+ (!defined(HAVE_FIPS) || FIPS_VERSION_GE(7,0))
34767+ ed448_key key;
34768+ byte identity[ED448_PUB_KEY_SIZE];
34769+ byte forged_sig[ED448_SIG_SIZE];
34770+ const byte msg[] = "test message";
34771+ int res = 0;
34772+
34773+ XMEMSET(identity, 0, sizeof(identity));
34774+ identity[0] = 0x01; /* identity (0,1) encoding */
34775+
34776+ XMEMSET(forged_sig, 0, sizeof(forged_sig));
34777+ forged_sig[0] = 0x01; /* R = identity, S = 0 */
34778+
34779+ ExpectIntEQ(wc_ed448_init(&key), 0);
34780+
34781+ /* The identity public key must be rejected at import time. */
34782+ ExpectIntNE(wc_ed448_import_public(identity, sizeof(identity), &key), 0);
34783+
34784+ /* If import somehow succeeded, verify must also reject the forgery. */
34785+ if (EXPECT_SUCCESS() && key.pubKeySet) {
34786+ int verifyRet = wc_ed448_verify_msg(forged_sig, sizeof(forged_sig),
34787+ msg, sizeof(msg) - 1,
34788+ &res, &key, NULL, 0);
34789+ ExpectTrue(verifyRet != 0 || res == 0);
34790+ }
34791+
34792+ wc_ed448_free(&key);
34793+ #endif
34794+ return EXPECT_RESULT();
34795+ }
34796+
3476134797TEST_CASE testCases[] = {
3476234798 TEST_DECL(test_fileAccess),
3476334799
@@ -35573,6 +35609,7 @@ TEST_CASE testCases[] = {
3557335609 TEST_TLS_DECLS,
3557435610 TEST_DECL(test_wc_DhSetNamedKey),
3557535611 TEST_DECL(test_DhAgree_rejects_p_minus_1),
35612+ TEST_DECL(test_ed448_rejects_identity_key),
3557635613
3557735614#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_CHAIN_INPUT)
3557835615 TEST_DECL(test_sniffer_chain_input_overflow),
0 commit comments