[openssl] master update
tomas at openssl.org
tomas at openssl.org
Wed May 26 11:05:10 UTC 2021
The branch master has been updated
via 4d2d4b4bc1a8515fa5c17906393458a7beef5422 (commit)
via 05814be8d647ec3056866c13e68c4b48c788ec23 (commit)
via 07f65429c34cb581484371f7d45cb83815f95484 (commit)
from b59b2f93a165f9e4ad6ed15ca8b22ff29296297f (commit)
- Log -----------------------------------------------------------------
commit 4d2d4b4bc1a8515fa5c17906393458a7beef5422
Author: Tomas Mraz <tomas at openssl.org>
Date: Tue May 25 09:59:06 2021 +0200
OSSL_DECODER_from_bio: Report an unsupported error when there is none
When nothing was decoded and there is no error on the stack report
something.
Fixes #15442
Reviewed-by: Paul Dale <pauli at openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15441)
commit 05814be8d647ec3056866c13e68c4b48c788ec23
Author: Tomas Mraz <tomas at openssl.org>
Date: Tue May 25 09:58:35 2021 +0200
Add negative test cases for PEM_read_bio_PrivateKey
Reviewed-by: Paul Dale <pauli at openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15441)
commit 07f65429c34cb581484371f7d45cb83815f95484
Author: Tomas Mraz <tomas at openssl.org>
Date: Mon May 24 18:47:45 2021 +0200
Fix possible infinite loop in pem_read_bio_key_decoder()
There could be an infinite loop if no read happened.
Fixes #15426
Reviewed-by: Paul Dale <pauli at openssl.org>
(Merged from https://github.com/openssl/openssl/pull/15441)
-----------------------------------------------------------------------
Summary of changes:
crypto/encode_decode/decoder_lib.c | 5 +++--
crypto/pem/pem_pkey.c | 9 ++++++++-
test/evp_extra_test2.c | 36 ++++++++++++++++++++++++++++++++++++
3 files changed, 47 insertions(+), 3 deletions(-)
diff --git a/crypto/encode_decode/decoder_lib.c b/crypto/encode_decode/decoder_lib.c
index c7eac0eddd..022c1d56e2 100644
--- a/crypto/encode_decode/decoder_lib.c
+++ b/crypto/encode_decode/decoder_lib.c
@@ -87,9 +87,10 @@ int OSSL_DECODER_from_bio(OSSL_DECODER_CTX *ctx, BIO *in)
const char *input_structure
= ctx->input_structure != NULL ? ctx->input_structure : "";
- if (BIO_eof(in) == 0 /* Prevent spurious decoding error */)
+ if (BIO_eof(in) == 0 || ERR_peek_error() == 0)
+ /* Prevent spurious decoding error */
ERR_raise_data(ERR_LIB_OSSL_DECODER, ERR_R_UNSUPPORTED,
- "Not supported for the data to decode.%s%s%s%s%s%s",
+ "No supported data to decode. %s%s%s%s%s%s",
spaces, input_type_label, input_type, comma,
input_structure_label, input_structure);
ok = 0;
diff --git a/crypto/pem/pem_pkey.c b/crypto/pem/pem_pkey.c
index adbf8bcfe7..becf7e277c 100644
--- a/crypto/pem/pem_pkey.c
+++ b/crypto/pem/pem_pkey.c
@@ -36,6 +36,11 @@ static EVP_PKEY *pem_read_bio_key_decoder(BIO *bp, EVP_PKEY **x,
{
EVP_PKEY *pkey = NULL;
OSSL_DECODER_CTX *dctx = NULL;
+ int pos, newpos;
+
+ if ((pos = BIO_tell(bp)) < 0)
+ /* We can depend on BIO_tell() thanks to the BIO_f_readbuffer() */
+ return NULL;
dctx = OSSL_DECODER_CTX_new_for_pkey(&pkey, "PEM", NULL, NULL,
selection, libctx, propq);
@@ -50,8 +55,10 @@ static EVP_PKEY *pem_read_bio_key_decoder(BIO *bp, EVP_PKEY **x,
goto err;
while (!OSSL_DECODER_from_bio(dctx, bp) || pkey == NULL)
- if (BIO_eof(bp) != 0)
+ if (BIO_eof(bp) != 0 || (newpos = BIO_tell(bp)) < 0 || newpos <= pos)
goto err;
+ else
+ pos = newpos;
if (!evp_keymgmt_util_has(pkey, selection)) {
EVP_PKEY_free(pkey);
diff --git a/test/evp_extra_test2.c b/test/evp_extra_test2.c
index 3f7edac278..e480ae9555 100644
--- a/test/evp_extra_test2.c
+++ b/test/evp_extra_test2.c
@@ -414,6 +414,41 @@ static int test_d2i_PrivateKey_ex(int testid)
return ok;
}
+static int test_PEM_read_bio_negative(int testid)
+{
+ int ok = 0;
+ OSSL_PROVIDER *provider = NULL;
+ BIO *key_bio = NULL;
+ EVP_PKEY *pkey = NULL;
+
+ if (!TEST_ptr(key_bio = BIO_new_mem_buf(keydata[testid].kder, keydata[testid].size)))
+ goto err;
+ ERR_clear_error();
+ if (!TEST_ptr_null(pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL)))
+ goto err;
+ if (!TEST_int_ne(ERR_peek_error(), 0))
+ goto err;
+ if (!TEST_ptr(provider = OSSL_PROVIDER_load(NULL, "default")))
+ goto err;
+ if (!TEST_int_ge(BIO_seek(key_bio, 0), 0))
+ goto err;
+ ERR_clear_error();
+ if (!TEST_ptr_null(pkey = PEM_read_bio_PrivateKey(key_bio, NULL, NULL, NULL)))
+ goto err;
+ if (!TEST_int_ne(ERR_peek_error(), 0))
+ goto err;
+
+ ok = 1;
+
+ err:
+ test_openssl_errors();
+ EVP_PKEY_free(pkey);
+ BIO_free(key_bio);
+ OSSL_PROVIDER_unload(provider);
+
+ return ok;
+}
+
static int do_fromdata_key_is_equal(const OSSL_PARAM params[],
const EVP_PKEY *expected, const char *type)
{
@@ -807,6 +842,7 @@ int setup_tests(void)
#ifndef OPENSSL_NO_DES
ADD_TEST(test_pkcs8key_nid_bio);
#endif
+ ADD_ALL_TESTS(test_PEM_read_bio_negative, OSSL_NELEM(keydata));
return 1;
}
More information about the openssl-commits
mailing list