diff options
-rw-r--r-- | CHANGES.md | 5 | ||||
-rw-r--r-- | crypto/passphrase.c | 3 | ||||
-rw-r--r-- | crypto/ui/ui_util.c | 2 | ||||
-rw-r--r-- | test/evp_pkey_provided_test.c | 25 |
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)) |