Commit ead11ab950 for openssl.org
commit ead11ab950002565d7f67d9e163fdc58e5793f26
Author: Simo Sorce <simo@redhat.com>
Date: Wed Dec 17 11:04:13 2025 -0500
Add an ID to the self test structure
Add a self test id to the self test definition structure. This is used as a
sanity check to ensure that a test's enum ID matches its index in the
`st_all_tests` array.
This helps prevent programming errors when adding, removing, or reordering
tests in the future, improving the robustness of the self-test mechanism.
Signed-off-by: Simo Sorce <simo@redhat.com>
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
(Merged from https://github.com/openssl/openssl/pull/29222)
diff --git a/providers/fips/self_test.h b/providers/fips/self_test.h
index 2083ce5226..a2c14beaa2 100644
--- a/providers/fips/self_test.h
+++ b/providers/fips/self_test.h
@@ -150,6 +150,7 @@ typedef struct st_kat_mac_st {
} ST_KAT_MAC;
typedef struct self_test_st {
+ self_test_id_t id;
const char *algorithm;
const char *desc;
enum st_test_category category;
diff --git a/providers/fips/self_test_data.c b/providers/fips/self_test_data.c
index 73b3ebec29..71af012099 100644
--- a/providers/fips/self_test_data.c
+++ b/providers/fips/self_test_data.c
@@ -3327,6 +3327,7 @@ static const ST_KAT_PARAM hmac_kat_params[] = {
ST_DEFINITION st_all_tests[ST_ID_MAX] = {
{
+ ST_ID_DIGEST_SHA1,
"SHA1",
OSSL_SELF_TEST_DESC_MD_SHA1,
SELF_TEST_KAT_DIGEST,
@@ -3336,6 +3337,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
ITM_BUF(sha1_digest),
},
{
+ ST_ID_DIGEST_SHA256,
"SHA256",
OSSL_SELF_TEST_DESC_MD_SHA2,
SELF_TEST_KAT_DIGEST,
@@ -3345,6 +3347,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
ITM_BUF(sha256_digest),
},
{
+ ST_ID_DIGEST_SHA512,
"SHA512",
OSSL_SELF_TEST_DESC_MD_SHA2,
SELF_TEST_KAT_DIGEST,
@@ -3354,6 +3357,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
ITM_BUF(sha512_digest),
},
{
+ ST_ID_DIGEST_SHA3_256,
"SHA3-256",
OSSL_SELF_TEST_DESC_MD_SHA3,
SELF_TEST_KAT_DIGEST,
@@ -3362,7 +3366,9 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
ITM_BUF(sha3_256_pt),
ITM_BUF(sha3_256_digest),
},
- { "AES-256-GCM",
+ {
+ ST_ID_CIPHER_AES_256_GCM,
+ "AES-256-GCM",
OSSL_SELF_TEST_DESC_CIPHER_AES_GCM,
SELF_TEST_KAT_CIPHER,
SELF_TEST_DEFERRED,
@@ -3374,8 +3380,10 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
ITM_BUF(aes_256_gcm_key),
ITM_BUF(aes_256_gcm_iv),
ITM_BUF(aes_256_gcm_aad),
- ITM_BUF(aes_256_gcm_tag) } },
+ ITM_BUF(aes_256_gcm_tag) },
+ },
{
+ ST_ID_CIPHER_AES_128_ECB,
"AES-128-ECB",
OSSL_SELF_TEST_DESC_CIPHER_AES_ECB,
SELF_TEST_KAT_CIPHER,
@@ -3390,6 +3398,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#ifndef OPENSSL_NO_DES
{
+ ST_ID_CIPHER_DES_EDE3_ECB,
"DES-EDE3-ECB",
OSSL_SELF_TEST_DESC_CIPHER_TDES,
SELF_TEST_KAT_CIPHER,
@@ -3404,6 +3413,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#endif
{
+ ST_ID_SIG_RSA_SHA256,
"RSA-SHA256",
OSSL_SELF_TEST_DESC_SIGN_RSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3422,6 +3432,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#ifndef OPENSSL_NO_EC
{
+ ST_ID_SIG_ECDSA_SHA256,
"ECDSA-SHA256",
OSSL_SELF_TEST_DESC_SIGN_ECDSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3441,6 +3452,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#ifndef OPENSSL_NO_HMAC_DRBG_KDF
{
+ ST_ID_SIG_DET_ECDSA_SHA256,
"ECDSA-SHA256",
OSSL_SELF_TEST_DESC_SIGN_DetECDSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3458,6 +3470,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_EC2M
{
+ ST_ID_SIG_E2CM_ECDSA_SHA256,
"ECDSA-SHA256",
OSSL_SELF_TEST_DESC_SIGN_ECDSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3477,6 +3490,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_ECX
{
+ ST_ID_SIG_ED448,
"ED448",
OSSL_SELF_TEST_DESC_SIGN_EDDSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3491,6 +3505,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
},
{
+ ST_ID_SIG_ED25519,
"ED25519",
OSSL_SELF_TEST_DESC_SIGN_EDDSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3508,6 +3523,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif /* OPENSSL_NO_EC */
#ifndef OPENSSL_NO_DSA
{
+ ST_ID_SIG_DSA_SHA256,
"DSA-SHA256",
OSSL_SELF_TEST_DESC_SIGN_DSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3527,6 +3543,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif /* OPENSSL_NO_DSA */
#ifndef OPENSSL_NO_ML_DSA
{
+ ST_ID_SIG_ML_DSA_65,
"ML-DSA-65",
OSSL_SELF_TEST_DESC_SIGN_ML_DSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3555,6 +3572,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
* here.
*/
{
+ ST_ID_SIG_SLH_DSA_SHA2_128F,
"SLH-DSA-SHA2-128f",
OSSL_SELF_TEST_DESC_SIGN_SLH_DSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3571,6 +3589,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
},
{
+ ST_ID_SIG_SLH_DSA_SHAKE_128F,
"SLH-DSA-SHAKE-128f",
OSSL_SELF_TEST_DESC_SIGN_SLH_DSA,
SELF_TEST_KAT_SIGNATURE,
@@ -3598,6 +3617,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
*/
#ifndef OPENSSL_NO_LMS
{
+ ST_ID_SIG_LMS,
"LMS",
OSSL_SELF_TEST_DESC_SIGN_LMS,
SELF_TEST_KAT_SIGNATURE,
@@ -3613,6 +3633,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#endif /* OPENSSL_NO_LMS */
{
+ ST_ID_KDF_TLS13_EXTRACT,
OSSL_KDF_NAME_TLS1_3_KDF,
OSSL_SELF_TEST_DESC_KDF_TLS13_EXTRACT,
SELF_TEST_KAT_KDF,
@@ -3625,6 +3646,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
.depends_on = hkdf_depends_on,
},
{
+ ST_ID_KDF_TLS13_EXPAND,
OSSL_KDF_NAME_TLS1_3_KDF,
OSSL_SELF_TEST_DESC_KDF_TLS13_EXPAND,
SELF_TEST_KAT_KDF,
@@ -3637,6 +3659,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
.depends_on = hkdf_depends_on,
},
{
+ ST_ID_KDF_TLS12_PRF,
OSSL_KDF_NAME_TLS1_PRF,
OSSL_SELF_TEST_DESC_KDF_TLS12_PRF,
SELF_TEST_KAT_KDF,
@@ -3648,6 +3671,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
},
{
+ ST_ID_KDF_PBKDF2,
OSSL_KDF_NAME_PBKDF2,
OSSL_SELF_TEST_DESC_KDF_PBKDF2,
SELF_TEST_KAT_KDF,
@@ -3660,6 +3684,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#ifndef OPENSSL_NO_KBKDF
{
+ ST_ID_KDF_KBKDF,
OSSL_KDF_NAME_KBKDF,
OSSL_SELF_TEST_DESC_KDF_KBKDF,
SELF_TEST_KAT_KDF,
@@ -3672,6 +3697,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
.depends_on = kbkdf_depends_on,
},
{
+ ST_ID_KDF_KBKDF_KMAC,
OSSL_KDF_NAME_KBKDF,
OSSL_SELF_TEST_DESC_KDF_KBKDF_KMAC,
SELF_TEST_KAT_KDF,
@@ -3685,6 +3711,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#endif
{
+ ST_ID_KDF_HKDF,
OSSL_KDF_NAME_HKDF,
OSSL_SELF_TEST_DESC_KDF_HKDF,
SELF_TEST_KAT_KDF,
@@ -3698,6 +3725,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#ifndef OPENSSL_NO_SNMPKDF
{
+ ST_ID_KDF_SNMPKDF,
OSSL_KDF_NAME_SNMPKDF,
OSSL_SELF_TEST_DESC_KDF_SNMPKDF,
SELF_TEST_KAT_KDF,
@@ -3711,6 +3739,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_SRTPKDF
{
+ ST_ID_KDF_SRTPKDF,
OSSL_KDF_NAME_SRTPKDF,
OSSL_SELF_TEST_DESC_KDF_SRTPKDF,
SELF_TEST_KAT_KDF,
@@ -3724,6 +3753,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_SSKDF
{
+ ST_ID_KDF_SSKDF,
OSSL_KDF_NAME_SSKDF,
OSSL_SELF_TEST_DESC_KDF_SSKDF,
SELF_TEST_KAT_KDF,
@@ -3735,6 +3765,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_X963KDF
{
+ ST_ID_KDF_X963KDF,
OSSL_KDF_NAME_X963KDF,
OSSL_SELF_TEST_DESC_KDF_X963KDF,
SELF_TEST_KAT_KDF,
@@ -3746,6 +3777,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_X942KDF
{
+ ST_ID_KDF_X942KDF,
OSSL_KDF_NAME_X942KDF_ASN1,
OSSL_SELF_TEST_DESC_KDF_X942KDF,
SELF_TEST_KAT_KDF,
@@ -3758,6 +3790,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#endif
{
+ ST_ID_DRBG_HASH,
"HASH-DRBG",
OSSL_SELF_TEST_DESC_DRBG_HASH,
SELF_TEST_DRBG,
@@ -3777,6 +3810,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
},
{
+ ST_ID_DRBG_CTR,
"CTR-DRBG",
OSSL_SELF_TEST_DESC_DRBG_CTR,
SELF_TEST_DRBG,
@@ -3796,6 +3830,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
},
{
+ ST_ID_DRBG_HMAC,
"HMAC-DRBG",
OSSL_SELF_TEST_DESC_DRBG_HMAC,
SELF_TEST_DRBG,
@@ -3816,6 +3851,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#ifndef OPENSSL_NO_DH
{
+ ST_ID_KA_DH,
"DH",
OSSL_SELF_TEST_DESC_KA_DH,
SELF_TEST_KAT_KAS,
@@ -3831,6 +3867,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_EC
{
+ ST_ID_KA_ECDH,
"EC",
OSSL_SELF_TEST_DESC_KA_ECDH,
SELF_TEST_KAT_KAS,
@@ -3850,6 +3887,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
* key generation.
*/
{
+ ST_ID_ASYM_KEYGEN_ML_KEM,
"ML-KEM-512",
OSSL_SELF_TEST_DESC_KEYGEN_ML_KEM,
SELF_TEST_KAT_ASYM_KEYGEN,
@@ -3863,6 +3901,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_ML_DSA
{
+ ST_ID_ASYM_KEYGEN_ML_DSA,
"ML-DSA-65",
OSSL_SELF_TEST_DESC_KEYGEN_ML_DSA,
SELF_TEST_KAT_ASYM_KEYGEN,
@@ -3876,6 +3915,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_SLH_DSA
{
+ ST_ID_ASYM_KEYGEN_SLH_DSA,
"SLH-DSA-SHA2-128f",
OSSL_SELF_TEST_DESC_KEYGEN_SLH_DSA,
SELF_TEST_KAT_ASYM_KEYGEN,
@@ -3889,6 +3929,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
#endif
#ifndef OPENSSL_NO_ML_KEM
{
+ ST_ID_KEM_ML_KEM,
"ML-KEM-512",
OSSL_SELF_TEST_DESC_KEM,
SELF_TEST_KAT_KEM,
@@ -3904,6 +3945,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
},
#endif
{
+ ST_ID_ASYM_CIPHER_RSA_ENC,
"RSA",
OSSL_SELF_TEST_DESC_ASYM_RSA_ENC,
SELF_TEST_KAT_ASYM_CIPHER,
@@ -3919,6 +3961,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
.depends_on = rsaenc_depends_on,
},
{
+ ST_ID_ASYM_CIPHER_RSA_DEC,
"RSA",
OSSL_SELF_TEST_DESC_ASYM_RSA_DEC,
SELF_TEST_KAT_ASYM_CIPHER,
@@ -3934,6 +3977,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
.depends_on = rsaenc_depends_on,
},
{
+ ST_ID_ASYM_CIPHER_RSA_DEC_CRT,
"RSA",
OSSL_SELF_TEST_DESC_ASYM_RSA_DEC,
SELF_TEST_KAT_ASYM_CIPHER,
@@ -3949,6 +3993,7 @@ ST_DEFINITION st_all_tests[ST_ID_MAX] = {
.depends_on = rsaenc_depends_on,
},
{
+ ST_ID_MAC_HMAC,
"HMAC",
OSSL_SELF_TEST_DESC_INTEGRITY_HMAC,
SELF_TEST_KAT_MAC,
diff --git a/providers/fips/self_test_kats.c b/providers/fips/self_test_kats.c
index 59e0346162..20743d144f 100644
--- a/providers/fips/self_test_kats.c
+++ b/providers/fips/self_test_kats.c
@@ -12,6 +12,7 @@
#include <openssl/kdf.h>
#include <openssl/core_names.h>
#include <openssl/param_build.h>
+#include <openssl/proverr.h>
#include <openssl/rand.h>
#include "crypto/ml_dsa.h"
#include "crypto/rand.h"
@@ -1114,6 +1115,11 @@ int SELF_TEST_kats(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx, int do_deferred)
for (i = 0; i < ST_ID_MAX; i++) {
int res;
+ if (st_all_tests[i].id != i) {
+ ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_CONFIG_DATA);
+ return 0;
+ }
+
if (!do_deferred && (st_all_tests[i].deferred == SELF_TEST_DEFERRED) && (st_all_tests[i].state != SELF_TEST_STATE_PASSED))
continue;
@@ -1180,8 +1186,10 @@ int SELF_TEST_kats_single(OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx, int id)
EVP_RAND_CTX *saved_rand = ossl_rand_get0_private_noncreating(libctx);
int ret;
- if (id >= ST_ID_MAX)
+ if (id >= ST_ID_MAX || st_all_tests[id].id != id) {
+ ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_CONFIG_DATA);
return 0;
+ }
if (saved_rand != NULL && !EVP_RAND_CTX_up_ref(saved_rand))
return 0;