diff --git a/.wolfssl_known_macro_extras b/.wolfssl_known_macro_extras index 02f4e52f550..c93125d747f 100644 --- a/.wolfssl_known_macro_extras +++ b/.wolfssl_known_macro_extras @@ -773,11 +773,13 @@ WC_DRBG_BANKREF WC_FIPS_AESGCM_NO_SHORT_NONCES WC_FIPS_AESGCM_ONE_SHOT_EXT_IV_ALLOWED WC_FIPS_ED25519CTX_NOT_APPROVED +WC_FIPS_RSA_VERIFY_MIN_2048 WC_FLAG_DONT_USE_AESNI WC_FORCE_LINUXKM_FORTIFY_SOURCE WC_HASH_CUSTOM_MAX_BLOCK_SIZE WC_HASH_CUSTOM_MAX_DIGEST_SIZE WC_HASH_CUSTOM_MIN_DIGEST_SIZE +WC_HAVE_FIPS_INDICATOR WC_INIT_ERROR_WHEN_CONTENDED WC_LINUXKM_NO_USE_HEAP_WRAPPERS WC_LINUXKM_SVR_NO_BATCHING diff --git a/tests/api.c b/tests/api.c index ccebd4fd8ce..c69ba272510 100644 --- a/tests/api.c +++ b/tests/api.c @@ -30211,7 +30211,13 @@ static int test_wolfSSL_d2i_X509_REQ(void) /* * Verify the signature in the CSR */ +#ifdef WC_FIPS_RSA_VERIFY_MIN_2048 + /* certs/csr.ext.der has a 1024-bit RSA key; IG C.F requires at least + * 2048 bits for FIPS 186-5 signature verification. */ + ExpectIntEQ(X509_REQ_verify(req, pub_key), 0); +#else ExpectIntEQ(X509_REQ_verify(req, pub_key), 1); +#endif #ifdef OPENSSL_ALL ExpectNotNull(exts = (STACK_OF(X509_EXTENSION)*)X509_REQ_get_extensions( diff --git a/tests/api/api.h b/tests/api/api.h index 69b1f433e51..299a957b54f 100644 --- a/tests/api/api.h +++ b/tests/api/api.h @@ -39,6 +39,15 @@ #include +/* A successful PQ seed-input call returns WC_FIPS_NOT_APPROVED from v7 module + * wrappers whose fips.h defines WC_HAVE_FIPS_INDICATOR, and 0 otherwise. */ +#if defined(HAVE_FIPS) && defined(WC_HAVE_FIPS_INDICATOR) && \ + FIPS_VERSION3_GE(7,0,0) && !defined(FIPS_NO_WRAPPERS) + #define SEED_OK WC_FIPS_NOT_APPROVED +#else + #define SEED_OK 0 +#endif + /* Old FIPS headers don't allow comparisons with WC_MIN_DIGEST_SIZE_FOR_SIGN by * the preprocessor, so we catch those builds with one of the first two * clauses. diff --git a/tests/api/test_ed25519.c b/tests/api/test_ed25519.c index 32eb91c958a..f9dd98e8e5e 100644 --- a/tests/api/test_ed25519.c +++ b/tests/api/test_ed25519.c @@ -1020,12 +1020,19 @@ int test_wc_ed25519_sign_verify_ctx_ph(void) /* Ed25519ctx round trip: type==Ed25519ctx true side, real context. */ sigLen = sizeof(sig); +#ifdef WC_FIPS_ED25519CTX_NOT_APPROVED + /* A module whose fips.h defines WC_FIPS_ED25519CTX_NOT_APPROVED rejects + * Ed25519ctx signing with SIG_TYPE_E. */ + ExpectIntEQ(wc_ed25519ctx_sign_msg(msg, sizeof(msg), sig, &sigLen, &key, + ctx, sizeof(ctx)), WC_NO_ERR_TRACE(SIG_TYPE_E)); +#else ExpectIntEQ(wc_ed25519ctx_sign_msg(msg, sizeof(msg), sig, &sigLen, &key, ctx, sizeof(ctx)), 0); verify_ok = 0; ExpectIntEQ(wc_ed25519ctx_verify_msg(sig, sigLen, msg, sizeof(msg), &verify_ok, &key, ctx, sizeof(ctx)), 0); ExpectIntEQ(verify_ok, 1); +#endif /* Ed25519ph round trip via hash and via full message, type==Ed25519ph * true side, WC_SHA512_DIGEST_SIZE length check false side (equal). */ diff --git a/tests/api/test_mldsa.c b/tests/api/test_mldsa.c index 35b2bd13ecf..f40619c0dc8 100644 --- a/tests/api/test_mldsa.c +++ b/tests/api/test_mldsa.c @@ -7737,36 +7737,36 @@ int test_mldsa_make_key_from_seed(void) ExpectIntEQ(wc_MlDsaKey_Init(key, NULL, INVALID_DEVID), 0); #ifndef WOLFSSL_NO_ML_DSA_44 ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_44), 0); - ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_44), 0); + ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_44), SEED_OK); ExpectIntEQ(XMEMCMP(key->p, pk_44, sizeof(pk_44)), 0); ExpectIntEQ(XMEMCMP(key->k, sk_44, sizeof(sk_44)), 0); #ifdef WOLFSSL_MLDSA_FIPS204_DRAFT ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_44_DRAFT), 0); - ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_44_draft), 0); + ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_44_draft), SEED_OK); ExpectIntEQ(XMEMCMP(key->p, pk_44_draft, sizeof(pk_44_draft)), 0); ExpectIntEQ(XMEMCMP(key->k, sk_44_draft, sizeof(sk_44_draft)), 0); #endif #endif #ifndef WOLFSSL_NO_ML_DSA_65 ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_65), 0); - ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_65), 0); + ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_65), SEED_OK); ExpectIntEQ(XMEMCMP(key->p, pk_65, sizeof(pk_65)), 0); ExpectIntEQ(XMEMCMP(key->k, sk_65, sizeof(sk_65)), 0); #ifdef WOLFSSL_MLDSA_FIPS204_DRAFT ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_65_DRAFT), 0); - ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_65_draft), 0); + ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_65_draft), SEED_OK); ExpectIntEQ(XMEMCMP(key->p, pk_65_draft, sizeof(pk_65_draft)), 0); ExpectIntEQ(XMEMCMP(key->k, sk_65_draft, sizeof(sk_65_draft)), 0); #endif #endif #ifndef WOLFSSL_NO_ML_DSA_87 ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_87), 0); - ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_87), 0); + ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_87), SEED_OK); ExpectIntEQ(XMEMCMP(key->p, pk_87, sizeof(pk_87)), 0); ExpectIntEQ(XMEMCMP(key->k, sk_87, sizeof(sk_87)), 0); #ifdef WOLFSSL_MLDSA_FIPS204_DRAFT ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_87_DRAFT), 0); - ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_87_draft), 0); + ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(key, seed_87_draft), SEED_OK); ExpectIntEQ(XMEMCMP(key->p, pk_87_draft, sizeof(pk_87_draft)), 0); ExpectIntEQ(XMEMCMP(key->k, sk_87_draft, sizeof(sk_87_draft)), 0); #endif @@ -12563,7 +12563,8 @@ int test_mldsa_sig_kats(void) ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_44, (word32)sizeof(sk_44)), 0); sigLen = PARAMS_ML_DSA_44_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignWithSeed(key, sig, &sigLen, msg_44, (word32)sizeof(msg_44), rnd_44), 0); + ExpectIntEQ(wc_MlDsaKey_SignWithSeed(key, sig, &sigLen, msg_44, (word32)sizeof(msg_44), rnd_44), + SEED_OK); ExpectIntEQ(sigLen, PARAMS_ML_DSA_44_SIG_SIZE); ExpectIntEQ(XMEMCMP(sig, sig_44, sizeof(sig_44)), 0); #endif @@ -12572,7 +12573,8 @@ int test_mldsa_sig_kats(void) ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_65, (word32)sizeof(sk_65)), 0); sigLen = PARAMS_ML_DSA_65_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignWithSeed(key, sig, &sigLen, msg_65, (word32)sizeof(msg_65), rnd_65), 0); + ExpectIntEQ(wc_MlDsaKey_SignWithSeed(key, sig, &sigLen, msg_65, (word32)sizeof(msg_65), rnd_65), + SEED_OK); ExpectIntEQ(sigLen, PARAMS_ML_DSA_65_SIG_SIZE); ExpectIntEQ(XMEMCMP(sig, sig_65, sizeof(sig_65)), 0); #endif @@ -12581,7 +12583,8 @@ int test_mldsa_sig_kats(void) ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_87, (word32)sizeof(sk_87)), 0); sigLen = PARAMS_ML_DSA_87_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignWithSeed(key, sig, &sigLen, msg_87, (word32)sizeof(msg_87), rnd_87), 0); + ExpectIntEQ(wc_MlDsaKey_SignWithSeed(key, sig, &sigLen, msg_87, (word32)sizeof(msg_87), rnd_87), + SEED_OK); ExpectIntEQ(sigLen, PARAMS_ML_DSA_87_SIG_SIZE); ExpectIntEQ(XMEMCMP(sig, sig_87, sizeof(sig_87)), 0); #endif @@ -16758,7 +16761,8 @@ int test_mldsa_sign_ctx_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_44), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_44, (word32)sizeof(sk_44)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, NULL, 0, sig, &sigLen, msg_44, (word32)sizeof(msg_44), rnd_44), 0); + ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, NULL, 0, sig, &sigLen, msg_44, (word32)sizeof(msg_44), rnd_44), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_44_ctx0)); ExpectIntEQ(XMEMCMP(sig, sig_44_ctx0, sizeof(sig_44_ctx0)), 0); wc_MlDsaKey_Free(key); @@ -16768,7 +16772,8 @@ int test_mldsa_sign_ctx_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_44), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_44, (word32)sizeof(sk_44)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, ctx_44, (byte)sizeof(ctx_44), sig, &sigLen, msg_44, (word32)sizeof(msg_44), rnd_44), 0); + ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, ctx_44, (byte)sizeof(ctx_44), sig, &sigLen, msg_44, (word32)sizeof(msg_44), rnd_44), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_44_ctx33)); ExpectIntEQ(XMEMCMP(sig, sig_44_ctx33, sizeof(sig_44_ctx33)), 0); wc_MlDsaKey_Free(key); @@ -16780,7 +16785,8 @@ int test_mldsa_sign_ctx_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_65), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_65, (word32)sizeof(sk_65)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, NULL, 0, sig, &sigLen, msg_65, (word32)sizeof(msg_65), rnd_65), 0); + ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, NULL, 0, sig, &sigLen, msg_65, (word32)sizeof(msg_65), rnd_65), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_65_ctx0)); ExpectIntEQ(XMEMCMP(sig, sig_65_ctx0, sizeof(sig_65_ctx0)), 0); wc_MlDsaKey_Free(key); @@ -16790,7 +16796,8 @@ int test_mldsa_sign_ctx_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_65), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_65, (word32)sizeof(sk_65)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, ctx_65, (byte)sizeof(ctx_65), sig, &sigLen, msg_65, (word32)sizeof(msg_65), rnd_65), 0); + ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, ctx_65, (byte)sizeof(ctx_65), sig, &sigLen, msg_65, (word32)sizeof(msg_65), rnd_65), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_65_ctx33)); ExpectIntEQ(XMEMCMP(sig, sig_65_ctx33, sizeof(sig_65_ctx33)), 0); wc_MlDsaKey_Free(key); @@ -16802,7 +16809,8 @@ int test_mldsa_sign_ctx_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_87), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_87, (word32)sizeof(sk_87)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, NULL, 0, sig, &sigLen, msg_87, (word32)sizeof(msg_87), rnd_87), 0); + ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, NULL, 0, sig, &sigLen, msg_87, (word32)sizeof(msg_87), rnd_87), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_87_ctx0)); ExpectIntEQ(XMEMCMP(sig, sig_87_ctx0, sizeof(sig_87_ctx0)), 0); wc_MlDsaKey_Free(key); @@ -16812,7 +16820,8 @@ int test_mldsa_sign_ctx_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_87), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_87, (word32)sizeof(sk_87)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, ctx_87, (byte)sizeof(ctx_87), sig, &sigLen, msg_87, (word32)sizeof(msg_87), rnd_87), 0); + ExpectIntEQ(wc_MlDsaKey_SignCtxWithSeed(key, ctx_87, (byte)sizeof(ctx_87), sig, &sigLen, msg_87, (word32)sizeof(msg_87), rnd_87), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_87_ctx33)); ExpectIntEQ(XMEMCMP(sig, sig_87_ctx33, sizeof(sig_87_ctx33)), 0); wc_MlDsaKey_Free(key); @@ -27440,7 +27449,8 @@ int test_mldsa_sign_mu_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_44), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_44_mu, (word32)sizeof(sk_44_mu)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignMuWithSeed(key, sig, &sigLen, mu_44, (word32)sizeof(mu_44), zeroSeed), 0); + ExpectIntEQ(wc_MlDsaKey_SignMuWithSeed(key, sig, &sigLen, mu_44, (word32)sizeof(mu_44), zeroSeed), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_44_mu)); ExpectIntEQ(XMEMCMP(sig, sig_44_mu, sizeof(sig_44_mu)), 0); wc_MlDsaKey_Free(key); @@ -27451,7 +27461,8 @@ int test_mldsa_sign_mu_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_65), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_65_mu, (word32)sizeof(sk_65_mu)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignMuWithSeed(key, sig, &sigLen, mu_65, (word32)sizeof(mu_65), zeroSeed), 0); + ExpectIntEQ(wc_MlDsaKey_SignMuWithSeed(key, sig, &sigLen, mu_65, (word32)sizeof(mu_65), zeroSeed), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_65_mu)); ExpectIntEQ(XMEMCMP(sig, sig_65_mu, sizeof(sig_65_mu)), 0); wc_MlDsaKey_Free(key); @@ -27462,7 +27473,8 @@ int test_mldsa_sign_mu_kats(void) ExpectIntEQ(wc_MlDsaKey_SetParams(key, WC_ML_DSA_87), 0); ExpectIntEQ(wc_MlDsaKey_ImportPrivRaw(key, sk_87_mu, (word32)sizeof(sk_87_mu)), 0); sigLen = MLDSA_MAX_SIG_SIZE; - ExpectIntEQ(wc_MlDsaKey_SignMuWithSeed(key, sig, &sigLen, mu_87, (word32)sizeof(mu_87), zeroSeed), 0); + ExpectIntEQ(wc_MlDsaKey_SignMuWithSeed(key, sig, &sigLen, mu_87, (word32)sizeof(mu_87), zeroSeed), + SEED_OK); ExpectIntEQ(sigLen, (word32)sizeof(sig_87_mu)); ExpectIntEQ(XMEMCMP(sig, sig_87_mu, sizeof(sig_87_mu)), 0); wc_MlDsaKey_Free(key); @@ -31735,3 +31747,28 @@ int test_wc_MlDsaKey_SetPrecompA(void) #endif return EXPECT_RESULT(); } + +/* ML-DSA keygen from a caller seed succeeds and returns SEED_OK, the service + * indicator for a seed-input call (api.h). */ +int test_wc_MlDsaKey_seed_service_indicator(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_MLDSA) && !defined(WOLFSSL_MLDSA_NO_MAKE_KEY) && \ + !defined(WOLFSSL_MLDSA_VERIFY_ONLY) + wc_MlDsaKey key; + byte seed[MLDSA_SEED_SZ]; + + XMEMSET(&key, 0, sizeof(key)); + XMEMSET(seed, 0x5a, sizeof(seed)); + + ExpectIntEQ(wc_MlDsaKey_Init(&key, NULL, INVALID_DEVID), 0); + ExpectIntEQ(wc_MlDsaKey_SetParams(&key, WC_ML_DSA_44), 0); + + /* Valid key, valid seed: the operation is performed, and in an approved + * build it is reported non-approved rather than refused. */ + ExpectIntEQ(wc_MlDsaKey_MakeKeyFromSeed(&key, seed), SEED_OK); + + wc_MlDsaKey_Free(&key); +#endif + return EXPECT_RESULT(); +} diff --git a/tests/api/test_mldsa.h b/tests/api/test_mldsa.h index d3cd09b78a7..265b9c76bd4 100644 --- a/tests/api/test_mldsa.h +++ b/tests/api/test_mldsa.h @@ -67,6 +67,7 @@ int test_wc_MldsaFeatureCoverage(void); * defined. */ int test_mldsa_legacy_shim(void); int test_wc_MldsaDecisionCoverage2(void); +int test_wc_MlDsaKey_seed_service_indicator(void); int test_wc_MldsaDerDecisionCoverage(void); int test_mldsa_cb_free(void); @@ -101,6 +102,7 @@ int test_wc_MlDsaKey_SetPrecompA(void); TEST_DECL_GROUP("mldsa", test_wc_MldsaFeatureCoverage), \ TEST_DECL_GROUP("mldsa", test_mldsa_legacy_shim), \ TEST_DECL_GROUP("mldsa", test_wc_MldsaDecisionCoverage2), \ + TEST_DECL_GROUP("mldsa", test_wc_MlDsaKey_seed_service_indicator), \ TEST_DECL_GROUP("mldsa", test_wc_MldsaDerDecisionCoverage), \ TEST_DECL_GROUP("mldsa", test_mldsa_cb_free), \ TEST_DECL_GROUP("mldsa", test_wc_MlDsaKey_SetPrecompA) diff --git a/tests/api/test_mlkem.c b/tests/api/test_mlkem.c index e909ee9953b..8bee6213299 100644 --- a/tests/api/test_mlkem.c +++ b/tests/api/test_mlkem.c @@ -1454,7 +1454,7 @@ int test_wc_mlkem_make_key_kats(void) #ifndef WOLFSSL_NO_ML_KEM_512 ExpectIntEQ(wc_MlKemKey_Init(key, WC_ML_KEM_512, NULL, INVALID_DEVID), 0); ExpectIntEQ(wc_MlKemKey_MakeKeyWithRandom(key, seed_512, sizeof(seed_512)), - 0); + SEED_OK); ExpectIntEQ(wc_MlKemKey_EncodePublicKey(key, pubKey, WC_ML_KEM_512_PUBLIC_KEY_SIZE), 0); ExpectIntEQ(wc_MlKemKey_EncodePrivateKey(key, privKey, @@ -1466,7 +1466,7 @@ int test_wc_mlkem_make_key_kats(void) #ifndef WOLFSSL_NO_ML_KEM_768 ExpectIntEQ(wc_MlKemKey_Init(key, WC_ML_KEM_768, NULL, INVALID_DEVID), 0); ExpectIntEQ(wc_MlKemKey_MakeKeyWithRandom(key, seed_768, sizeof(seed_768)), - 0); + SEED_OK); ExpectIntEQ(wc_MlKemKey_EncodePublicKey(key, pubKey, WC_ML_KEM_768_PUBLIC_KEY_SIZE), 0); ExpectIntEQ(wc_MlKemKey_EncodePrivateKey(key, privKey, @@ -1478,7 +1478,7 @@ int test_wc_mlkem_make_key_kats(void) #ifndef WOLFSSL_NO_ML_KEM_1024 ExpectIntEQ(wc_MlKemKey_Init(key, WC_ML_KEM_1024, NULL, INVALID_DEVID), 0); ExpectIntEQ(wc_MlKemKey_MakeKeyWithRandom(key, seed_1024, - sizeof(seed_1024)), 0); + sizeof(seed_1024)), SEED_OK); ExpectIntEQ(wc_MlKemKey_EncodePublicKey(key, pubKey, WC_ML_KEM_1024_PUBLIC_KEY_SIZE), 0); ExpectIntEQ(wc_MlKemKey_EncodePrivateKey(key, privKey, @@ -2440,7 +2440,7 @@ int test_wc_mlkem_encapsulate_kats(void) ExpectIntEQ(wc_MlKemKey_Init(key, WC_ML_KEM_512, NULL, INVALID_DEVID), 0); ExpectIntEQ(wc_MlKemKey_DecodePublicKey(key, ek_512, sizeof(ek_512)), 0); ExpectIntEQ(wc_MlKemKey_EncapsulateWithRandom(key, ct, ss, seed_512, - sizeof(seed_512)), 0); + sizeof(seed_512)), SEED_OK); ExpectIntEQ(XMEMCMP(ct, c_512, WC_ML_KEM_512_CIPHER_TEXT_SIZE), 0); ExpectIntEQ(XMEMCMP(ss, k_512, WC_ML_KEM_SS_SZ), 0); wc_MlKemKey_Free(key); @@ -2449,7 +2449,7 @@ int test_wc_mlkem_encapsulate_kats(void) ExpectIntEQ(wc_MlKemKey_Init(key, WC_ML_KEM_768, NULL, INVALID_DEVID), 0); ExpectIntEQ(wc_MlKemKey_DecodePublicKey(key, ek_768, sizeof(ek_768)), 0); ExpectIntEQ(wc_MlKemKey_EncapsulateWithRandom(key, ct, ss, seed_768, - sizeof(seed_768)), 0); + sizeof(seed_768)), SEED_OK); ExpectIntEQ(XMEMCMP(ct, c_768, WC_ML_KEM_768_CIPHER_TEXT_SIZE), 0); ExpectIntEQ(XMEMCMP(ss, k_768, WC_ML_KEM_SS_SZ), 0); wc_MlKemKey_Free(key); @@ -2458,7 +2458,7 @@ int test_wc_mlkem_encapsulate_kats(void) ExpectIntEQ(wc_MlKemKey_Init(key, WC_ML_KEM_1024, NULL, INVALID_DEVID), 0); ExpectIntEQ(wc_MlKemKey_DecodePublicKey(key, ek_1024, sizeof(ek_1024)), 0); ExpectIntEQ(wc_MlKemKey_EncapsulateWithRandom(key, ct, ss, seed_1024, - sizeof(seed_1024)), 0); + sizeof(seed_1024)), SEED_OK); ExpectIntEQ(XMEMCMP(ct, c_1024, WC_ML_KEM_1024_CIPHER_TEXT_SIZE), 0); ExpectIntEQ(XMEMCMP(ss, k_1024, WC_ML_KEM_SS_SZ), 0); wc_MlKemKey_Free(key); @@ -4650,6 +4650,36 @@ int test_wc_mlkem_encode_key_len_decision(void) return EXPECT_RESULT(); } /* END test_wc_mlkem_encode_key_len_decision */ +/* ML-KEM keygen from caller randomness succeeds and returns SEED_OK, the + * service indicator for a seed-input call (api.h). */ +int test_wc_MlKemKey_seed_service_indicator(void) +{ + EXPECT_DECLS; +#if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_MLKEM_NO_MAKE_KEY) && \ + !defined(WOLFSSL_NO_ML_KEM) + MlKemKey key; + byte rand[WC_ML_KEM_MAKEKEY_RAND_SZ]; +#ifndef WOLFSSL_NO_ML_KEM_768 + const int mlkemType = WC_ML_KEM_768; +#elif !defined(WOLFSSL_NO_ML_KEM_512) + const int mlkemType = WC_ML_KEM_512; +#else + const int mlkemType = WC_ML_KEM_1024; +#endif + + XMEMSET(&key, 0, sizeof(key)); + XMEMSET(rand, 0x5a, sizeof(rand)); + + ExpectIntEQ(wc_MlKemKey_Init(&key, mlkemType, NULL, INVALID_DEVID), 0); + /* Valid key, valid randomness: performed, and reported non-approved. */ + ExpectIntEQ(wc_MlKemKey_MakeKeyWithRandom(&key, rand, (int)sizeof(rand)), + SEED_OK); + + wc_MlKemKey_Free(&key); +#endif + return EXPECT_RESULT(); +} + #if defined(WOLFSSL_HAVE_MLKEM) && !defined(WOLFSSL_NO_ML_KEM) && \ defined(WOLF_CRYPTO_CB) && defined(WOLF_CRYPTO_CB_FREE) #define TEST_MLKEM_CB_FREE diff --git a/tests/api/test_mlkem.h b/tests/api/test_mlkem.h index dda2b4fce4e..1e89e89c31f 100644 --- a/tests/api/test_mlkem.h +++ b/tests/api/test_mlkem.h @@ -25,6 +25,7 @@ #include int test_wc_mlkem_make_key_kats(void); +int test_wc_MlKemKey_seed_service_indicator(void); int test_wc_mlkem_encapsulate_kats(void); int test_wc_mlkem_decapsulate_kats(void); int test_wc_mlkem_decapsulate_pubonly_fails(void); @@ -41,6 +42,7 @@ int test_wc_mlkem_cb_pending_rejected(void); #define TEST_MLKEM_DECLS \ TEST_DECL_GROUP("mlkem", test_wc_mlkem_make_key_kats), \ + TEST_DECL_GROUP("mlkem", test_wc_MlKemKey_seed_service_indicator), \ TEST_DECL_GROUP("mlkem", test_wc_mlkem_encapsulate_kats), \ TEST_DECL_GROUP("mlkem", test_wc_mlkem_decapsulate_kats), \ TEST_DECL_GROUP("mlkem", test_wc_mlkem_decapsulate_pubonly_fails), \ diff --git a/tests/api/test_slhdsa.c b/tests/api/test_slhdsa.c index dbe8c105683..590eb026188 100644 --- a/tests/api/test_slhdsa.c +++ b/tests/api/test_slhdsa.c @@ -660,7 +660,7 @@ int test_wc_slhdsa_make_key(void) ExpectIntEQ(wc_SlhDsaKey_MakeKeyWithRandom(&key, sk_seed, sizeof(sk_seed), sk_prf, sizeof(sk_prf), pk_seed, sizeof(pk_seed)), - 0); + SEED_OK); wc_SlhDsaKey_Free(&key); } #endif @@ -763,7 +763,7 @@ int test_wc_slhdsa_sign(void) msg, sizeof(msg), sig, &sigLen, NULL), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_SlhDsaKey_SignWithRandom(&key, ctx, sizeof(ctx), - msg, sizeof(msg), sig, &sigLen, addRnd), 0); + msg, sizeof(msg), sig, &sigLen, addRnd), SEED_OK); ExpectIntEQ(sigLen, expSigLen); wc_SlhDsaKey_Free(&key); @@ -1174,7 +1174,8 @@ int test_wc_slhdsa_sign_hash(void) hash, TEST_SLHDSA_PH_SZ, TEST_SLHDSA_PH, sig, &sigLen, NULL), WC_NO_ERR_TRACE(BAD_FUNC_ARG)); ExpectIntEQ(wc_SlhDsaKey_SignHashWithRandom(&key, ctx, sizeof(ctx), - hash, TEST_SLHDSA_PH_SZ, TEST_SLHDSA_PH, sig, &sigLen, addRnd), 0); + hash, TEST_SLHDSA_PH_SZ, TEST_SLHDSA_PH, sig, &sigLen, addRnd), + SEED_OK); ExpectIntEQ(wc_SlhDsaKey_VerifyHash(&key, ctx, sizeof(ctx), hash, TEST_SLHDSA_PH_SZ, TEST_SLHDSA_PH, sig, sigLen), 0); } @@ -1302,7 +1303,7 @@ int test_wc_slhdsa_sign_msg(void) * silently rely on the previous call having set it to params->sigLen. */ sigLen = WC_SLHDSA_MAX_SIG_LEN; ExpectIntEQ(wc_SlhDsaKey_SignMsgWithRandom(&key, mprime, sizeof(mprime), - sig, &sigLen, addRnd), 0); + sig, &sigLen, addRnd), SEED_OK); ExpectIntEQ(wc_SlhDsaKey_VerifyMsg(&key, mprime, sizeof(mprime), sig, sigLen), 0); @@ -1422,7 +1423,7 @@ int test_wc_slhdsa_sign_addrnd(void) ExpectIntEQ(wc_SlhDsaKey_Init(&key, TEST_SLHDSA_DEFAULT_PARAM, NULL, INVALID_DEVID), 0); ExpectIntEQ(wc_SlhDsaKey_MakeKeyWithRandom(&key, seed, n, seed + n, n, - seed + 2 * n, n), 0); + seed + 2 * n, n), SEED_OK); /* Deterministic: addRnd is PK.seed on both paths, so the two signatures * must be identical. */ @@ -1445,7 +1446,7 @@ int test_wc_slhdsa_sign_addrnd(void) * value is honoured rather than replaced with fresh randomness. */ sigIntLen = WC_SLHDSA_MAX_SIG_LEN; ExpectIntEQ(wc_SlhDsaKey_SignWithRandom(&key, ctx, (byte)sizeof(ctx), msg, - (word32)sizeof(msg) - 1, sigInt, &sigIntLen, addRnd), 0); + (word32)sizeof(msg) - 1, sigInt, &sigIntLen, addRnd), SEED_OK); ExpectIntEQ(sigIntLen, sigExtLen); ExpectIntNE(XMEMCMP(sigInt, sigExt, sigExtLen), 0); ExpectIntEQ(wc_SlhDsaKey_Verify(&key, ctx, (byte)sizeof(ctx), msg, @@ -1454,7 +1455,7 @@ int test_wc_slhdsa_sign_addrnd(void) /* The same explicit addRnd on the internal interface reproduces it. */ sigExtLen = WC_SLHDSA_MAX_SIG_LEN; ExpectIntEQ(wc_SlhDsaKey_SignMsgWithRandom(&key, mprime, idx, sigExt, - &sigExtLen, addRnd), 0); + &sigExtLen, addRnd), SEED_OK); ExpectIntEQ(sigExtLen, sigIntLen); ExpectBufEQ(sigExt, sigInt, sigIntLen); @@ -1558,12 +1559,12 @@ int test_wc_slhdsa_dev_only_key(void) sigLen = TEST_SLHDSA_DEFAULT_SIG_LEN; ExpectIntEQ(wc_SlhDsaKey_SignWithRandom(&key, ctx, (byte)sizeof(ctx), msg, - (word32)sizeof(msg) - 1, sig, &sigLen, addRnd), 0); + (word32)sizeof(msg) - 1, sig, &sigLen, addRnd), SEED_OK); ExpectIntEQ(calls, 2); sigLen = TEST_SLHDSA_DEFAULT_SIG_LEN; ExpectIntEQ(wc_SlhDsaKey_SignMsgWithRandom(&key, msg, - (word32)sizeof(msg) - 1, sig, &sigLen, addRnd), 0); + (word32)sizeof(msg) - 1, sig, &sigLen, addRnd), SEED_OK); ExpectIntEQ(calls, 3); /* MD5 is not an approved SLH-DSA pre-hash, so the host would reject it. @@ -1576,7 +1577,7 @@ int test_wc_slhdsa_dev_only_key(void) sigLen = TEST_SLHDSA_DEFAULT_SIG_LEN; ExpectIntEQ(wc_SlhDsaKey_SignHashWithRandom(&key, ctx, (byte)sizeof(ctx), hash, (word32)sizeof(hash), WC_HASH_TYPE_MD5, sig, &sigLen, addRnd), - 0); + SEED_OK); ExpectIntEQ(calls, 5); ExpectIntEQ(wc_SlhDsaKey_Verify(&key, ctx, (byte)sizeof(ctx), msg, @@ -4262,3 +4263,33 @@ int test_slhdsa_cb_free(void) #endif return EXPECT_RESULT(); } + +/* SLH-DSA keygen from caller seeds succeeds and returns SEED_OK, the service + * indicator for a seed-input call (api.h). */ +int test_wc_SlhDsaKey_seed_service_indicator(void) +{ + EXPECT_DECLS; +/* wc_slhdsa.h declares wc_SlhDsaKey_MakeKeyWithRandom() only under + * #ifndef WOLFSSL_SLHDSA_VERIFY_ONLY. */ +#if defined(WOLFSSL_HAVE_SLHDSA) && !defined(WOLFSSL_SLHDSA_VERIFY_ONLY) + SlhDsaKey key; + /* PK is PK.seed || PK.root, n bytes each (FIPS 205 sec 9.1), so n is half + * of PublicSize. */ + byte seeds[3][WC_SLHDSA_N_256]; /* n is at most 32 */ + int n = 0; + + XMEMSET(&key, 0, sizeof(key)); + XMEMSET(seeds, 0x5a, sizeof(seeds)); + + ExpectIntEQ(wc_SlhDsaKey_Init(&key, WC_SLHDSA_DEFAULT_PARAM, NULL, + INVALID_DEVID), 0); + ExpectIntGT(n = wc_SlhDsaKey_PublicSize(&key), 0); + n /= 2; + /* Valid key, valid randomness: performed, and reported non-approved. */ + ExpectIntEQ(wc_SlhDsaKey_MakeKeyWithRandom(&key, seeds[0], (word32)n, + seeds[1], (word32)n, seeds[2], (word32)n), SEED_OK); + + wc_SlhDsaKey_Free(&key); +#endif + return EXPECT_RESULT(); +} diff --git a/tests/api/test_slhdsa.h b/tests/api/test_slhdsa.h index e364b57c80c..ae63879dfd2 100644 --- a/tests/api/test_slhdsa.h +++ b/tests/api/test_slhdsa.h @@ -25,6 +25,7 @@ #include int test_wc_slhdsa(void); +int test_wc_SlhDsaKey_seed_service_indicator(void); int test_wc_slhdsa_sizes(void); int test_wc_slhdsa_make_key(void); int test_wc_slhdsa_sign(void); @@ -55,6 +56,7 @@ int test_slhdsa_cb_free(void); #define TEST_SLHDSA_DECLS \ TEST_DECL_GROUP("slhdsa", test_wc_slhdsa), \ + TEST_DECL_GROUP("slhdsa", test_wc_SlhDsaKey_seed_service_indicator), \ TEST_DECL_GROUP("slhdsa", test_wc_slhdsa_sizes), \ TEST_DECL_GROUP("slhdsa", test_wc_slhdsa_make_key), \ TEST_DECL_GROUP("slhdsa", test_wc_slhdsa_sign), \