summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.txt2
-rw-r--r--rsa/pem.py4
-rw-r--r--tests/test_pem.py51
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):
diff --git a/rsa/pem.py b/rsa/pem.py
index 32a9706..0f68cb2 100644
--- a/rsa/pem.py
+++ b/rsa/pem.py
@@ -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)