From fce9a79215a772f4286ee5674fbe9cf4d17c5f9e Mon Sep 17 00:00:00 2001 From: Alex Gaynor Date: Sat, 15 Aug 2020 12:50:13 -0400 Subject: [PATCH] fixes #4706 -- don't internal error on corrupt private key (#5307) * fixes #4706 -- don't internal error on corrupt private key * Temporary disable paramiko --- .travis.yml | 6 ++-- .../hazmat/backends/openssl/rsa.py | 5 ++++ tests/hazmat/primitives/fixtures_rsa.py | 30 +++++++++++++++++++ tests/hazmat/primitives/test_rsa.py | 7 +++++ 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 4bc0c1c11..f05d344e1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -118,8 +118,10 @@ matrix: env: DOWNSTREAM=pyopenssl - python: 3.7 env: DOWNSTREAM=twisted OPENSSL=1.1.1g - - python: 2.7 - env: DOWNSTREAM=paramiko + # Temporary disabled until + # https://github.com/paramiko/paramiko/pull/1723 is merged + # - python: 2.7 + # env: DOWNSTREAM=paramiko - python: 2.7 env: DOWNSTREAM=aws-encryption-sdk - python: 2.7 diff --git a/src/cryptography/hazmat/backends/openssl/rsa.py b/src/cryptography/hazmat/backends/openssl/rsa.py index df697a1f6..d4dffa13c 100644 --- a/src/cryptography/hazmat/backends/openssl/rsa.py +++ b/src/cryptography/hazmat/backends/openssl/rsa.py @@ -314,6 +314,11 @@ class _RSAVerificationContext(object): @utils.register_interface(RSAPrivateKeyWithSerialization) class _RSAPrivateKey(object): def __init__(self, backend, rsa_cdata, evp_pkey): + res = backend._lib.RSA_check_key(rsa_cdata) + if res != 1: + errors = backend._consume_errors_with_text() + raise ValueError("Invalid private key", errors) + self._backend = backend self._rsa_cdata = rsa_cdata self._evp_pkey = evp_pkey diff --git a/tests/hazmat/primitives/fixtures_rsa.py b/tests/hazmat/primitives/fixtures_rsa.py index 801fb914c..2c0627282 100644 --- a/tests/hazmat/primitives/fixtures_rsa.py +++ b/tests/hazmat/primitives/fixtures_rsa.py @@ -784,3 +784,33 @@ RSA_KEY_2048_ALT = RSAPrivateNumbers( ), ), ) + +RSA_KEY_CORRUPTED = b""" +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAuYE4k09MAsi1yjMrXekMe6sT9bEt3ko47dnmN8YBgO8DiiCc +226TnQPvuX3FGxU+Y1zTJpcvVL3L37UOvh4CSb9zKyrFK9/x/UcCfK3Eq8JdS98P +CVeGpkp5E+vwIKY72rc1RSSSCs0PtFdYbSn4trwf5BjPxIqXwIOS3R7zC7cLPHY4 +YdsM4gLGVOP17uXJr/MPoAtWTBVm5zx4bHm6Xclzgf86sbPdL3LxNs0fz4HqJZgA +6EUtyl6Qypq2LjXbdmm2i3vC+MxW6nEPItPqgComhq0zBmVonsiEO87rEtD548Yq +DKvxwHhlcODcVkAYebJ+W5L6PPJBNYA3t5wYyQIDAQABAoIBAAbHkg5msftpGt5Z +Vb3yUuepem7hWTF5YFlIRw5l2wNcURNpbswEhOVNJbuG+KCple7Dw4TuDmhHs/zr +BRqpDhXldhrUtb2uc3ihqWiVFJbieqE4jUbGvMJusvtXXeDwU6wGWzV/V4qndCrk +u4PGypk4Cbbq6ZP2oufPryQ3D4Ff1TA06RSWdP3Cg673VqwLtkXwsRDhymAviiqU +hxQg8bRNiD7mYoUKyLVeV7YRDLTBugfiFmy54yC99NJclLkYmzCgRt1EuoW0Hixx +EIQFEOLftgpc+sKpbbiOileMsc/stytHXXqfgozhBxDNeSzdNYfwEpkLJpLZSUNV +EhS4X1cCgYEAz+7DkXksWw9zLqYniMIcvcBnHQcy3Anqbcu8Zbw+I9wOwzNt44Bo +f88i2idvWvMsRq/LX4WD4jjPB4Z3wAzGBCq+2cy0GrWByMu+VbpwCrntRBkS5huY +IIf1nr1+BuySNt8TL6nZNKz0D8+5c8wT+VbVdPH//4MzfDrK81PPnesCgYEA5GMy +ji4l+8zO33LFMlWQGYgfSMd4jGMQD0VCvfhlosK0Py0AfZj/GKEGHduo/37KVVvb +6XdJqYgB7OxPmdEqbMGeYPKv7pKkG1jXRuEtmXXJ9hS1t0oIvXJLHJnQrOOoRRAR ++xJZbI7WjemY+ZCMOAPT1tm97pxjs81WgSJ6ExsCgYEAze5ADfEeNskkYAz6lnz4 +jgzhkmQwwK+pVzgxy9g8brNkg3qJ2Iix9fKlJ71qkX7IWPF9z4qhxQhSMbfBHZkI ++9OB1J7huJoOgVkXliwIbvcYvxq+Fts5XO6KGb699AmT/XgMvmXO0lbAGLC3kLGL +DqQrH3kU+m9sLBrmKPrWYiUCgYEA3/8etW4zmMvd1jAFkoFyzGfCbyocZGxAcwm2 +FQYMAN8/03p6sbSd9XTwv9YR4Uxke+WURkjVuW2IneuDgtQv6QCFKob74Jx4Uc4H +jiAKDioFg9H6C6OUAOKZIpsFnJvIDLxfNkVf6WYKrrL+cz6/F61BVsbGTsGZ094/ +ynWbDyMCgYEAh44C/wkebe0zz/llG+KTRGENsw1c7+pm0/l3wPYAlH02ewbyRjFf +OKPfyyBtBkoD5rG3IbLyPxsbd3wWwyUzSYq02qRJq43XqyMZhRnNlYhEnNu/Gr5H +sN1f13zqkKoRxxbIjyh4RDYlAv4Sehk27z2Q3gBe9bI5xKkoQ/VfF2w= +-----END RSA PRIVATE KEY----- +""" diff --git a/tests/hazmat/primitives/test_rsa.py b/tests/hazmat/primitives/test_rsa.py index fc806c9ef..b23a176fe 100644 --- a/tests/hazmat/primitives/test_rsa.py +++ b/tests/hazmat/primitives/test_rsa.py @@ -49,6 +49,7 @@ from .fixtures_rsa import ( RSA_KEY_599, RSA_KEY_745, RSA_KEY_768, + RSA_KEY_CORRUPTED, ) from .utils import ( _check_rsa_private_numbers, @@ -729,6 +730,12 @@ class TestRSASignature(object): asym_utils.Prehashed(hashes.SHA1()), ) + def test_corrupted_private_key(self, backend): + with pytest.raises(ValueError): + serialization.load_pem_private_key( + RSA_KEY_CORRUPTED, password=None, backend=backend + ) + @pytest.mark.requires_backend_interface(interface=RSABackend) class TestRSAVerification(object):