Commit 71c431ab0f for openssl.org
commit 71c431ab0f5f15668c0056a833fabacc848faf5e
Author: Mounir IDRASSI <mounir.idrassi@idrix.fr>
Date: Mon Sep 7 09:51:27 2026 +0900
encode_key2any: cleanse private DER on failure in key_to_p8info()
PKCS8_pkey_set0() can fail before taking ownership of the DER
buffer, so clear it before freeing it.
Fixes: cb58d81e68c7 "PROV SERIALIZER: add common functionality to serialize keys"
Reviewed-by: Dmitry Belyavskiy <beldmit@gmail.com>
Reviewed-by: Frederik Wedel-Heinen <fwh.openssl@gmail.com>
Reviewed-by: Eugene Syromiatnikov <esyr@openssl.org>
Merge-date: Tue Nov 10 11:48:49 2026
Merged-from: https://github.com/openssl/openssl/pull/32714
diff --git a/providers/implementations/encode_decode/encode_key2any.c b/providers/implementations/encode_decode/encode_key2any.c
index 082487b92b..29f0b04c85 100644
--- a/providers/implementations/encode_decode/encode_key2any.c
+++ b/providers/implementations/encode_decode/encode_key2any.c
@@ -96,7 +96,7 @@ static PKCS8_PRIV_KEY_INFO *key_to_p8info(const void *key, int key_nid,
{
/* der, derlen store the key DER output and its length */
unsigned char *der = NULL;
- int derlen;
+ int derlen = 0;
/* The final PKCS#8 info */
PKCS8_PRIV_KEY_INFO *p8info = NULL;
@@ -104,6 +104,8 @@ static PKCS8_PRIV_KEY_INFO *key_to_p8info(const void *key, int key_nid,
|| (derlen = k2d(key, &der, (void *)ctx)) <= 0
|| !PKCS8_pkey_set0(p8info, OBJ_nid2obj(key_nid), 0,
params_type, params, der, derlen)) {
+ if (der != NULL && derlen > 0)
+ OPENSSL_cleanse(der, derlen);
ERR_raise(ERR_LIB_PROV, ERR_R_ASN1_LIB);
PKCS8_PRIV_KEY_INFO_free(p8info);
free_asn1_data(params_type, params);