@@ -34714,6 +34714,41 @@ static int test_DhAgree_rejects_p_minus_1(void)
3471434714 return EXPECT_RESULT();
3471534715}
3471634716
34717+ /* Test: Ed448 must reject identity public key (0,1) */
34718+ static int test_ed448_rejects_identity_key(void)
34719+ {
34720+ EXPECT_DECLS;
34721+ #ifdef HAVE_ED448
34722+ ed448_key key;
34723+ byte identity[ED448_PUB_KEY_SIZE];
34724+ byte forged_sig[ED448_SIG_SIZE];
34725+ const byte msg[] = "test message";
34726+ int res = 0;
34727+
34728+ XMEMSET(identity, 0, sizeof(identity));
34729+ identity[0] = 0x01; /* identity (0,1) encoding */
34730+
34731+ XMEMSET(forged_sig, 0, sizeof(forged_sig));
34732+ forged_sig[0] = 0x01; /* R = identity, S = 0 */
34733+
34734+ ExpectIntEQ(wc_ed448_init(&key), 0);
34735+
34736+ /* The identity public key must be rejected at import time. */
34737+ ExpectIntNE(wc_ed448_import_public(identity, sizeof(identity), &key), 0);
34738+
34739+ /* If import somehow succeeded, verify must also reject the forgery. */
34740+ if (EXPECT_SUCCESS() && key.pubKeySet) {
34741+ int verifyRet = wc_ed448_verify_msg(forged_sig, sizeof(forged_sig),
34742+ msg, sizeof(msg) - 1,
34743+ &res, &key, NULL, 0);
34744+ ExpectTrue(verifyRet != 0 || res == 0);
34745+ }
34746+
34747+ wc_ed448_free(&key);
34748+ #endif
34749+ return EXPECT_RESULT();
34750+ }
34751+
3471734752TEST_CASE testCases[] = {
3471834753 TEST_DECL(test_fileAccess),
3471934754
@@ -35528,6 +35563,7 @@ TEST_CASE testCases[] = {
3552835563 TEST_TLS_DECLS,
3552935564 TEST_DECL(test_wc_DhSetNamedKey),
3553035565 TEST_DECL(test_DhAgree_rejects_p_minus_1),
35566+ TEST_DECL(test_ed448_rejects_identity_key),
3553135567
3553235568#if defined(WOLFSSL_SNIFFER) && defined(WOLFSSL_SNIFFER_CHAIN_INPUT)
3553335569 TEST_DECL(test_sniffer_chain_input_overflow),
0 commit comments