summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGES.md5
-rw-r--r--crypto/passphrase.c3
-rw-r--r--crypto/ui/ui_util.c2
-rw-r--r--test/evp_pkey_provided_test.c25
4 files changed, 33 insertions, 2 deletions
diff --git a/CHANGES.md b/CHANGES.md
index 7ddc41a0e7..c4922be032 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -24,6 +24,11 @@ OpenSSL 3.1
### Changes between 3.0 and 3.1 [xx XXX xxxx]
+ * Fixed PEM_write_bio_PKCS8PrivateKey() to make it possible to use empty
+ passphrase strings.
+
+ *Darshan Sen*
+
* RNDR and RNDRRS support in provider functions to provide
random number generation for Arm CPUs (aarch64).
diff --git a/crypto/passphrase.c b/crypto/passphrase.c
index cb1bc66958..830872953a 100644
--- a/crypto/passphrase.c
+++ b/crypto/passphrase.c
@@ -41,7 +41,8 @@ int ossl_pw_set_passphrase(struct ossl_passphrase_data_st *data,
ossl_pw_clear_passphrase_data(data);
data->type = is_expl_passphrase;
data->_.expl_passphrase.passphrase_copy =
- OPENSSL_memdup(passphrase, passphrase_len);
+ passphrase_len != 0 ? OPENSSL_memdup(passphrase, passphrase_len)
+ : OPENSSL_malloc(1);
if (data->_.expl_passphrase.passphrase_copy == NULL) {
ERR_raise(ERR_LIB_CRYPTO, ERR_R_MALLOC_FAILURE);
return 0;
diff --git a/crypto/ui/ui_util.c b/crypto/ui/ui_util.c
index 58769d68a3..871472cd32 100644
--- a/crypto/ui/ui_util.c
+++ b/crypto/ui/ui_util.c
@@ -114,7 +114,7 @@ static int ui_read(UI *ui, UI_STRING *uis)
if (len >= 0)
result[len] = '\0';
- if (len <= 0)
+ if (len < 0)
return len;
if (UI_set_result_ex(ui, uis, result, len) >= 0)
return 1;
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))