Skip to content

Commit 3ff8159

Browse files
levittepaulidale
authored andcommitted
DESERIALIZER: Make it possible to deserialize public keys too
Reviewed-by: Paul Dale <[email protected]> (Merged from openssl#12544)
1 parent 4701f0a commit 3ff8159

File tree

2 files changed

+69
-2
lines changed

2 files changed

+69
-2
lines changed

providers/implementations/serializers/deserialize_der2rsa.c

+7-2
Original file line numberDiff line numberDiff line change
@@ -123,8 +123,13 @@ static int der2rsa_deserialize(void *vctx, OSSL_CORE_BIO *cin,
123123
}
124124

125125
derp = der;
126-
if ((pkey = d2i_PrivateKey_ex(ctx->type, NULL, &derp, der_len,
127-
libctx, NULL)) != NULL) {
126+
pkey = d2i_PrivateKey_ex(ctx->type, NULL, &derp, der_len, libctx, NULL);
127+
if (pkey == NULL) {
128+
derp = der;
129+
pkey = d2i_PUBKEY(NULL, &derp, der_len);
130+
}
131+
132+
if (pkey != NULL) {
128133
/* Tear out the RSA pointer from the pkey */
129134
rsa = EVP_PKEY_get1_RSA(pkey);
130135
EVP_PKEY_free(pkey);

test/serdes_test.c

+62
Original file line numberDiff line numberDiff line change
@@ -426,6 +426,64 @@ static int test_protected_RSA_PSS_via_legacy_PEM(void)
426426
NULL, 1);
427427
}
428428

429+
static int check_public_DER(int type, const void *data, size_t data_len)
430+
{
431+
const unsigned char *datap = data;
432+
EVP_PKEY *pkey = d2i_PUBKEY(NULL, &datap, data_len);
433+
int ok = (TEST_ptr(pkey) && TEST_true(EVP_PKEY_is_a(pkey, "RSA")));
434+
435+
EVP_PKEY_free(pkey);
436+
return ok;
437+
}
438+
439+
static int test_public_RSA_via_DER(void)
440+
{
441+
return test_serialize_deserialize("RSA", NULL, NULL,
442+
serialize_EVP_PKEY_prov,
443+
deserialize_EVP_PKEY_prov,
444+
check_public_DER, dump_der,
445+
OSSL_SERIALIZER_PUBKEY_TO_DER_PQ,
446+
0);
447+
}
448+
449+
static int test_public_RSA_PSS_via_DER(void)
450+
{
451+
return test_serialize_deserialize("RSA-PSS", NULL, NULL,
452+
serialize_EVP_PKEY_prov,
453+
deserialize_EVP_PKEY_prov,
454+
check_public_DER, dump_der,
455+
OSSL_SERIALIZER_PUBKEY_TO_DER_PQ,
456+
0);
457+
}
458+
459+
static int check_public_PEM(int type, const void *data, size_t data_len)
460+
{
461+
static const char pem_header[] = "-----BEGIN " PEM_STRING_PUBLIC "-----";
462+
463+
return
464+
TEST_strn_eq(data, pem_header, sizeof(pem_header) - 1);
465+
}
466+
467+
static int test_public_RSA_via_PEM(void)
468+
{
469+
return test_serialize_deserialize("RSA", NULL, NULL,
470+
serialize_EVP_PKEY_prov,
471+
deserialize_EVP_PKEY_prov,
472+
check_public_PEM, dump_pem,
473+
OSSL_SERIALIZER_PUBKEY_TO_PEM_PQ,
474+
0);
475+
}
476+
477+
static int test_public_RSA_PSS_via_PEM(void)
478+
{
479+
return test_serialize_deserialize("RSA-PSS", NULL, NULL,
480+
serialize_EVP_PKEY_prov,
481+
deserialize_EVP_PKEY_prov,
482+
check_public_PEM, dump_pem,
483+
OSSL_SERIALIZER_PUBKEY_TO_PEM_PQ,
484+
0);
485+
}
486+
429487
int setup_tests(void)
430488
{
431489
TEST_info("Generating keys...");
@@ -447,12 +505,16 @@ int setup_tests(void)
447505
ADD_TEST(test_protected_RSA_via_DER);
448506
ADD_TEST(test_protected_RSA_via_PEM);
449507
ADD_TEST(test_protected_RSA_via_legacy_PEM);
508+
ADD_TEST(test_public_RSA_via_DER);
509+
ADD_TEST(test_public_RSA_via_PEM);
450510
ADD_TEST(test_unprotected_RSA_PSS_via_DER);
451511
ADD_TEST(test_unprotected_RSA_PSS_via_PEM);
452512
ADD_TEST(test_unprotected_RSA_PSS_via_legacy_PEM);
453513
ADD_TEST(test_protected_RSA_PSS_via_DER);
454514
ADD_TEST(test_protected_RSA_PSS_via_PEM);
455515
ADD_TEST(test_protected_RSA_PSS_via_legacy_PEM);
516+
ADD_TEST(test_public_RSA_PSS_via_DER);
517+
ADD_TEST(test_public_RSA_PSS_via_PEM);
456518

457519
return 1;
458520
}

0 commit comments

Comments
 (0)