diff options
author | Sybren A. Stüvel <sybren@stuvel.eu> | 2016-03-17 12:35:48 +0100 |
---|---|---|
committer | Sybren A. Stüvel <sybren@stuvel.eu> | 2016-03-17 12:35:48 +0100 |
commit | bd4e213f07c45a8e932bf662ceb07926861775b1 (patch) | |
tree | 351b06d45ef36f8e2e78ec452e9c0a5e48268ad9 | |
parent | a040105834e6dd6e752346838e4824e5aeef167e (diff) | |
download | rsa-git-bd4e213f07c45a8e932bf662ceb07926861775b1.tar.gz |
Allow loading PEM from strings (not just bytes), closes issue #49
-rw-r--r-- | CHANGELOG.txt | 2 | ||||
-rw-r--r-- | rsa/pem.py | 4 | ||||
-rw-r--r-- | tests/test_pem.py | 51 |
3 files changed, 54 insertions, 3 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt index c305b36..63ddcf2 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -13,7 +13,7 @@ Version 3.4 - in development - Deprecated the old rsa._version133 and rsa._version200 submodules, they will be completely removed in version 4.0. - Add an 'exponent' argument to key.newkeys() -- Fixed bugs #12, #14, #27, #30 +- Fixed bugs #12, #14, #27, #30, #49 - Switched from Solovay-Strassen to Miller-Rabin primality testing, to comply with NIST FIPS 186-4 [4] as probabilistic primality test (Appendix C, subsection C.3): @@ -47,6 +47,10 @@ def load_pem(contents, pem_marker): """ + # We want bytes, not text. If it's text, it can be converted to ASCII bytes. + if not is_bytes(contents): + contents = contents.encode('ascii') + (pem_start, pem_end) = _markers(pem_marker) pem_lines = [] diff --git a/tests/test_pem.py b/tests/test_pem.py index 05bbb9b..952ec79 100644 --- a/tests/test_pem.py +++ b/tests/test_pem.py @@ -16,12 +16,59 @@ # limitations under the License. import unittest + from rsa._compat import b from rsa.pem import _markers +import rsa.key + +# 512-bit key. Too small for practical purposes, but good enough for testing with. +public_key_pem = ''' +-----BEGIN PUBLIC KEY----- +MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKH0aYP9ZFuctlPnXhEyHjgc8ltKKx9M +0c+h4sKMXwjhjbQAZdtWIw8RRghpUJnKj+6bN2XzZDazyULxgPhtax0CAwEAAQ== +-----END PUBLIC KEY----- +''' + +private_key_pem = ''' +-----BEGIN RSA PRIVATE KEY----- +MIIBOwIBAAJBAKH0aYP9ZFuctlPnXhEyHjgc8ltKKx9M0c+h4sKMXwjhjbQAZdtW +Iw8RRghpUJnKj+6bN2XzZDazyULxgPhtax0CAwEAAQJADwR36EpNzQTqDzusCFIq +ZS+h9X8aIovgBK3RNhMIGO2ThpsnhiDTcqIvgQ56knbl6B2W4iOl54tJ6CNtf6l6 +zQIhANTaNLFGsJfOvZHcI0WL1r89+1A4JVxR+lpslJJwAvgDAiEAwsjqqZ2wY2F0 +F8p1J98BEbtjU2mEZIVCMn6vQuhWdl8CIDRL4IJl4eGKlB0QP0JJF1wpeGO/R76l +DaPF5cMM7k3NAiEAss28m/ck9BWBfFVdNjx/vsdFZkx2O9AX9EJWoBSnSgECIQCa ++sVQMUVJFGsdE/31C7wCIbE3IpB7ziABZ7mN+V3Dhg== +-----END RSA PRIVATE KEY----- +''' + +# Private key components +prime1 = 96275860229939261876671084930484419185939191875438854026071315955024109172739 +prime2 = 88103681619592083641803383393198542599284510949756076218404908654323473741407 class TestMarkers(unittest.TestCase): def test_values(self): self.assertEqual(_markers('RSA PRIVATE KEY'), - (b('-----BEGIN RSA PRIVATE KEY-----'), - b('-----END RSA PRIVATE KEY-----'))) + (b('-----BEGIN RSA PRIVATE KEY-----'), + b('-----END RSA PRIVATE KEY-----'))) + + +class TestBytesAndStrings(unittest.TestCase): + """Test that we can use PEM in both Unicode strings and bytes.""" + + def test_unicode_public(self): + key = rsa.key.PublicKey.load_pkcs1_openssl_pem(public_key_pem) + self.assertEqual(prime1 * prime2, key.n) + + def test_bytes_public(self): + key = rsa.key.PublicKey.load_pkcs1_openssl_pem(public_key_pem.encode('ascii')) + self.assertEqual(prime1 * prime2, key.n) + + def test_unicode_private(self): + key = rsa.key.PrivateKey.load_pkcs1(private_key_pem) + self.assertEqual(prime1 * prime2, key.n) + + def test_bytes_private(self): + key = rsa.key.PrivateKey.load_pkcs1(private_key_pem.encode('ascii')) + self.assertEqual(prime1, key.p) + self.assertEqual(prime2, key.q) |