From: Nikola Pajkovsky Date: Thu, 21 May 2026 05:14:07 +0000 (+0200) Subject: decode_der2key: wrap key-free callbacks to avoid function pointer casts X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ba15a13ffeca1e8b1a3042bdd383c3d45e7906d1;p=thirdparty%2Fopenssl.git decode_der2key: wrap key-free callbacks to avoid function pointer casts Signed-off-by: Nikola Pajkovsky Reviewed-by: Neil Horman Reviewed-by: Milan Broz 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 964a86ff17f..6ed99e68fa5 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