Yesudeep Mangalapilly | 5bfe5ff | 2011-08-16 14:58:32 +0530 | [diff] [blame] | 1 | #!/usr/bin/env python |
| 2 | # -*- coding: utf-8 -*- |
Roy Kokkelkoren | 0659aac | 2015-10-25 16:12:11 +0100 | [diff] [blame] | 3 | # |
| 4 | # Copyright 2011 Sybren A. Stüvel <sybren@stuvel.eu> |
| 5 | # |
| 6 | # Licensed under the Apache License, Version 2.0 (the "License"); |
| 7 | # you may not use this file except in compliance with the License. |
| 8 | # You may obtain a copy of the License at |
| 9 | # |
Sybren A. Stüvel | 3934ab4 | 2016-02-05 16:01:20 +0100 | [diff] [blame] | 10 | # https://www.apache.org/licenses/LICENSE-2.0 |
Roy Kokkelkoren | 0659aac | 2015-10-25 16:12:11 +0100 | [diff] [blame] | 11 | # |
| 12 | # Unless required by applicable law or agreed to in writing, software |
| 13 | # distributed under the License is distributed on an "AS IS" BASIS, |
| 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 15 | # See the License for the specific language governing permissions and |
| 16 | # limitations under the License. |
Yesudeep Mangalapilly | 5bfe5ff | 2011-08-16 14:58:32 +0530 | [diff] [blame] | 17 | |
Sybren A. Stüvel | ed1c81d | 2016-01-14 12:23:32 +0100 | [diff] [blame] | 18 | import unittest |
Sybren A. Stüvel | bd4e213 | 2016-03-17 12:35:48 +0100 | [diff] [blame] | 19 | |
Sybren A. Stüvel | fedcaa1 | 2016-03-17 14:34:22 +0100 | [diff] [blame^] | 20 | from rsa._compat import b, is_bytes |
Yesudeep Mangalapilly | 5bfe5ff | 2011-08-16 14:58:32 +0530 | [diff] [blame] | 21 | from rsa.pem import _markers |
Sybren A. Stüvel | bd4e213 | 2016-03-17 12:35:48 +0100 | [diff] [blame] | 22 | import rsa.key |
| 23 | |
| 24 | # 512-bit key. Too small for practical purposes, but good enough for testing with. |
| 25 | public_key_pem = ''' |
| 26 | -----BEGIN PUBLIC KEY----- |
| 27 | MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKH0aYP9ZFuctlPnXhEyHjgc8ltKKx9M |
| 28 | 0c+h4sKMXwjhjbQAZdtWIw8RRghpUJnKj+6bN2XzZDazyULxgPhtax0CAwEAAQ== |
| 29 | -----END PUBLIC KEY----- |
| 30 | ''' |
| 31 | |
| 32 | private_key_pem = ''' |
| 33 | -----BEGIN RSA PRIVATE KEY----- |
| 34 | MIIBOwIBAAJBAKH0aYP9ZFuctlPnXhEyHjgc8ltKKx9M0c+h4sKMXwjhjbQAZdtW |
| 35 | Iw8RRghpUJnKj+6bN2XzZDazyULxgPhtax0CAwEAAQJADwR36EpNzQTqDzusCFIq |
| 36 | ZS+h9X8aIovgBK3RNhMIGO2ThpsnhiDTcqIvgQ56knbl6B2W4iOl54tJ6CNtf6l6 |
| 37 | zQIhANTaNLFGsJfOvZHcI0WL1r89+1A4JVxR+lpslJJwAvgDAiEAwsjqqZ2wY2F0 |
| 38 | F8p1J98BEbtjU2mEZIVCMn6vQuhWdl8CIDRL4IJl4eGKlB0QP0JJF1wpeGO/R76l |
| 39 | DaPF5cMM7k3NAiEAss28m/ck9BWBfFVdNjx/vsdFZkx2O9AX9EJWoBSnSgECIQCa |
| 40 | +sVQMUVJFGsdE/31C7wCIbE3IpB7ziABZ7mN+V3Dhg== |
| 41 | -----END RSA PRIVATE KEY----- |
| 42 | ''' |
| 43 | |
| 44 | # Private key components |
| 45 | prime1 = 96275860229939261876671084930484419185939191875438854026071315955024109172739 |
| 46 | prime2 = 88103681619592083641803383393198542599284510949756076218404908654323473741407 |
Yesudeep Mangalapilly | 5bfe5ff | 2011-08-16 14:58:32 +0530 | [diff] [blame] | 47 | |
| 48 | |
Sybren A. Stüvel | d3d1034 | 2016-01-22 11:36:06 +0100 | [diff] [blame] | 49 | class TestMarkers(unittest.TestCase): |
Yesudeep Mangalapilly | 5bfe5ff | 2011-08-16 14:58:32 +0530 | [diff] [blame] | 50 | def test_values(self): |
| 51 | self.assertEqual(_markers('RSA PRIVATE KEY'), |
Sybren A. Stüvel | bd4e213 | 2016-03-17 12:35:48 +0100 | [diff] [blame] | 52 | (b('-----BEGIN RSA PRIVATE KEY-----'), |
| 53 | b('-----END RSA PRIVATE KEY-----'))) |
| 54 | |
| 55 | |
| 56 | class TestBytesAndStrings(unittest.TestCase): |
| 57 | """Test that we can use PEM in both Unicode strings and bytes.""" |
| 58 | |
| 59 | def test_unicode_public(self): |
| 60 | key = rsa.key.PublicKey.load_pkcs1_openssl_pem(public_key_pem) |
| 61 | self.assertEqual(prime1 * prime2, key.n) |
| 62 | |
| 63 | def test_bytes_public(self): |
| 64 | key = rsa.key.PublicKey.load_pkcs1_openssl_pem(public_key_pem.encode('ascii')) |
| 65 | self.assertEqual(prime1 * prime2, key.n) |
| 66 | |
| 67 | def test_unicode_private(self): |
| 68 | key = rsa.key.PrivateKey.load_pkcs1(private_key_pem) |
| 69 | self.assertEqual(prime1 * prime2, key.n) |
| 70 | |
| 71 | def test_bytes_private(self): |
| 72 | key = rsa.key.PrivateKey.load_pkcs1(private_key_pem.encode('ascii')) |
| 73 | self.assertEqual(prime1, key.p) |
| 74 | self.assertEqual(prime2, key.q) |
Sybren A. Stüvel | fedcaa1 | 2016-03-17 14:34:22 +0100 | [diff] [blame^] | 75 | |
| 76 | |
| 77 | class TestByteOutput(unittest.TestCase): |
| 78 | """Tests that PEM and DER are returned as bytes.""" |
| 79 | |
| 80 | def test_bytes_public(self): |
| 81 | key = rsa.key.PublicKey.load_pkcs1_openssl_pem(public_key_pem) |
| 82 | self.assertTrue(is_bytes(key.save_pkcs1(format='DER'))) |
| 83 | self.assertTrue(is_bytes(key.save_pkcs1(format='PEM'))) |
| 84 | |
| 85 | def test_bytes_private(self): |
| 86 | key = rsa.key.PrivateKey.load_pkcs1(private_key_pem) |
| 87 | self.assertTrue(is_bytes(key.save_pkcs1(format='DER'))) |
| 88 | self.assertTrue(is_bytes(key.save_pkcs1(format='PEM'))) |