From 6d86a2096a032dad3eb3f3a395c8d548edd11892 Mon Sep 17 00:00:00 2001 From: Samuel Judson Date: Thu, 11 Jun 2026 20:58:35 -0400 Subject: [PATCH 1/2] Add new test vectors for robustness of key and parameter processing. --- docs/development/test-vectors.rst | 30 ++++ tests/hazmat/primitives/test_serialization.py | 138 ++++++++++++++++++ .../dh_parameters_invalid_p.der | Bin 0 -> 268 bytes .../dh_private_key_invalid_parameters.der | Bin 0 -> 295 bytes .../dh_public_key_invalid_parameters.der | Bin 0 -> 293 bytes .../DER_Serialization/dsa_public_key_y1.der | Bin 0 -> 584 bytes .../dsa_public_key_y_p_minus_1.der | Bin 0 -> 844 bytes .../dsa_public_key_y_p_plus_1.der | Bin 0 -> 844 bytes .../rsa_public_key_invalid_exponent.der | Bin 0 -> 292 bytes .../rsa_public_key_pkcs1_invalid_exponent.der | Bin 0 -> 268 bytes .../dh_parameters_invalid_p.pem | 8 + .../dh_private_key_invalid_parameters.pem | 9 ++ .../dh_public_key_invalid_parameters.pem | 9 ++ .../PEM_Serialization/dsa_public_key_y1.pem | 15 ++ .../dsa_public_key_y_p_minus_1.pem | 20 +++ .../dsa_public_key_y_p_plus_1.pem | 20 +++ .../rsa_public_key_invalid_exponent.pem | 9 ++ .../rsa_public_key_pkcs1_invalid_exponent.pem | 8 + 18 files changed, 266 insertions(+) create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_parameters_invalid_p.der create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_private_key_invalid_parameters.der create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_public_key_invalid_parameters.der create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_public_key_y1.der create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_public_key_y_p_minus_1.der create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_public_key_y_p_plus_1.der create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/rsa_public_key_invalid_exponent.der create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/rsa_public_key_pkcs1_invalid_exponent.der create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_parameters_invalid_p.pem create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_private_key_invalid_parameters.pem create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_public_key_invalid_parameters.pem create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y1.pem create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y_p_minus_1.pem create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y_p_plus_1.pem create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/rsa_public_key_invalid_exponent.pem create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/rsa_public_key_pkcs1_invalid_exponent.pem diff --git a/docs/development/test-vectors.rst b/docs/development/test-vectors.rst index c36564e34b62..6ab38d4ed25f 100644 --- a/docs/development/test-vectors.rst +++ b/docs/development/test-vectors.rst @@ -95,6 +95,12 @@ Custom asymmetric vectors * ``asymmetric/PEM_Serialization/rsa_public_key.pem`` and ``asymmetric/DER_Serialization/rsa_public_key.der``- Contains an RSA 2048 bit public generated using OpenSSL from ``rsa_private_key.pem``. +* ``asymmetric/PEM_Serialization/rsa_public_key_invalid_exponent.pem`` and + ``asymmetric/DER_Serialization/rsa_public_key_invalid_exponent.der`` - + Contains an RSA SubjectPublicKeyInfo public key with public exponent 1. +* ``asymmetric/PEM_Serialization/rsa_public_key_pkcs1_invalid_exponent.pem`` + and ``asymmetric/DER_Serialization/rsa_public_key_pkcs1_invalid_exponent.der`` + - Contains an RSA PKCS #1 public key with public exponent 1. * ``asymmetric/PEM_Serialization/rsa_wrong_delimiter_public_key.pem`` - Contains an RSA 2048 bit public key generated from ``rsa_private_key.pem``, but with the wrong PEM delimiter (``RSA PUBLIC KEY`` when it should be ``PUBLIC KEY``). @@ -113,6 +119,15 @@ Custom asymmetric vectors * ``asymmetric/DER_Serialization/dsa_public_key_invalid_bit_string.der`` - Contains a DSA public key with the bit string padding value set to 2 rather than the required 0. +* ``asymmetric/PEM_Serialization/dsa_public_key_y1.pem`` and + ``asymmetric/DER_Serialization/dsa_public_key_y1.der`` - Contains a DSA + public key with public value ``y = 1``. +* ``asymmetric/PEM_Serialization/dsa_public_key_y_p_plus_1.pem`` and + ``asymmetric/DER_Serialization/dsa_public_key_y_p_plus_1.der`` - Contains a + DSA public key with public value ``y = p + 1``. +* ``asymmetric/PEM_Serialization/dsa_public_key_y_p_minus_1.pem`` and + ``asymmetric/DER_Serialization/dsa_public_key_y_p_minus_1.der`` - Contains a + DSA public key with public value ``y = p - 1``. * ``asymmetric/PKCS8/unenc-dsa-pkcs8.pem`` and ``asymmetric/DER_Serialization/unenc-dsa-pkcs8.der`` - Contains a DSA 1024 bit key generated using OpenSSL. @@ -360,6 +375,21 @@ Key exchange contains a Diffie-Hellman public key generated with a previous version of ``cryptography``. +* ``vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_parameters_invalid_p.pem`` + and + ``vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_parameters_invalid_p.der`` + contain Diffie-Hellman parameters with an invalid ``p`` value. + +* ``vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_public_key_invalid_parameters.pem`` + and + ``vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_public_key_invalid_parameters.der`` + contain a Diffie-Hellman public key with invalid parameters. + +* ``vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_private_key_invalid_parameters.pem`` + and + ``vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_private_key_invalid_parameters.der`` + contain a Diffie-Hellman private key with invalid parameters. + X.509 ~~~~~ diff --git a/tests/hazmat/primitives/test_serialization.py b/tests/hazmat/primitives/test_serialization.py index f4bc7084b1c8..f8c31aa07970 100644 --- a/tests/hazmat/primitives/test_serialization.py +++ b/tests/hazmat/primitives/test_serialization.py @@ -358,6 +358,24 @@ def test_load_der_rsa_public_key(self, key_file, backend): numbers = key.public_numbers() assert numbers.e == 65537 + @pytest.mark.parametrize( + "key_file", + [ + "rsa_public_key_invalid_exponent.der", + "rsa_public_key_pkcs1_invalid_exponent.der", + ], + ) + def test_load_der_rsa_public_key_rejects_invalid_exponent( + self, key_file, backend + ): + data = load_vectors_from_file( + os.path.join("asymmetric", "DER_Serialization", key_file), + lambda derfile: derfile.read(), + mode="rb", + ) + with pytest.raises(ValueError): + load_der_public_key(data, backend) + def test_load_der_invalid_public_key(self, backend): with pytest.raises(ValueError): load_der_public_key(b"invalid data", backend) @@ -386,6 +404,57 @@ def test_load_der_dsa_public_key(self, key_file, backend): assert key assert isinstance(key, dsa.DSAPublicKey) + @pytest.mark.supported( + only_if=lambda backend: backend.dsa_supported(), + skip_message="Does not support DSA.", + ) + @pytest.mark.parametrize( + "key_file", + [ + "dsa_public_key_y1.der", + "dsa_public_key_y_p_plus_1.der", + "dsa_public_key_y_p_minus_1.der", + ], + ) + def test_load_der_dsa_public_key_rejects_invalid_y( + self, key_file, backend + ): + data = load_vectors_from_file( + os.path.join("asymmetric", "DER_Serialization", key_file), + lambda derfile: derfile.read(), + mode="rb", + ) + with pytest.raises(ValueError): + load_der_public_key(data, backend) + + @pytest.mark.supported( + only_if=lambda backend: backend.dh_supported(), + skip_message="DH not supported", + ) + @pytest.mark.parametrize( + ("kind", "key_file"), + [ + ("parameters", "dh_parameters_invalid_p.der"), + ("public", "dh_public_key_invalid_parameters.der"), + ("private", "dh_private_key_invalid_parameters.der"), + ], + ) + def test_load_der_dh_rejects_invalid_parameters( + self, kind, key_file, backend + ): + data = load_vectors_from_file( + os.path.join("asymmetric", "DER_Serialization", key_file), + lambda derfile: derfile.read(), + mode="rb", + ) + with pytest.raises(ValueError): + if kind == "parameters": + load_der_parameters(data, backend) + elif kind == "public": + load_der_public_key(data, backend) + else: + load_der_private_key(data, None, backend) + def test_load_ec_public_key(self, backend): _skip_curve_unsupported(backend, ec.SECP256R1()) key = load_vectors_from_file( @@ -737,6 +806,24 @@ def test_load_pem_rsa_public_key(self, key_file, backend): numbers = key.public_numbers() assert numbers.e == 65537 + @pytest.mark.parametrize( + "key_file", + [ + "rsa_public_key_invalid_exponent.pem", + "rsa_public_key_pkcs1_invalid_exponent.pem", + ], + ) + def test_load_pem_rsa_public_key_rejects_invalid_exponent( + self, key_file, backend + ): + data = load_vectors_from_file( + os.path.join("asymmetric", "PEM_Serialization", key_file), + lambda pemfile: pemfile.read(), + mode="rb", + ) + with pytest.raises(ValueError): + load_pem_public_key(data, backend) + def test_load_pem_public_fails_with_ec_key_with_rsa_delimiter(self): with pytest.raises(ValueError): load_vectors_from_file( @@ -787,6 +874,57 @@ def test_load_pem_dsa_public_key(self, key_file, backend): assert key assert isinstance(key, dsa.DSAPublicKey) + @pytest.mark.supported( + only_if=lambda backend: backend.dsa_supported(), + skip_message="Does not support DSA.", + ) + @pytest.mark.parametrize( + "key_file", + [ + "dsa_public_key_y1.pem", + "dsa_public_key_y_p_plus_1.pem", + "dsa_public_key_y_p_minus_1.pem", + ], + ) + def test_load_pem_dsa_public_key_rejects_invalid_y( + self, key_file, backend + ): + data = load_vectors_from_file( + os.path.join("asymmetric", "PEM_Serialization", key_file), + lambda pemfile: pemfile.read(), + mode="rb", + ) + with pytest.raises(ValueError): + load_pem_public_key(data, backend) + + @pytest.mark.supported( + only_if=lambda backend: backend.dh_supported(), + skip_message="DH not supported", + ) + @pytest.mark.parametrize( + ("kind", "key_file"), + [ + ("parameters", "dh_parameters_invalid_p.pem"), + ("public", "dh_public_key_invalid_parameters.pem"), + ("private", "dh_private_key_invalid_parameters.pem"), + ], + ) + def test_load_pem_dh_rejects_invalid_parameters( + self, kind, key_file, backend + ): + data = load_vectors_from_file( + os.path.join("asymmetric", "PEM_Serialization", key_file), + lambda pemfile: pemfile.read(), + mode="rb", + ) + with pytest.raises(ValueError): + if kind == "parameters": + load_pem_parameters(data, backend) + elif kind == "public": + load_pem_public_key(data, backend) + else: + load_pem_private_key(data, None, backend) + def test_load_ec_public_key(self, backend): _skip_curve_unsupported(backend, ec.SECP256R1()) key = load_vectors_from_file( diff --git a/vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_parameters_invalid_p.der b/vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_parameters_invalid_p.der new file mode 100644 index 0000000000000000000000000000000000000000..5a1ecb653f098d3b85b153eed2f2b9952084a685 GIT binary patch literal 268 WcmXqLV&q_IVq|3aKf(bMBNG5pBLG$a literal 0 HcmV?d00001 diff --git a/vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_private_key_invalid_parameters.der b/vectors/cryptography_vectors/asymmetric/DER_Serialization/dh_private_key_invalid_parameters.der new file mode 100644 index 0000000000000000000000000000000000000000..bf16e2595c467b58aaaef52ca7965d9374a0de1a GIT binary patch literal 295 vcmXqLVpL{gWH4xA6ldeqYV&CO&dbQm2;_1wH8CM1<np`e-JM1EVZ{XKED|V!Zg`6K~3J*_|in>MPabqqnj`t=)|3= z`y<~o#uzR?m@){(VEa)S`}dB%K4oO?BV1|~%eky1d#k0SBfMpTp{dxSwD9TU+1soV zFLe#qR5DRDC3J|f_Ux0V&JNyTtXigS_W~gRj>kVYVaoOW{%%f!35)R$iHAVk zxCkIi_OXvpagxEE0)hbn0OZ8%sDu@=KF@(1mgJ1mLID1eW-+FUXijX)YZ((kJv2=n zjfA5!gPn-(P;m5%he!lR{K4Lpc0YS;Pj z^Triu_l*Yzu?i;gJ5L#WGAn{m0w_uf%8`J3x|rH=U{nt+u zv9$zck@!G3bI~F>gH6`N?CV0mbb{e|N)`b%dt#m6sd4h{Cp#2w!O8~Et@T~m9c9CE Wm%XQqZ6OQ`!fsWA0s{m90s#R$*%!S4 literal 0 HcmV?d00001 diff --git a/vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_public_key_y_p_minus_1.der b/vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_public_key_y_p_minus_1.der new file mode 100644 index 0000000000000000000000000000000000000000..3cf59fe73ff14d382d035602091c78c93ec28fe4 GIT binary patch literal 844 zcmXqLV)ig-VzOdm*J|@PXTib<p8X6Xj-v^`10{cd@7rgWn(|ILCQJ16&NV94tCucO-jmw2aOI6fTRyye zeDn4iA^lR`>mf#grm7_!8^66-{Ym=2ru#o$Yn|=?pVj--pZ%!lpAh_9D|*9Sg#|DF z`DX^q&kmDUdhS2mOt&$+_5YxB;lsr&tR&YLR{ zEhlnKW^w_e@lTFj59~C`dMc)q5>HYn*)940zlVN&j8xmzP-*>Ry)t=o8w98J zec5?v@zPjcn-0CK>pwqyJ|>#+y_cPBBbVAIYk$caBkiUDCJisHQxhAicg=Y7QfLRC zz}b%t=VvaCSL6{3{r&g4zwpMbEU6QJI9L>4RI+ULy>{fyYp4AsO%E%*#28Jhljh!E xS@`L#y0u8&!BcD()_#q>DVut@X!_peJ-LcJ+=uc)o0*uK7}*#`Q_QlwZva8tp*sKo literal 0 HcmV?d00001 diff --git a/vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_public_key_y_p_plus_1.der b/vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_public_key_y_p_plus_1.der new file mode 100644 index 0000000000000000000000000000000000000000..876504f7ca548d909e653ad6cd184ac8c08e7c43 GIT binary patch literal 844 zcmXqLV)ig-VzOdm*J|@PXTib<p8X6Xj-v^`10{cd@7rgWn(|ILCQJ16&NV94tCucO-jmw2aOI6fTRyye zeDn4iA^lR`>mf#grm7_!8^66-{Ym=2ru#o$Yn|=?pVj--pZ%!lpAh_9D|*9Sg#|DF z`DX^q&kmDUdhS2mOt&$+_5YxB;lsr&tR&YLR{ zEhlnKW^w_e@lTFj59~C`dMc)q5>HYn*)940zlVN&j8xmzP-*>Ry)t=o8w98J zec5?v@zPjcn-0CK>pwqyJ|>#+y_cPBBbVAIYk$caBkiUDCJisHQxhAicg=Y7QfLRC zz}b%t=VvaCSL6{3{r&g4zwpMbEU6QJI9L>4RI+ULy>{fyYp4AsO%E%*#28Jhljh!E xS@`L#y0u8&!BcD()_#q>DVut@X!_peJ-LcJ+=uc)o0*uK7}*#`Q_Qlw9{@q!p*;Wq literal 0 HcmV?d00001 diff --git a/vectors/cryptography_vectors/asymmetric/DER_Serialization/rsa_public_key_invalid_exponent.der b/vectors/cryptography_vectors/asymmetric/DER_Serialization/rsa_public_key_invalid_exponent.der new file mode 100644 index 0000000000000000000000000000000000000000..5f6f653dc83c6c9035faa304592b584c35ad83ee GIT binary patch literal 292 ucmXqLVpK5TW#iOp^Jx3d%gD&c%D~*j$je~R#K^(a#K_3-e}n@jMn(YrvjmX< literal 0 HcmV?d00001 diff --git a/vectors/cryptography_vectors/asymmetric/DER_Serialization/rsa_public_key_pkcs1_invalid_exponent.der b/vectors/cryptography_vectors/asymmetric/DER_Serialization/rsa_public_key_pkcs1_invalid_exponent.der new file mode 100644 index 0000000000000000000000000000000000000000..b909e740655f0fb6fcb509219aabd1e072c8edd7 GIT binary patch literal 268 WcmXqLV&q_IVq|3aKf(bMBO?G(A^=qY literal 0 HcmV?d00001 diff --git a/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_parameters_invalid_p.pem b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_parameters_invalid_p.pem new file mode 100644 index 000000000000..f0aad99fe527 --- /dev/null +++ b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_parameters_invalid_p.pem @@ -0,0 +1,8 @@ +-----BEGIN DH PARAMETERS----- +MIIBCAKCAQEA//////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +/////////////////////////////////wIBAg== +-----END DH PARAMETERS----- diff --git a/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_private_key_invalid_parameters.pem b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_private_key_invalid_parameters.pem new file mode 100644 index 000000000000..ac2e4208c920 --- /dev/null +++ b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_private_key_invalid_parameters.pem @@ -0,0 +1,9 @@ +-----BEGIN PRIVATE KEY----- +MIIBIwIBADCCARcGCSqGSIb3DQEDATCCAQgCggEBAP////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////8C +AQIEAwIBAg== +-----END PRIVATE KEY----- diff --git a/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_public_key_invalid_parameters.pem b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_public_key_invalid_parameters.pem new file mode 100644 index 000000000000..97883bdf25f2 --- /dev/null +++ b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dh_public_key_invalid_parameters.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBITCCARcGCSqGSIb3DQEDATCCAQgCggEBAP////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////8CAQID +BAACAQQ= +-----END PUBLIC KEY----- diff --git a/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y1.pem b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y1.pem new file mode 100644 index 000000000000..36ff93ce51e2 --- /dev/null +++ b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y1.pem @@ -0,0 +1,15 @@ +-----BEGIN PUBLIC KEY----- +MIICRDCCAjoGByqGSM44BAEwggItAoIBAQDqH7GvIogVWO+TvopfhlPFpVlDTEnI +wsEqzl6cQUNMnPCo6UmKyw9GY8CLRITqzoRfb7F9rGLJjnBq8Px05NocbCs/v1od +WP+C/Bpm8+ixIlLEAnj/+d1/EC7tLLW3Mj6/GQjCNNk1QU3e1/jSROVFYbDco5sw +HejEnan7I98zxhguP5gyCMVg+1EZ+/eOvj5lZO4jXGoVy7msJHurpaQjvGWCoanY +orTw6ePZ26wSL3UN11QyUTUldIix9uyr8hv/KUf+DTsst//mf05/zfEhT2BT5ypb +sN0goOn+bbLfCpCMNuleYL9JykNouLiSucefYe+RxHVnxA4fgKxapm73AiEAjsc/ +N2HK9f3+bk6CCYvxD4mHQNy4CCBL9rGPUHGSwZ0CggEBAOTE7KiEFbI+z4EcluSM +0kIA/pFmMaaKaE5sy2sZE0E9NE0djYSjM4OdiO7kMVIfbjV8FuapO+ERqYB2c5zU +AbqzudVlv0+5np0YWx4U1hyTcAEz+Qi64D4odk0Qfc0up2dCF2IgdLsZ7/9IL19c +GobVVRsvxo0cbp2AEZWO9LnCo6VdDTyILmrX+fDzxhVo940HBrEKJvI7Txl8MiuC +UAIoSgrKkYB7upjs6RK4DhDN8YDPmaNfIQwWVfv9108TsbUEZZH4QDhz0SI5g03W +xOzrQr90guF5ShYBNXtind+pcfLtJzsUbsHKBtCt9V3ZHWXDcpe9p4xtIQwLwm5V +gwIDBAACAQE= +-----END PUBLIC KEY----- diff --git a/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y_p_minus_1.pem b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y_p_minus_1.pem new file mode 100644 index 000000000000..b70842864986 --- /dev/null +++ b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y_p_minus_1.pem @@ -0,0 +1,20 @@ +-----BEGIN PUBLIC KEY----- +MIIDSDCCAjoGByqGSM44BAEwggItAoIBAQDqH7GvIogVWO+TvopfhlPFpVlDTEnI +wsEqzl6cQUNMnPCo6UmKyw9GY8CLRITqzoRfb7F9rGLJjnBq8Px05NocbCs/v1od +WP+C/Bpm8+ixIlLEAnj/+d1/EC7tLLW3Mj6/GQjCNNk1QU3e1/jSROVFYbDco5sw +HejEnan7I98zxhguP5gyCMVg+1EZ+/eOvj5lZO4jXGoVy7msJHurpaQjvGWCoanY +orTw6ePZ26wSL3UN11QyUTUldIix9uyr8hv/KUf+DTsst//mf05/zfEhT2BT5ypb +sN0goOn+bbLfCpCMNuleYL9JykNouLiSucefYe+RxHVnxA4fgKxapm73AiEAjsc/ +N2HK9f3+bk6CCYvxD4mHQNy4CCBL9rGPUHGSwZ0CggEBAOTE7KiEFbI+z4EcluSM +0kIA/pFmMaaKaE5sy2sZE0E9NE0djYSjM4OdiO7kMVIfbjV8FuapO+ERqYB2c5zU +AbqzudVlv0+5np0YWx4U1hyTcAEz+Qi64D4odk0Qfc0up2dCF2IgdLsZ7/9IL19c +GobVVRsvxo0cbp2AEZWO9LnCo6VdDTyILmrX+fDzxhVo940HBrEKJvI7Txl8MiuC +UAIoSgrKkYB7upjs6RK4DhDN8YDPmaNfIQwWVfv9108TsbUEZZH4QDhz0SI5g03W +xOzrQr90guF5ShYBNXtind+pcfLtJzsUbsHKBtCt9V3ZHWXDcpe9p4xtIQwLwm5V +gwIDggEGAAKCAQEA6h+xryKIFVjvk76KX4ZTxaVZQ0xJyMLBKs5enEFDTJzwqOlJ +issPRmPAi0SE6s6EX2+xfaxiyY5wavD8dOTaHGwrP79aHVj/gvwaZvPosSJSxAJ4 +//ndfxAu7Sy1tzI+vxkIwjTZNUFN3tf40kTlRWGw3KObMB3oxJ2p+yPfM8YYLj+Y +MgjFYPtRGfv3jr4+ZWTuI1xqFcu5rCR7q6WkI7xlgqGp2KK08Onj2dusEi91DddU +MlE1JXSIsfbsq/Ib/ylH/g07LLf/5n9Of83xIU9gU+cqW7DdIKDp/m2y3wqQjDbp +XmC/ScpDaLi4krnHn2HvkcR1Z8QOH4CsWqZu9g== +-----END PUBLIC KEY----- diff --git a/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y_p_plus_1.pem b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y_p_plus_1.pem new file mode 100644 index 000000000000..9cd8d1a90697 --- /dev/null +++ b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_public_key_y_p_plus_1.pem @@ -0,0 +1,20 @@ +-----BEGIN PUBLIC KEY----- +MIIDSDCCAjoGByqGSM44BAEwggItAoIBAQDqH7GvIogVWO+TvopfhlPFpVlDTEnI +wsEqzl6cQUNMnPCo6UmKyw9GY8CLRITqzoRfb7F9rGLJjnBq8Px05NocbCs/v1od +WP+C/Bpm8+ixIlLEAnj/+d1/EC7tLLW3Mj6/GQjCNNk1QU3e1/jSROVFYbDco5sw +HejEnan7I98zxhguP5gyCMVg+1EZ+/eOvj5lZO4jXGoVy7msJHurpaQjvGWCoanY +orTw6ePZ26wSL3UN11QyUTUldIix9uyr8hv/KUf+DTsst//mf05/zfEhT2BT5ypb +sN0goOn+bbLfCpCMNuleYL9JykNouLiSucefYe+RxHVnxA4fgKxapm73AiEAjsc/ +N2HK9f3+bk6CCYvxD4mHQNy4CCBL9rGPUHGSwZ0CggEBAOTE7KiEFbI+z4EcluSM +0kIA/pFmMaaKaE5sy2sZE0E9NE0djYSjM4OdiO7kMVIfbjV8FuapO+ERqYB2c5zU +AbqzudVlv0+5np0YWx4U1hyTcAEz+Qi64D4odk0Qfc0up2dCF2IgdLsZ7/9IL19c +GobVVRsvxo0cbp2AEZWO9LnCo6VdDTyILmrX+fDzxhVo940HBrEKJvI7Txl8MiuC +UAIoSgrKkYB7upjs6RK4DhDN8YDPmaNfIQwWVfv9108TsbUEZZH4QDhz0SI5g03W +xOzrQr90guF5ShYBNXtind+pcfLtJzsUbsHKBtCt9V3ZHWXDcpe9p4xtIQwLwm5V +gwIDggEGAAKCAQEA6h+xryKIFVjvk76KX4ZTxaVZQ0xJyMLBKs5enEFDTJzwqOlJ +issPRmPAi0SE6s6EX2+xfaxiyY5wavD8dOTaHGwrP79aHVj/gvwaZvPosSJSxAJ4 +//ndfxAu7Sy1tzI+vxkIwjTZNUFN3tf40kTlRWGw3KObMB3oxJ2p+yPfM8YYLj+Y +MgjFYPtRGfv3jr4+ZWTuI1xqFcu5rCR7q6WkI7xlgqGp2KK08Onj2dusEi91DddU +MlE1JXSIsfbsq/Ib/ylH/g07LLf/5n9Of83xIU9gU+cqW7DdIKDp/m2y3wqQjDbp +XmC/ScpDaLi4krnHn2HvkcR1Z8QOH4CsWqZu+A== +-----END PUBLIC KEY----- diff --git a/vectors/cryptography_vectors/asymmetric/PEM_Serialization/rsa_public_key_invalid_exponent.pem b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/rsa_public_key_invalid_exponent.pem new file mode 100644 index 000000000000..9af2f12ff16b --- /dev/null +++ b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/rsa_public_key_invalid_exponent.pem @@ -0,0 +1,9 @@ +-----BEGIN PUBLIC KEY----- +MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEA//////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +/wIBAQ== +-----END PUBLIC KEY----- diff --git a/vectors/cryptography_vectors/asymmetric/PEM_Serialization/rsa_public_key_pkcs1_invalid_exponent.pem b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/rsa_public_key_pkcs1_invalid_exponent.pem new file mode 100644 index 000000000000..6a489928a5a3 --- /dev/null +++ b/vectors/cryptography_vectors/asymmetric/PEM_Serialization/rsa_public_key_pkcs1_invalid_exponent.pem @@ -0,0 +1,8 @@ +-----BEGIN RSA PUBLIC KEY----- +MIIBCAKCAQEA//////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +//////////////////////////////////////////////////////////////// +/////////////////////////////////wIBAQ== +-----END RSA PUBLIC KEY----- From 4f82335b3f6bb2a9ef4cfad089b3a17bb670aef8 Mon Sep 17 00:00:00 2001 From: Samuel Judson Date: Tue, 16 Jun 2026 15:17:35 -0400 Subject: [PATCH 2/2] Add mismatch key value negative test path. --- docs/development/test-vectors.rst | 4 ++ tests/hazmat/primitives/test_serialization.py | 38 ++++++++++++++++++ .../dsa_private_key_invalid_public_key.der | Bin 0 -> 319 bytes .../dsa_private_key_invalid_public_key.pem | 9 +++++ 4 files changed, 51 insertions(+) create mode 100644 vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_private_key_invalid_public_key.der create mode 100644 vectors/cryptography_vectors/asymmetric/PEM_Serialization/dsa_private_key_invalid_public_key.pem diff --git a/docs/development/test-vectors.rst b/docs/development/test-vectors.rst index 6ab38d4ed25f..2b9987be9a44 100644 --- a/docs/development/test-vectors.rst +++ b/docs/development/test-vectors.rst @@ -128,6 +128,10 @@ Custom asymmetric vectors * ``asymmetric/PEM_Serialization/dsa_public_key_y_p_minus_1.pem`` and ``asymmetric/DER_Serialization/dsa_public_key_y_p_minus_1.der`` - Contains a DSA public key with public value ``y = p - 1``. +* ``asymmetric/PEM_Serialization/dsa_private_key_invalid_public_key.pem`` and + ``asymmetric/DER_Serialization/dsa_private_key_invalid_public_key.der`` - + Contains a DSA private key with a public value that does not match the + private value. * ``asymmetric/PKCS8/unenc-dsa-pkcs8.pem`` and ``asymmetric/DER_Serialization/unenc-dsa-pkcs8.der`` - Contains a DSA 1024 bit key generated using OpenSSL. diff --git a/tests/hazmat/primitives/test_serialization.py b/tests/hazmat/primitives/test_serialization.py index f8c31aa07970..4e3e3e205d2d 100644 --- a/tests/hazmat/primitives/test_serialization.py +++ b/tests/hazmat/primitives/test_serialization.py @@ -427,6 +427,25 @@ def test_load_der_dsa_public_key_rejects_invalid_y( with pytest.raises(ValueError): load_der_public_key(data, backend) + @pytest.mark.supported( + only_if=lambda backend: backend.dsa_supported(), + skip_message="Does not support DSA.", + ) + def test_load_der_dsa_private_key_rejects_invalid_public_key( + self, backend + ): + data = load_vectors_from_file( + os.path.join( + "asymmetric", + "DER_Serialization", + "dsa_private_key_invalid_public_key.der", + ), + lambda derfile: derfile.read(), + mode="rb", + ) + with pytest.raises(ValueError): + load_der_private_key(data, None, backend) + @pytest.mark.supported( only_if=lambda backend: backend.dh_supported(), skip_message="DH not supported", @@ -897,6 +916,25 @@ def test_load_pem_dsa_public_key_rejects_invalid_y( with pytest.raises(ValueError): load_pem_public_key(data, backend) + @pytest.mark.supported( + only_if=lambda backend: backend.dsa_supported(), + skip_message="Does not support DSA.", + ) + def test_load_pem_dsa_private_key_rejects_invalid_public_key( + self, backend + ): + data = load_vectors_from_file( + os.path.join( + "asymmetric", + "PEM_Serialization", + "dsa_private_key_invalid_public_key.pem", + ), + lambda pemfile: pemfile.read(), + mode="rb", + ) + with pytest.raises(ValueError): + load_pem_private_key(data, None, backend) + @pytest.mark.supported( only_if=lambda backend: backend.dh_supported(), skip_message="DH not supported", diff --git a/vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_private_key_invalid_public_key.der b/vectors/cryptography_vectors/asymmetric/DER_Serialization/dsa_private_key_invalid_public_key.der new file mode 100644 index 0000000000000000000000000000000000000000..ee4112b1e767b0f215c51ccbccb7e41fccfbcf4a GIT binary patch literal 319 zcmV-F0l@w+f&n`M0RRGlfdJEk5#r4_j6T+w=r7-h>yovpq=Vdu09{LRUh_ffyGPH8 zdWu2klA%_&&X*u;Pn=xl{95OcAp*9w0_BiUwXz)IW8K>zM7B~RZ%sn0OI>QGF^SIc ztmk;wgj!r29C1eyF^KrwRS;C}7As>-VDOjs83$%S;t7DD2{99>y>kK;0G7o$3X5SZ z4nixku<98~KFKwrfdYYm2DgS9yVG3Ao_WPDXwnFEIGYl4VajHLAvn%Sk