diff options
Diffstat (limited to 'test/endecode_test.c')
-rw-r--r-- | test/endecode_test.c | 207 |
1 files changed, 201 insertions, 6 deletions
diff --git a/test/endecode_test.c b/test/endecode_test.c index 0611d94216f0..028deb4ed134 100644 --- a/test/endecode_test.c +++ b/test/endecode_test.c @@ -1,5 +1,5 @@ /* - * Copyright 2020-2024 The OpenSSL Project Authors. All Rights Reserved. + * Copyright 2020-2025 The OpenSSL Project Authors. All Rights Reserved. * * Licensed under the Apache License 2.0 (the "License"). You may not use * this file except in compliance with the License. You can obtain a copy @@ -26,6 +26,10 @@ #include "helpers/predefined_dhparams.h" #include "testutil.h" +#ifdef STATIC_LEGACY +OSSL_provider_init_fn ossl_legacy_provider_init; +#endif + /* Extended test macros to allow passing file & line number */ #define TEST_FL_ptr(a) test_ptr(file, line, #a, a) #define TEST_FL_mem_eq(a, m, b, n) test_mem_eq(file, line, #a, #b, a, m, b, n) @@ -44,6 +48,7 @@ static int default_libctx = 1; static int is_fips = 0; static int is_fips_3_0_0 = 0; +static int is_fips_lt_3_5 = 0; static OSSL_LIB_CTX *testctx = NULL; static OSSL_LIB_CTX *keyctx = NULL; @@ -101,7 +106,12 @@ static EVP_PKEY *make_template(const char *type, OSSL_PARAM *genparams) } #endif -#if !defined(OPENSSL_NO_DH) || !defined(OPENSSL_NO_DSA) || !defined(OPENSSL_NO_EC) +#if !defined(OPENSSL_NO_DH) || \ + !defined(OPENSSL_NO_DSA) || \ + !defined(OPENSSL_NO_EC) || \ + !defined(OPENSSL_NO_ML_DSA) || \ + !defined(OPENSSL_NO_ML_KEM) || \ + !defined(OPENSSL_NO_SLH_DSA) static EVP_PKEY *make_key(const char *type, EVP_PKEY *template, OSSL_PARAM *genparams) { @@ -692,9 +702,9 @@ static int check_PVK(const char *file, const int line, { const unsigned char *in = data; unsigned int saltlen = 0, keylen = 0; - int ok = ossl_do_PVK_header(&in, data_len, 0, &saltlen, &keylen); + int isdss = -1; - return ok; + return ossl_do_PVK_header(&in, data_len, 0, &isdss, &saltlen, &keylen); } static int test_unprotected_via_PVK(const char *type, EVP_PKEY *key) @@ -1032,6 +1042,12 @@ IMPLEMENT_TEST_SUITE_LEGACY(ECExplicitTri2G, "EC") KEYS(SM2); IMPLEMENT_TEST_SUITE(SM2, "SM2", 0) # endif +#endif +#ifndef OPENSSL_NO_ECX +/* + * ED25519, ED448, X25519 and X448 have no support for + * PEM_write_bio_PrivateKey_traditional(), so no legacy tests. + */ KEYS(ED25519); IMPLEMENT_TEST_SUITE(ED25519, "ED25519", 1) KEYS(ED448); @@ -1040,11 +1056,45 @@ KEYS(X25519); IMPLEMENT_TEST_SUITE(X25519, "X25519", 1) KEYS(X448); IMPLEMENT_TEST_SUITE(X448, "X448", 1) +#endif +#ifndef OPENSSL_NO_ML_KEM /* - * ED25519, ED448, X25519 and X448 have no support for - * PEM_write_bio_PrivateKey_traditional(), so no legacy tests. + * ML-KEM has no support for PEM_write_bio_PrivateKey_traditional(), so no + * legacy tests. */ +KEYS(ML_KEM_512); +IMPLEMENT_TEST_SUITE(ML_KEM_512, "ML-KEM-512", 1) +KEYS(ML_KEM_768); +IMPLEMENT_TEST_SUITE(ML_KEM_768, "ML-KEM-768", 1) +KEYS(ML_KEM_1024); +IMPLEMENT_TEST_SUITE(ML_KEM_1024, "ML-KEM-1024", 1) #endif +#ifndef OPENSSL_NO_SLH_DSA +KEYS(SLH_DSA_SHA2_128s); +KEYS(SLH_DSA_SHA2_128f); +KEYS(SLH_DSA_SHA2_192s); +KEYS(SLH_DSA_SHA2_192f); +KEYS(SLH_DSA_SHA2_256s); +KEYS(SLH_DSA_SHA2_256f); +KEYS(SLH_DSA_SHAKE_128s); +KEYS(SLH_DSA_SHAKE_128f); +KEYS(SLH_DSA_SHAKE_192s); +KEYS(SLH_DSA_SHAKE_192f); +KEYS(SLH_DSA_SHAKE_256s); +KEYS(SLH_DSA_SHAKE_256f); +IMPLEMENT_TEST_SUITE(SLH_DSA_SHA2_128s, "SLH-DSA-SHA2-128s", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHA2_128f, "SLH-DSA-SHA2-128f", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHA2_192s, "SLH-DSA-SHA2-192s", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHA2_192f, "SLH-DSA-SHA2-192f", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHA2_256s, "SLH-DSA-SHA2-256s", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHA2_256f, "SLH-DSA-SHA2-256f", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHAKE_128s, "SLH-DSA-SHAKE-128s", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHAKE_128f, "SLH-DSA-SHAKE-128f", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHAKE_192s, "SLH-DSA-SHAKE-192s", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHAKE_192f, "SLH-DSA-SHAKE-192f", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHAKE_256s, "SLH-DSA-SHAKE-256s", 1) +IMPLEMENT_TEST_SUITE(SLH_DSA_SHAKE_256f, "SLH-DSA-SHAKE-256f", 1) +#endif /* OPENSSL_NO_SLH_DSA */ KEYS(RSA); IMPLEMENT_TEST_SUITE(RSA, "RSA", 1) IMPLEMENT_TEST_SUITE_LEGACY(RSA, "RSA") @@ -1060,6 +1110,15 @@ IMPLEMENT_TEST_SUITE_UNPROTECTED_PVK(RSA, "RSA") IMPLEMENT_TEST_SUITE_PROTECTED_PVK(RSA, "RSA") #endif +#ifndef OPENSSL_NO_ML_DSA +KEYS(ML_DSA_44); +KEYS(ML_DSA_65); +KEYS(ML_DSA_87); +IMPLEMENT_TEST_SUITE(ML_DSA_44, "ML-DSA-44", 1) +IMPLEMENT_TEST_SUITE(ML_DSA_65, "ML-DSA-65", 1) +IMPLEMENT_TEST_SUITE(ML_DSA_87, "ML-DSA-87", 1) +#endif /* OPENSSL_NO_ML_DSA */ + #ifndef OPENSSL_NO_EC /* Explicit parameters that match a named curve */ static int do_create_ec_explicit_prime_params(OSSL_PARAM_BLD *bld, @@ -1241,6 +1300,28 @@ static int create_ec_explicit_trinomial_params(OSSL_PARAM_BLD *bld) return do_create_ec_explicit_trinomial_params(bld, gen2, sizeof(gen2)); } # endif /* OPENSSL_NO_EC2M */ + +/* + * Test that multiple calls to OSSL_ENCODER_to_data() do not cause side effects + */ +static int ec_encode_to_data_multi(void) +{ + int ret; + OSSL_ENCODER_CTX *ectx = NULL; + EVP_PKEY *key = NULL; + uint8_t *enc = NULL; + size_t enc_len = 0; + + ret = TEST_ptr(key = EVP_PKEY_Q_keygen(testctx, "", "EC", "P-256")) + && TEST_ptr(ectx = OSSL_ENCODER_CTX_new_for_pkey(key, EVP_PKEY_KEYPAIR, + "DER", NULL, NULL)) + && TEST_int_eq(OSSL_ENCODER_to_data(ectx, NULL, &enc_len), 1) + && TEST_int_eq(OSSL_ENCODER_to_data(ectx, &enc, &enc_len), 1); + OPENSSL_free(enc); + EVP_PKEY_free(key); + OSSL_ENCODER_CTX_free(ectx); + return ret; +} #endif /* OPENSSL_NO_EC */ typedef enum OPTION_choice { @@ -1338,6 +1419,18 @@ int setup_tests(void) /* FIPS(3.0.0): provider imports explicit params but they won't work #17998 */ is_fips_3_0_0 = is_fips && fips_provider_version_eq(testctx, 3, 0, 0); + /* FIPS(3.5.0) is the first to support ML-DSA, ML-KEM and SLH-DSA */ + is_fips_lt_3_5 = is_fips && fips_provider_version_lt(testctx, 3, 5, 0); + +#ifdef STATIC_LEGACY + /* + * This test is always statically linked against libcrypto. We must not + * attempt to load legacy.so that might be dynamically linked against + * libcrypto. Instead we use a built-in version of the legacy provider. + */ + if (!OSSL_PROVIDER_add_builtin(testctx, "legacy", ossl_legacy_provider_init)) + return 0; +#endif /* Separate provider/ctx for generating the test data */ if (!TEST_ptr(keyctx = OSSL_LIB_CTX_new())) @@ -1388,11 +1481,44 @@ int setup_tests(void) # ifndef OPENSSL_NO_SM2 MAKE_KEYS(SM2, "SM2", NULL); # endif +#endif +#ifndef OPENSSL_NO_ECX MAKE_KEYS(ED25519, "ED25519", NULL); MAKE_KEYS(ED448, "ED448", NULL); MAKE_KEYS(X25519, "X25519", NULL); MAKE_KEYS(X448, "X448", NULL); #endif +#ifndef OPENSSL_NO_ML_DSA + if (!is_fips_lt_3_5) { + MAKE_KEYS(ML_DSA_44, "ML-DSA-44", NULL); + MAKE_KEYS(ML_DSA_65, "ML-DSA-65", NULL); + MAKE_KEYS(ML_DSA_87, "ML-DSA-87", NULL); + } +#endif /* OPENSSL_NO_ML_DSA */ +#ifndef OPENSSL_NO_ML_KEM + if (!is_fips_lt_3_5) { + MAKE_KEYS(ML_KEM_512, "ML-KEM-512", NULL); + MAKE_KEYS(ML_KEM_768, "ML-KEM-768", NULL); + MAKE_KEYS(ML_KEM_1024, "ML-KEM-1024", NULL); + } +#endif +#ifndef OPENSSL_NO_SLH_DSA + if (!is_fips_lt_3_5) { + MAKE_KEYS(SLH_DSA_SHA2_128s, "SLH-DSA-SHA2-128s", NULL); + MAKE_KEYS(SLH_DSA_SHA2_128f, "SLH-DSA-SHA2-128f", NULL); + MAKE_KEYS(SLH_DSA_SHA2_192s, "SLH-DSA-SHA2-192s", NULL); + MAKE_KEYS(SLH_DSA_SHA2_192f, "SLH-DSA-SHA2-192f", NULL); + MAKE_KEYS(SLH_DSA_SHA2_256s, "SLH-DSA-SHA2-256s", NULL); + MAKE_KEYS(SLH_DSA_SHA2_256f, "SLH-DSA-SHA2-256f", NULL); + MAKE_KEYS(SLH_DSA_SHAKE_128s, "SLH-DSA-SHAKE-128s", NULL); + MAKE_KEYS(SLH_DSA_SHAKE_128f, "SLH-DSA-SHAKE-128f", NULL); + MAKE_KEYS(SLH_DSA_SHAKE_192s, "SLH-DSA-SHAKE-192s", NULL); + MAKE_KEYS(SLH_DSA_SHAKE_192f, "SLH-DSA-SHAKE-192f", NULL); + MAKE_KEYS(SLH_DSA_SHAKE_256s, "SLH-DSA-SHAKE-256s", NULL); + MAKE_KEYS(SLH_DSA_SHAKE_256f, "SLH-DSA-SHAKE-256f", NULL); + } +#endif /* OPENSSL_NO_SLH_DSA */ + TEST_info("Loading RSA key..."); ok = ok && TEST_ptr(key_RSA = load_pkey_pem(rsa_file, keyctx)); TEST_info("Loading RSA_PSS key..."); @@ -1421,6 +1547,7 @@ int setup_tests(void) # endif #endif #ifndef OPENSSL_NO_EC + ADD_TEST(ec_encode_to_data_multi); ADD_TEST_SUITE(EC); ADD_TEST_SUITE_PARAMS(EC); ADD_TEST_SUITE_LEGACY(EC); @@ -1440,6 +1567,8 @@ int setup_tests(void) ADD_TEST_SUITE(SM2); } # endif +#endif +#ifndef OPENSSL_NO_ECX ADD_TEST_SUITE(ED25519); ADD_TEST_SUITE(ED448); ADD_TEST_SUITE(X25519); @@ -1449,6 +1578,13 @@ int setup_tests(void) * PEM_write_bio_PrivateKey_traditional(), so no legacy tests. */ #endif +#ifndef OPENSSL_NO_ML_KEM + if (!is_fips_lt_3_5) { + ADD_TEST_SUITE(ML_KEM_512); + ADD_TEST_SUITE(ML_KEM_768); + ADD_TEST_SUITE(ML_KEM_1024); + } +#endif ADD_TEST_SUITE(RSA); ADD_TEST_SUITE_LEGACY(RSA); ADD_TEST_SUITE(RSA_PSS); @@ -1461,6 +1597,31 @@ int setup_tests(void) # ifndef OPENSSL_NO_RC4 ADD_TEST_SUITE_PROTECTED_PVK(RSA); # endif + +#ifndef OPENSSL_NO_ML_DSA + if (!is_fips_lt_3_5) { + ADD_TEST_SUITE(ML_DSA_44); + ADD_TEST_SUITE(ML_DSA_65); + ADD_TEST_SUITE(ML_DSA_87); + } +#endif /* OPENSSL_NO_ML_DSA */ + +#ifndef OPENSSL_NO_SLH_DSA + if (!is_fips_lt_3_5) { + ADD_TEST_SUITE(SLH_DSA_SHA2_128s); + ADD_TEST_SUITE(SLH_DSA_SHA2_128f); + ADD_TEST_SUITE(SLH_DSA_SHA2_192s); + ADD_TEST_SUITE(SLH_DSA_SHA2_192f); + ADD_TEST_SUITE(SLH_DSA_SHA2_256s); + ADD_TEST_SUITE(SLH_DSA_SHA2_256f); + ADD_TEST_SUITE(SLH_DSA_SHAKE_128s); + ADD_TEST_SUITE(SLH_DSA_SHAKE_128f); + ADD_TEST_SUITE(SLH_DSA_SHAKE_192s); + ADD_TEST_SUITE(SLH_DSA_SHAKE_192f); + ADD_TEST_SUITE(SLH_DSA_SHAKE_256s); + ADD_TEST_SUITE(SLH_DSA_SHAKE_256f); + } +#endif /* OPENSSL_NO_SLH_DSA */ } return 1; @@ -1500,14 +1661,48 @@ void cleanup_tests(void) # ifndef OPENSSL_NO_SM2 FREE_KEYS(SM2); # endif +#endif +#ifndef OPENSSL_NO_ECX FREE_KEYS(ED25519); FREE_KEYS(ED448); FREE_KEYS(X25519); FREE_KEYS(X448); #endif +#ifndef OPENSSL_NO_ML_KEM + if (!is_fips_lt_3_5) { + FREE_KEYS(ML_KEM_512); + FREE_KEYS(ML_KEM_768); + FREE_KEYS(ML_KEM_1024); + } +#endif FREE_KEYS(RSA); FREE_KEYS(RSA_PSS); +#ifndef OPENSSL_NO_ML_DSA + if (!is_fips_lt_3_5) { + FREE_KEYS(ML_DSA_44); + FREE_KEYS(ML_DSA_65); + FREE_KEYS(ML_DSA_87); + } +#endif /* OPENSSL_NO_ML_DSA */ + +#ifndef OPENSSL_NO_SLH_DSA + if (!is_fips_lt_3_5) { + FREE_KEYS(SLH_DSA_SHA2_128s); + FREE_KEYS(SLH_DSA_SHA2_128f); + FREE_KEYS(SLH_DSA_SHA2_192s); + FREE_KEYS(SLH_DSA_SHA2_192f); + FREE_KEYS(SLH_DSA_SHA2_256s); + FREE_KEYS(SLH_DSA_SHA2_256f); + FREE_KEYS(SLH_DSA_SHAKE_128s); + FREE_KEYS(SLH_DSA_SHAKE_128f); + FREE_KEYS(SLH_DSA_SHAKE_192s); + FREE_KEYS(SLH_DSA_SHAKE_192f); + FREE_KEYS(SLH_DSA_SHAKE_256s); + FREE_KEYS(SLH_DSA_SHAKE_256f); + } +#endif /* OPENSSL_NO_SLH_DSA */ + OSSL_PROVIDER_unload(nullprov); OSSL_PROVIDER_unload(deflprov); OSSL_PROVIDER_unload(keyprov); |