Commit ba15a13ffe for openssl.org
commit ba15a13ffeca1e8b1a3042bdd383c3d45e7906d1
Author: Nikola Pajkovsky <nikolap@openssl.org>
Date: Thu May 21 07:14:07 2026 +0200
decode_der2key: wrap key-free callbacks to avoid function pointer casts
Signed-off-by: Nikola Pajkovsky <nikolap@openssl.org>
Reviewed-by: Neil Horman <nhorman@openssl.org>
Reviewed-by: Milan Broz <mbroz@openssl.org>
MergeDate: Thu Jun 25 12:12:55 2026
(Merged from https://github.com/openssl/openssl/pull/31523)
diff --git a/providers/implementations/encode_decode/decode_der2key.c b/providers/implementations/encode_decode/decode_der2key.c
index 964a86ff17..6ed99e68fa 100644
--- a/providers/implementations/encode_decode/decode_der2key.c
+++ b/providers/implementations/encode_decode/decode_der2key.c
@@ -404,11 +404,16 @@ static int der2key_export_object(void *vctx,
/* ---------------------------------------------------------------------- */
#ifndef OPENSSL_NO_DH
+static void dh_free_key(void *key)
+{
+ DH_free(key);
+}
+
#define dh_evp_type EVP_PKEY_DH
#define dh_d2i_private_key NULL
#define dh_d2i_public_key NULL
#define dh_d2i_key_params (d2i_of_void *)d2i_DHparams
-#define dh_free (free_key_fn *)DH_free
+#define dh_free dh_free_key
#define dh_check NULL
static void *dh_d2i_PKCS8(const unsigned char **der, long der_len,
@@ -431,7 +436,7 @@ static void dh_adjust(void *key, struct der2key_ctx_st *ctx)
#define dhx_d2i_public_key NULL
#define dhx_d2i_key_params (d2i_of_void *)d2i_DHxparams
#define dhx_d2i_PKCS8 dh_d2i_PKCS8
-#define dhx_free (free_key_fn *)DH_free
+#define dhx_free dh_free_key
#define dhx_check NULL
#define dhx_adjust dh_adjust
#endif
@@ -439,11 +444,16 @@ static void dh_adjust(void *key, struct der2key_ctx_st *ctx)
/* ---------------------------------------------------------------------- */
#ifndef OPENSSL_NO_DSA
+static void dsa_free_key(void *key)
+{
+ DSA_free(key);
+}
+
#define dsa_evp_type EVP_PKEY_DSA
#define dsa_d2i_private_key (d2i_of_void *)d2i_DSAPrivateKey
#define dsa_d2i_public_key (d2i_of_void *)d2i_DSAPublicKey
#define dsa_d2i_key_params (d2i_of_void *)d2i_DSAparams
-#define dsa_free (free_key_fn *)DSA_free
+#define dsa_free dsa_free_key
#define dsa_check NULL
static void *dsa_d2i_PKCS8(const unsigned char **der, long der_len,
@@ -464,11 +474,16 @@ static void dsa_adjust(void *key, struct der2key_ctx_st *ctx)
/* ---------------------------------------------------------------------- */
#ifndef OPENSSL_NO_EC
+static void ec_free_key(void *key)
+{
+ EC_KEY_free(key);
+}
+
#define ec_evp_type EVP_PKEY_EC
#define ec_d2i_private_key (d2i_of_void *)d2i_ECPrivateKey
#define ec_d2i_public_key NULL
#define ec_d2i_key_params (d2i_of_void *)d2i_ECParameters
-#define ec_free (free_key_fn *)EC_KEY_free
+#define ec_free ec_free_key
static void *ec_d2i_PKCS8(const unsigned char **der, long der_len,
struct der2key_ctx_st *ctx)
@@ -522,12 +537,17 @@ static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)
ossl_ecx_key_set0_libctx(key, PROV_LIBCTX_OF(ctx->provctx));
}
+static void ecx_free_key(void *key)
+{
+ ossl_ecx_key_free(key);
+}
+
#define ed25519_evp_type EVP_PKEY_ED25519
#define ed25519_d2i_private_key NULL
#define ed25519_d2i_public_key NULL
#define ed25519_d2i_key_params NULL
#define ed25519_d2i_PKCS8 ecx_d2i_PKCS8
-#define ed25519_free (free_key_fn *)ossl_ecx_key_free
+#define ed25519_free ecx_free_key
#define ed25519_check NULL
#define ed25519_adjust ecx_key_adjust
@@ -536,7 +556,7 @@ static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)
#define ed448_d2i_public_key NULL
#define ed448_d2i_key_params NULL
#define ed448_d2i_PKCS8 ecx_d2i_PKCS8
-#define ed448_free (free_key_fn *)ossl_ecx_key_free
+#define ed448_free ecx_free_key
#define ed448_check NULL
#define ed448_adjust ecx_key_adjust
@@ -545,7 +565,7 @@ static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)
#define x25519_d2i_public_key NULL
#define x25519_d2i_key_params NULL
#define x25519_d2i_PKCS8 ecx_d2i_PKCS8
-#define x25519_free (free_key_fn *)ossl_ecx_key_free
+#define x25519_free ecx_free_key
#define x25519_check NULL
#define x25519_adjust ecx_key_adjust
@@ -554,7 +574,7 @@ static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)
#define x448_d2i_public_key NULL
#define x448_d2i_key_params NULL
#define x448_d2i_PKCS8 ecx_d2i_PKCS8
-#define x448_free (free_key_fn *)ossl_ecx_key_free
+#define x448_free ecx_free_key
#define x448_check NULL
#define x448_adjust ecx_key_adjust
#endif /* OPENSSL_NO_ECX */
@@ -565,7 +585,7 @@ static void ecx_key_adjust(void *key, struct der2key_ctx_st *ctx)
#define sm2_d2i_public_key NULL
#define sm2_d2i_key_params (d2i_of_void *)d2i_ECParameters
#define sm2_d2i_PUBKEY ec_d2i_PUBKEY
-#define sm2_free (free_key_fn *)EC_KEY_free
+#define sm2_free ec_free_key
#define sm2_check ec_check
#define sm2_adjust ec_adjust
@@ -607,13 +627,18 @@ ml_kem_d2i_PUBKEY(const uint8_t **der, long der_len,
return key;
}
+static void ml_kem_free_key(void *key)
+{
+ ossl_ml_kem_key_free(key);
+}
+
#define ml_kem_512_evp_type EVP_PKEY_ML_KEM_512
#define ml_kem_512_d2i_private_key NULL
#define ml_kem_512_d2i_public_key NULL
#define ml_kem_512_d2i_key_params NULL
#define ml_kem_512_d2i_PUBKEY ml_kem_d2i_PUBKEY
#define ml_kem_512_d2i_PKCS8 ml_kem_d2i_PKCS8
-#define ml_kem_512_free (free_key_fn *)ossl_ml_kem_key_free
+#define ml_kem_512_free ml_kem_free_key
#define ml_kem_512_check NULL
#define ml_kem_512_adjust NULL
@@ -623,7 +648,7 @@ ml_kem_d2i_PUBKEY(const uint8_t **der, long der_len,
#define ml_kem_768_d2i_key_params NULL
#define ml_kem_768_d2i_PUBKEY ml_kem_d2i_PUBKEY
#define ml_kem_768_d2i_PKCS8 ml_kem_d2i_PKCS8
-#define ml_kem_768_free (free_key_fn *)ossl_ml_kem_key_free
+#define ml_kem_768_free ml_kem_free_key
#define ml_kem_768_check NULL
#define ml_kem_768_adjust NULL
@@ -633,13 +658,18 @@ ml_kem_d2i_PUBKEY(const uint8_t **der, long der_len,
#define ml_kem_1024_d2i_PUBKEY ml_kem_d2i_PUBKEY
#define ml_kem_1024_d2i_PKCS8 ml_kem_d2i_PKCS8
#define ml_kem_1024_d2i_key_params NULL
-#define ml_kem_1024_free (free_key_fn *)ossl_ml_kem_key_free
+#define ml_kem_1024_free ml_kem_free_key
#define ml_kem_1024_check NULL
#define ml_kem_1024_adjust NULL
#endif
#ifndef OPENSSL_NO_SLH_DSA
+static void slh_dsa_free_key(void *key)
+{
+ ossl_slh_dsa_key_free(key);
+}
+
static void *
slh_dsa_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)
{
@@ -768,7 +798,7 @@ err:
#define slh_dsa_sha2_128s_d2i_key_params NULL
#define slh_dsa_sha2_128s_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_sha2_128s_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_sha2_128s_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_sha2_128s_free slh_dsa_free_key
#define slh_dsa_sha2_128s_check NULL
#define slh_dsa_sha2_128s_adjust NULL
@@ -778,7 +808,7 @@ err:
#define slh_dsa_sha2_128f_d2i_key_params NULL
#define slh_dsa_sha2_128f_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_sha2_128f_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_sha2_128f_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_sha2_128f_free slh_dsa_free_key
#define slh_dsa_sha2_128f_check NULL
#define slh_dsa_sha2_128f_adjust NULL
@@ -788,7 +818,7 @@ err:
#define slh_dsa_sha2_192s_d2i_key_params NULL
#define slh_dsa_sha2_192s_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_sha2_192s_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_sha2_192s_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_sha2_192s_free slh_dsa_free_key
#define slh_dsa_sha2_192s_check NULL
#define slh_dsa_sha2_192s_adjust NULL
@@ -798,7 +828,7 @@ err:
#define slh_dsa_sha2_192f_d2i_key_params NULL
#define slh_dsa_sha2_192f_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_sha2_192f_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_sha2_192f_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_sha2_192f_free slh_dsa_free_key
#define slh_dsa_sha2_192f_check NULL
#define slh_dsa_sha2_192f_adjust NULL
@@ -808,7 +838,7 @@ err:
#define slh_dsa_sha2_256s_d2i_key_params NULL
#define slh_dsa_sha2_256s_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_sha2_256s_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_sha2_256s_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_sha2_256s_free slh_dsa_free_key
#define slh_dsa_sha2_256s_check NULL
#define slh_dsa_sha2_256s_adjust NULL
@@ -818,7 +848,7 @@ err:
#define slh_dsa_sha2_256f_d2i_key_params NULL
#define slh_dsa_sha2_256f_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_sha2_256f_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_sha2_256f_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_sha2_256f_free slh_dsa_free_key
#define slh_dsa_sha2_256f_check NULL
#define slh_dsa_sha2_256f_adjust NULL
@@ -828,7 +858,7 @@ err:
#define slh_dsa_shake_128s_d2i_key_params NULL
#define slh_dsa_shake_128s_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_shake_128s_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_shake_128s_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_shake_128s_free slh_dsa_free_key
#define slh_dsa_shake_128s_check NULL
#define slh_dsa_shake_128s_adjust NULL
@@ -838,7 +868,7 @@ err:
#define slh_dsa_shake_128f_d2i_key_params NULL
#define slh_dsa_shake_128f_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_shake_128f_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_shake_128f_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_shake_128f_free slh_dsa_free_key
#define slh_dsa_shake_128f_check NULL
#define slh_dsa_shake_128f_adjust NULL
@@ -848,7 +878,7 @@ err:
#define slh_dsa_shake_192s_d2i_key_params NULL
#define slh_dsa_shake_192s_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_shake_192s_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_shake_192s_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_shake_192s_free slh_dsa_free_key
#define slh_dsa_shake_192s_check NULL
#define slh_dsa_shake_192s_adjust NULL
@@ -858,7 +888,7 @@ err:
#define slh_dsa_shake_192f_d2i_key_params NULL
#define slh_dsa_shake_192f_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_shake_192f_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_shake_192f_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_shake_192f_free slh_dsa_free_key
#define slh_dsa_shake_192f_check NULL
#define slh_dsa_shake_192f_adjust NULL
@@ -868,7 +898,7 @@ err:
#define slh_dsa_shake_256s_d2i_key_params NULL
#define slh_dsa_shake_256s_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_shake_256s_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_shake_256s_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_shake_256s_free slh_dsa_free_key
#define slh_dsa_shake_256s_check NULL
#define slh_dsa_shake_256s_adjust NULL
@@ -878,18 +908,23 @@ err:
#define slh_dsa_shake_256f_d2i_key_params NULL
#define slh_dsa_shake_256f_d2i_PKCS8 slh_dsa_d2i_PKCS8
#define slh_dsa_shake_256f_d2i_PUBKEY slh_dsa_d2i_PUBKEY
-#define slh_dsa_shake_256f_free (free_key_fn *)ossl_slh_dsa_key_free
+#define slh_dsa_shake_256f_free slh_dsa_free_key
#define slh_dsa_shake_256f_check NULL
#define slh_dsa_shake_256f_adjust NULL
#endif /* OPENSSL_NO_SLH_DSA */
/* ---------------------------------------------------------------------- */
+static void rsa_free_key(void *key)
+{
+ RSA_free(key);
+}
+
#define rsa_evp_type EVP_PKEY_RSA
#define rsa_d2i_private_key (d2i_of_void *)d2i_RSAPrivateKey
#define rsa_d2i_public_key (d2i_of_void *)d2i_RSAPublicKey
#define rsa_d2i_key_params NULL
-#define rsa_free (free_key_fn *)RSA_free
+#define rsa_free rsa_free_key
static void *rsa_d2i_PKCS8(const unsigned char **der, long der_len,
struct der2key_ctx_st *ctx)
@@ -937,13 +972,18 @@ static void rsa_adjust(void *key, struct der2key_ctx_st *ctx)
#define rsapss_d2i_key_params NULL
#define rsapss_d2i_PKCS8 rsa_d2i_PKCS8
#define rsapss_d2i_PUBKEY rsa_d2i_PUBKEY
-#define rsapss_free (free_key_fn *)RSA_free
+#define rsapss_free rsa_free_key
#define rsapss_check rsa_check
#define rsapss_adjust rsa_adjust
/* ---------------------------------------------------------------------- */
#ifndef OPENSSL_NO_ML_DSA
+static void ml_dsa_free_key(void *key)
+{
+ ossl_ml_dsa_key_free(key);
+}
+
static void *
ml_dsa_d2i_PKCS8(const uint8_t **der, long der_len, struct der2key_ctx_st *ctx)
{
@@ -974,7 +1014,7 @@ static ossl_inline void *ml_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,
#define ml_dsa_44_d2i_key_params NULL
#define ml_dsa_44_d2i_PUBKEY ml_dsa_d2i_PUBKEY
#define ml_dsa_44_d2i_PKCS8 ml_dsa_d2i_PKCS8
-#define ml_dsa_44_free (free_key_fn *)ossl_ml_dsa_key_free
+#define ml_dsa_44_free ml_dsa_free_key
#define ml_dsa_44_check NULL
#define ml_dsa_44_adjust NULL
@@ -984,7 +1024,7 @@ static ossl_inline void *ml_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,
#define ml_dsa_65_d2i_key_params NULL
#define ml_dsa_65_d2i_PUBKEY ml_dsa_d2i_PUBKEY
#define ml_dsa_65_d2i_PKCS8 ml_dsa_d2i_PKCS8
-#define ml_dsa_65_free (free_key_fn *)ossl_ml_dsa_key_free
+#define ml_dsa_65_free ml_dsa_free_key
#define ml_dsa_65_check NULL
#define ml_dsa_65_adjust NULL
@@ -994,7 +1034,7 @@ static ossl_inline void *ml_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,
#define ml_dsa_87_d2i_PUBKEY ml_dsa_d2i_PUBKEY
#define ml_dsa_87_d2i_PKCS8 ml_dsa_d2i_PKCS8
#define ml_dsa_87_d2i_key_params NULL
-#define ml_dsa_87_free (free_key_fn *)ossl_ml_dsa_key_free
+#define ml_dsa_87_free ml_dsa_free_key
#define ml_dsa_87_check NULL
#define ml_dsa_87_adjust NULL
@@ -1003,8 +1043,13 @@ static ossl_inline void *ml_dsa_d2i_PUBKEY(const uint8_t **der, long der_len,
/* ---------------------------------------------------------------------- */
#ifndef OPENSSL_NO_LMS
+static void lms_free_key(void *key)
+{
+ ossl_lms_key_free(key);
+}
+
#define lms_evp_type EVP_PKEY_HSS_LMS
-#define lms_free (free_key_fn *)ossl_lms_key_free
+#define lms_free lms_free_key
#define lms_check NULL
#define lms_adjust NULL