summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorOlga Batyshkina <obatysh@gmx.com>2023-08-07 15:14:53 +0200
committerTomas Mraz <tomas@openssl.org>2023-09-15 16:17:42 +0200
commit3558a8c6c41270a1d451d1431a278680667f61e6 (patch)
tree1f629fd803b0c9feac251427009d051bc0f19812 /test
parent7f81dec985b830db348eb025927f2cd0406b7b7e (diff)
Fix PKCS#12 creation error when certificate contains auxiliary data
Prefer friendly name passed by the caller and calculated local key id to ones found in certificate auxiliary data when creating PKCS#12. Reviewed-by: Paul Dale <pauli@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/21675) (cherry picked from commit 388a8e731445d190a46ec27b2ff5b4bf334d526b)
Diffstat (limited to 'test')
-rw-r--r--test/pkcs12_format_test.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/test/pkcs12_format_test.c b/test/pkcs12_format_test.c
index d4129d2522..93d66e87d8 100644
--- a/test/pkcs12_format_test.c
+++ b/test/pkcs12_format_test.c
@@ -792,6 +792,70 @@ err:
}
#endif
+static int pkcs12_recreate_test(void)
+{
+ int ret = 0;
+ X509 *cert = NULL;
+ X509 *cert_parsed = NULL;
+ EVP_PKEY *pkey = NULL;
+ EVP_PKEY *pkey_parsed = NULL;
+ PKCS12 *p12 = NULL;
+ PKCS12 *p12_parsed = NULL;
+ PKCS12 *p12_recreated = NULL;
+ const unsigned char *cert_bytes = CERT1;
+ const unsigned char *key_bytes = KEY1;
+ BIO *bio = NULL;
+
+ cert = d2i_X509(NULL, &cert_bytes, sizeof(CERT1));
+ if (!TEST_ptr(cert))
+ goto err;
+ pkey = d2i_AutoPrivateKey(NULL, &key_bytes, sizeof(KEY1));
+ if (!TEST_ptr(pkey))
+ goto err;
+ p12 = PKCS12_create("pass", NULL, pkey, cert, NULL, NID_aes_256_cbc,
+ NID_aes_256_cbc, 2, 1, 0);
+ if (!TEST_ptr(p12))
+ goto err;
+ if (!TEST_int_eq(ERR_peek_error(), 0))
+ goto err;
+
+ bio = BIO_new(BIO_s_mem());
+ if (!TEST_ptr(bio))
+ goto err;
+ if (!TEST_int_eq(i2d_PKCS12_bio(bio, p12), 1))
+ goto err;
+ p12_parsed = PKCS12_init_ex(NID_pkcs7_data, testctx, NULL);
+ if (!TEST_ptr(p12_parsed))
+ goto err;
+ p12_parsed = d2i_PKCS12_bio(bio, &p12_parsed);
+ if (!TEST_ptr(p12_parsed))
+ goto err;
+ if (!TEST_int_eq(PKCS12_parse(p12_parsed, "pass", &pkey_parsed,
+ &cert_parsed, NULL), 1))
+ goto err;
+
+ /* cert_parsed also contains auxiliary data */
+ p12_recreated = PKCS12_create("new_pass", NULL, pkey_parsed, cert_parsed,
+ NULL, NID_aes_256_cbc, NID_aes_256_cbc,
+ 2, 1, 0);
+ if (!TEST_ptr(p12_recreated))
+ goto err;
+ if (!TEST_int_eq(ERR_peek_error(), 0))
+ goto err;
+
+ ret = 1;
+err:
+ BIO_free(bio);
+ PKCS12_free(p12);
+ PKCS12_free(p12_parsed);
+ PKCS12_free(p12_recreated);
+ EVP_PKEY_free(pkey);
+ EVP_PKEY_free(pkey_parsed);
+ X509_free(cert);
+ X509_free(cert_parsed);
+ return ret;
+}
+
typedef enum OPTION_choice {
OPT_ERR = -1,
OPT_EOF = 0,
@@ -873,6 +937,8 @@ int setup_tests(void)
if (default_libctx)
ADD_TEST(pkcs12_create_test);
#endif
+ if (default_libctx)
+ ADD_TEST(pkcs12_recreate_test);
ADD_ALL_TESTS(test_single_key_enc_pass, OSSL_NELEM(passwords));
ADD_ALL_TESTS(test_single_key_enc_iter, OSSL_NELEM(iters));
ADD_TEST(test_single_key_with_attrs);