summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorDarshan Sen <raisinten@gmail.com>2022-01-14 16:22:41 +0530
committerTomas Mraz <tomas@openssl.org>2022-01-26 17:15:52 +0100
commit59ccb72cd5cec3b4e312853621e12a68dacdbc7e (patch)
treef4066fb24a4b966c4fe1c21ff87af794320b0e60 /test
parent814999cb44135fd197945693a7c00cf0af784206 (diff)
Fix invalid malloc failures in PEM_write_bio_PKCS8PrivateKey()
When `PEM_write_bio_PKCS8PrivateKey()` was passed an empty passphrase string, `OPENSSL_memdup()` was incorrectly getting used for 0 bytes size allocation, which resulted in malloc failures. Fixes: https://github.com/openssl/openssl/issues/17506 Signed-off-by: Darshan Sen <raisinten@gmail.com> Reviewed-by: Bernd Edlinger <bernd.edlinger@hotmail.de> Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/17507)
Diffstat (limited to 'test')
-rw-r--r--test/evp_pkey_provided_test.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/test/evp_pkey_provided_test.c b/test/evp_pkey_provided_test.c
index cf4d8e1294..b4b53f67fc 100644
--- a/test/evp_pkey_provided_test.c
+++ b/test/evp_pkey_provided_test.c
@@ -128,6 +128,16 @@ static int compare_with_file(const char *alg, int type, BIO *membio)
return ret;
}
+static int pass_cb(char *buf, int size, int rwflag, void *u)
+{
+ return 0;
+}
+
+static int pass_cb_error(char *buf, int size, int rwflag, void *u)
+{
+ return -1;
+}
+
static int test_print_key_using_pem(const char *alg, const EVP_PKEY *pk)
{
BIO *membio = BIO_new(BIO_s_mem());
@@ -140,6 +150,21 @@ static int test_print_key_using_pem(const char *alg, const EVP_PKEY *pk)
!TEST_true(PEM_write_bio_PrivateKey(bio_out, pk, EVP_aes_256_cbc(),
(unsigned char *)"pass", 4,
NULL, NULL))
+ /* Output zero-length passphrase encrypted private key in PEM form */
+ || !TEST_true(PEM_write_bio_PKCS8PrivateKey(bio_out, pk,
+ EVP_aes_256_cbc(),
+ (const char *)~0, 0,
+ NULL, NULL))
+ || !TEST_true(PEM_write_bio_PKCS8PrivateKey(bio_out, pk,
+ EVP_aes_256_cbc(),
+ NULL, 0, NULL, ""))
+ || !TEST_true(PEM_write_bio_PKCS8PrivateKey(bio_out, pk,
+ EVP_aes_256_cbc(),
+ NULL, 0, pass_cb, NULL))
+ || !TEST_false(PEM_write_bio_PKCS8PrivateKey(bio_out, pk,
+ EVP_aes_256_cbc(),
+ NULL, 0, pass_cb_error,
+ NULL))
/* Private key in text form */
|| !TEST_int_gt(EVP_PKEY_print_private(membio, pk, 0, NULL), 0)
|| !TEST_true(compare_with_file(alg, PRIV_TEXT, membio))