Skip to content

Commit

Permalink
Make EVP_PKEY_asn1_new() stricter with its input
Browse files Browse the repository at this point in the history
Reviewed-by: Matthias St. Pierre <[email protected]>
Reviewed-by: Tim Hudson <[email protected]>
(Merged from openssl#6880)
  • Loading branch information
levitte committed Aug 7, 2018
1 parent 3ef97bd commit 38eca7f
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 1 deletion.
5 changes: 5 additions & 0 deletions CHANGES
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,11 @@

Changes between 1.1.0h and 1.1.1 [xx XXX xxxx]

*) Make EVP_PKEY_asn1_new() a bit stricter about its input. A NULL pem_str
parameter is no longer accepted, as it leads to a corrupt table. NULL
pem_str is reserved for alias entries only.
[Richard Levitte]

*) Use the new ec_scalar_mul_ladder scaffold to implement a specialized ladder
step for prime curves. The new implementation is based on formulae from
differential addition-and-doubling in homogeneous projective coordinates
Expand Down
12 changes: 12 additions & 0 deletions crypto/asn1/ameth_lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,18 @@ EVP_PKEY_ASN1_METHOD *EVP_PKEY_asn1_new(int id, int flags,
goto err;
}

/*
* One of the following must be true:
*
* pem_str == NULL AND ASN1_PKEY_ALIAS is set
* pem_str != NULL AND ASN1_PKEY_ALIAS is clear
*
* Anything else is an error and may lead to a corrupt ASN1 method table
*/
if (!((pem_str == NULL && (flags & ASN1_PKEY_ALIAS) != 0)
|| (pem_str != NULL && (flags & ASN1_PKEY_ALIAS) == 0)))
goto err;

if (pem_str) {
ameth->pem_str = OPENSSL_strdup(pem_str);
if (!ameth->pem_str)
Expand Down
20 changes: 19 additions & 1 deletion test/asn1_internal_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ static int test_standard_methods(void)
const EVP_PKEY_ASN1_METHOD **tmp;
int last_pkey_id = -1;
size_t i;
int ok = 1;

for (tmp = standard_methods, i = 0; i < OSSL_NELEM(standard_methods);
i++, tmp++) {
Expand All @@ -75,11 +76,28 @@ static int test_standard_methods(void)
break;
}
last_pkey_id = (*tmp)->pkey_id;

/*
* One of the following must be true:
*
* pem_str == NULL AND ASN1_PKEY_ALIAS is set
* pem_str != NULL AND ASN1_PKEY_ALIAS is clear
*
* Anything else is an error and may lead to a corrupt ASN1 method table
*/
if (!TEST_true((*tmp)->pem_str == NULL &&
((*tmp)->pkey_flags & ASN1_PKEY_ALIAS) != 0)
&& !TEST_true((*tmp)->pem_str != NULL &&
((*tmp)->pkey_flags & ASN1_PKEY_ALIAS) == 0)) {
TEST_note("asn1 standard methods: Index %zu, pkey ID %d, Name=%s",
i, (*tmp)->pkey_id, OBJ_nid2sn((*tmp)->pkey_id));
ok = 0;
}
}

if (TEST_int_ne(last_pkey_id, 0)) {
TEST_info("asn1 standard methods: Table order OK");
return 1;
return ok;
}

TEST_note("asn1 standard methods: out of order");
Expand Down

0 comments on commit 38eca7f

Please sign in to comment.