]> git.ipfire.org Git - thirdparty/openssl.git/commitdiff
Erase temporary buffer in EVP_PKEY_get_bn_param()
authorAnatolii Lishchynskyi <iamnotacake@protonmail.com>
Wed, 29 Mar 2023 14:16:48 +0000 (17:16 +0300)
committerTomas Mraz <tomas@openssl.org>
Tue, 4 Apr 2023 10:05:25 +0000 (12:05 +0200)
Function EVP_PKEY_get_bn_param() uses temporary buffer (on stack or
heap allocated) to store serialized bignum, but after deserializing it
into BIGNUM*, the buffer is not erased and may contain sensitive data.

This change makes sure the buffer is erased if it was successfully
filled before. Unfortunately, it does not distinguish between public and
private key components, and will always erase the buffer.

Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/20639)

crypto/evp/p_lib.c

index 554fad927c12ac6531461a4c2c6044ee0e94c2c5..fa51304c97bea0c3aaaa163285ee22f8eb50d862 100644 (file)
@@ -2176,7 +2176,14 @@ int EVP_PKEY_get_bn_param(const EVP_PKEY *pkey, const char *key_name,
         goto err;
     ret = OSSL_PARAM_get_BN(params, bn);
 err:
-    OPENSSL_free(buf);
+    if (buf != NULL) {
+        if (OSSL_PARAM_modified(params))
+            OPENSSL_clear_free(buf, buf_sz);
+        else
+            OPENSSL_free(buf);
+    } else if (OSSL_PARAM_modified(params)) {
+        OPENSSL_cleanse(buffer, params[0].data_size);
+    }
     return ret;
 }