#!/usr/bin/env python # Copyright 2011 Sybren A. Stüvel # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # https://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import unittest 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-----"), ) 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) class TestByteOutput(unittest.TestCase): """Tests that PEM and DER are returned as bytes.""" def test_bytes_public(self): key = rsa.key.PublicKey.load_pkcs1_openssl_pem(public_key_pem) self.assertIsInstance(key.save_pkcs1(format="DER"), bytes) self.assertIsInstance(key.save_pkcs1(format="PEM"), bytes) def test_bytes_private(self): key = rsa.key.PrivateKey.load_pkcs1(private_key_pem) self.assertIsInstance(key.save_pkcs1(format="DER"), bytes) self.assertIsInstance(key.save_pkcs1(format="PEM"), bytes) class TestByteInput(unittest.TestCase): """Tests that PEM and DER can be loaded from bytes.""" def test_bytes_public(self): key = rsa.key.PublicKey.load_pkcs1_openssl_pem(public_key_pem.encode("ascii")) self.assertIsInstance(key.save_pkcs1(format="DER"), bytes) self.assertIsInstance(key.save_pkcs1(format="PEM"), bytes) def test_bytes_private(self): key = rsa.key.PrivateKey.load_pkcs1(private_key_pem.encode("ascii")) self.assertIsInstance(key.save_pkcs1(format="DER"), bytes) self.assertIsInstance(key.save_pkcs1(format="PEM"), bytes)