11import sys
22
33try :
4- from Crypto . PublicKey import RSA
4+ from jose . backends . rsa_backend import RSAKey as PurePythonRSAKey
55except ImportError :
6- RSA = None
6+ PurePythonRSAKey = None
7+
8+ try :
9+ from Crypto .PublicKey import RSA as PyCryptoRSA
10+ from jose .backends .pycrypto_backend import RSAKey as PyCryptoRSAKey
11+ except ImportError :
12+ PyCryptoRSA = None
713
814try :
915 from cryptography .hazmat .backends import default_backend
2228if sys .version_info > (3 ,):
2329 long = int
2430
25- private_key_4096 = b"""-----BEGIN RSA PRIVATE KEY-----
31+ private_key_4096_pkcs1 = b"""-----BEGIN RSA PRIVATE KEY-----
2632MIIJKwIBAAKCAgEAtSKfSeI0fukRIX38AHlKB1YPpX8PUYN2JdvfM+XjNmLfU1M7
27334N0VmdzIX95sneQGO9kC2xMIE+AIlt52Yf/KgBZggAlS9Y0Vx8DsSL2HvOjguAdX
2834ir3vYLvAyyHin/mUisJOqccFKChHKjnk0uXy/38+1r17/cYTp76brKpU1I4kM20M
7379bjJ/JfTO5060SsWftf4iw3jrhSn9RwTTYdq/kErGFWvDGJn2MiuhMe2onNfVzIGR
7480mdUxHwi1ulkspAn/fmY7f0hZpskDwcHyZmbKZuk+NU/FJ8IAcmvk9y7m25nSSc8=
7581-----END RSA PRIVATE KEY-----"""
76- private_key_2048 = b"""-----BEGIN RSA PRIVATE KEY-----
82+ private_key_2048_pkcs1 = b"""-----BEGIN RSA PRIVATE KEY-----
7783MIIEowIBAAKCAQEAom6GcUPchmHxBuV3zJ60EPC7y30WiiVxn1WXSPHmfqaj0q2U
7884xS03YugkYmX9lB/EQ6Z5bOY9VuL1oMudL6Dkb9aYYEBZHVgejV7vtYuYT19QMesn
7985AsmGq8etie7XyWHzfWTxljbF53yvxXJMixcFzebAov9pUiV9Hmy3hYVLw3J1NXVg
101107uwNcJ8daMgVZ0QBrD3CBcSZQrfC484BlV6spJ3C16qDVSQPt7sAI
102108-----END RSA PRIVATE KEY-----"""
103109PRIVATE_KEYS = (
104- pytest .param (private_key_2048 , id = "RSA-2048 " ),
105- pytest .param (private_key_4096 , id = "RSA-4096 " )
110+ pytest .param (private_key_2048_pkcs1 , id = "RSA_2048_PKCS1 " ),
111+ pytest .param (private_key_4096_pkcs1 , id = "RSA_4096_PKCS1 " )
106112)
107113
114+ LEGACY_INVALID_PRIVATE_KEY_PKCS8_PEM = b"""-----BEGIN PRIVATE KEY-----
115+ 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
164+ ymbpPjVPxSfCAHJr5Pcu5tuZ0knP
165+ -----END PRIVATE KEY-----
166+ """
167+
168+
169+ @pytest .mark .skipif (PurePythonRSAKey is None , reason = "python-rsa backend not available" )
170+ def test_python_rsa_legacy_pem_read ():
171+ key = PurePythonRSAKey (LEGACY_INVALID_PRIVATE_KEY_PKCS8_PEM , ALGORITHMS .RS256 )
172+ new_pem = key .to_pem (pem_format = "PKCS8" )
173+ assert new_pem != LEGACY_INVALID_PRIVATE_KEY_PKCS8_PEM
174+
108175
109176@pytest .mark .pycrypto
110177@pytest .mark .pycryptodome
111- @pytest .mark .skipif (RSA is None , reason = "Pycrypto/dome backend not available" )
178+ @pytest .mark .skipif (PyCryptoRSA is None , reason = "Pycrypto/dome backend not available" )
112179def test_pycrypto_RSA_key_instance ():
113- key = RSA .construct ((long (
180+ key = PyCryptoRSA .construct ((long (
114181 26057131595212989515105618545799160306093557851986992545257129318694524535510983041068168825614868056510242030438003863929818932202262132630250203397069801217463517914103389095129323580576852108653940669240896817348477800490303630912852266209307160550655497615975529276169196271699168537716821419779900117025818140018436554173242441334827711966499484119233207097432165756707507563413323850255548329534279691658369466534587631102538061857114141268972476680597988266772849780811214198186940677291891818952682545840788356616771009013059992237747149380197028452160324144544057074406611859615973035412993832273216732343819 ),
115182 long (65537 )))
116183 RSAKey (key , ALGORITHMS .RS256 )
@@ -151,7 +218,7 @@ def test_cryptography_RSA_key_instance():
151218
152219class TestRSAAlgorithm :
153220 def test_RSA_key (self ):
154- assert not RSAKey (private_key_4096 , ALGORITHMS .RS256 ).is_public ()
221+ assert not RSAKey (private_key_4096_pkcs1 , ALGORITHMS .RS256 ).is_public ()
155222
156223 def test_string_secret (self ):
157224 key = 'secret'
@@ -170,7 +237,7 @@ def test_bad_cert(self,):
170237
171238 def test_invalid_algorithm (self ):
172239 with pytest .raises (JWKError ):
173- RSAKey (private_key_4096 , ALGORITHMS .ES256 )
240+ RSAKey (private_key_4096_pkcs1 , ALGORITHMS .ES256 )
174241
175242 with pytest .raises (JWKError ):
176243 RSAKey ({'kty' : 'bla' }, ALGORITHMS .RS256 )
0 commit comments