Skip to content

Commit cff9068

Browse files
Bind out pkcs8 for rsa (#638)
1 parent fc6ba61 commit cff9068

File tree

2 files changed

+75
-6
lines changed

2 files changed

+75
-6
lines changed

source/crypto.c

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -285,15 +285,22 @@ PyObject *aws_py_rsa_private_key_from_pem_data(PyObject *self, PyObject *args) {
285285
/* From hereon, we need to clean up if errors occur */
286286

287287
struct aws_pem_object *found_pem_object = s_find_pem_object(&pem_list, AWS_PEM_TYPE_PRIVATE_RSA_PKCS1);
288+
struct aws_rsa_key_pair *key_pair = NULL;
288289

289-
if (found_pem_object == NULL) {
290-
PyErr_SetString(PyExc_ValueError, "RSA private key not found in PEM.");
291-
goto on_done;
290+
if (found_pem_object != NULL) {
291+
key_pair =
292+
aws_rsa_key_pair_new_from_private_key_pkcs1(allocator, aws_byte_cursor_from_buf(&found_pem_object->data));
293+
} else {
294+
found_pem_object = s_find_pem_object(&pem_list, AWS_PEM_TYPE_PRIVATE_PKCS8);
295+
if (found_pem_object != NULL) {
296+
key_pair = aws_rsa_key_pair_new_from_private_key_pkcs8(
297+
allocator, aws_byte_cursor_from_buf(&found_pem_object->data));
298+
} else {
299+
PyErr_SetString(PyExc_ValueError, "RSA private key not found in PEM.");
300+
goto on_done;
301+
}
292302
}
293303

294-
struct aws_rsa_key_pair *key_pair =
295-
aws_rsa_key_pair_new_from_private_key_pkcs1(allocator, aws_byte_cursor_from_buf(&found_pem_object->data));
296-
297304
if (key_pair == NULL) {
298305
PyErr_AwsLastError();
299306
goto on_done;

test/test_crypto.py

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,37 @@
3737
-----END RSA PRIVATE KEY-----
3838
"""
3939

40+
RSA_PRIVATE_KEY_PEM_PKCS8 = """
41+
-----BEGIN PRIVATE KEY-----
42+
MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQDN0jYhXzsI1lSA
43+
j+3uxraUu/78uHJlCcTifQlVUftgEzJth7WNGvrJ8bDLUHwV04cTYSkydgsivjms
44+
XFgzuTCOLiHX0ik/RT1fOvOpk0gte2gCfPIACUAkTlGXKJ+v+1kqnWFmZFNvtkz2
45+
fmLIRq9ZrXWORVmySCeoSfvyygxkmfTUfGieFr8LMFSB6VoWKA/vOk0sMF/5PRxm
46+
JESS4pOMjWQ3QHpLdjsgUAnxsThLVMbaA5JXdHnFHlgkTbL/OSY06EUzuZ0dJpTU
47+
qSBbaz6qewlIO4eM9d2N+5d/mt5nn4rU7yuLGlJE/U9UpSutuvkCkqosST9yKBz7
48+
YUhK7WyPAgMBAAECggEAYrHEZyhFJK2yA5wA2hjLgHLNiN3hbPXMRVbz3MfdJGrQ
49+
KZmDw1AGpkORJU1I0yaFhRN4L8xO9rAE89OsL9FDqUoRzG3ofYB0N3ALW2tWlwiw
50+
DVFgsge9jCtKEJPYTwjV7wtcoz7Ei7L9IM3mDGdoujXlQv2aT1UuPxKLEBc27h3Q
51+
KZZL0QbA33SmO24BUx9Y741hIXsVvoce0MQM1TPwEGH18qYpffb3kCBTwFEySx+q
52+
JFwadZiK1JPQgpELrXZT0VuARD2Ze8Z7c0b6668wYiwJ2mmf4l0NTLk67mIIfG1w
53+
NNNzHme/UGQEjSjUU9TFWLVHU9enumPv5UeLx3wvgQKBgQD7k6pCk8kkUcjjq0sq
54+
92Coy1DMlZg9ictcusJ5pfe1ZdW01iX/S/88ZOxk1X27jTWcHarAeA+ci4LzDWPG
55+
I61Hy4kJFOJB6Sx3hDSnfNvuIC/7zrcWLNzvfAeDYmPhAqi1K4HYFN7Ipa/1+Uew
56+
kWVllcUHRz5zWU+oYVXDsjARrwKBgQDRcJowibhaG4UUMzRsyyEK1l/w+z75L8A7
57+
2ZA+wMqyUo9LPgJRYvEHHRQTHDGCzP81IUaAK2OfWrD5Jnn6r4Il7+cQ+xCHKiMD
58+
rBhnL9dG4lVAWgdZPyWXfrdT3mqpZ3UgfWysvph8s48QdLA3ku7PpTfchwtSdXQP
59+
cxhEItlrIQKBgQDTTB8AdCfIfXiA3+nuWH+yxbFDY5HOfeF0LNgSXDdFABcSH5si
60+
Za4mB44U0ssbr2qLiM9VgIF8NiDyCxj13hk359dc7VFrknBqoXuoANKnmhkzIVfd
61+
JCkca8vTqdvBrP4NzFDuL/k+BQtZSNnRjwze2X/2sPve3fBtt/LUvuBouQKBgQC9
62+
T1Cv6uxN1m410grjA8C8MQXLpu5HAxh5gLBXaKBPCz0mv8gMlKhUy73ngCZomq9b
63+
8NXu6ElGMw2gR10ecSHs9KohuS45XqcDnLz6GE44bkCsyDO4QdHS2+EN2A8FTNSc
64+
J4Lhqe3fWdZJA5B8yz09R5P0q8RaJnxfsqMOg4mOwQKBgQC+N5xLCRa/n1kJ11we
65+
rnOe2POS+zuThhi1aMn0LLPIDwVMktymV7F8JegbdYB5KjxyxzDPcpRDRKCXvAew
66+
QiaCZLRyigBqDpDP4l3uIp1OEzWLYuEAWwnErC7fuPm0TFAy5ecegxW7eXasDy2C
67+
dJJcK3yV8NRVOzr2voGRmr4d7w==
68+
-----END PRIVATE KEY-----
69+
"""
70+
4071
RSA_PUBLIC_KEY_PEM = """
4172
-----BEGIN RSA PUBLIC KEY-----
4273
MIIBCgKCAQEAxaEsLWE2t3kJqsF1sFHYk7rSCGfGTSDa+3r5typT0cb/TtJ989C8
@@ -170,6 +201,19 @@ def test_rsa_encryption_roundtrip(self):
170201
pt_pub = rsa.decrypt(p, ct_pub)
171202
self.assertEqual(test_pt, pt_pub)
172203

204+
def test_rsa_encryption_roundtrip_pkcs8(self):
205+
param_list = [RSAEncryptionAlgorithm.PKCS1_5,
206+
RSAEncryptionAlgorithm.OAEP_SHA256,
207+
RSAEncryptionAlgorithm.OAEP_SHA512]
208+
209+
for p in param_list:
210+
with self.subTest(msg="RSA Encryption Roundtrip using algo p", p=p):
211+
test_pt = b'totally original test string'
212+
rsa = RSA.new_private_key_from_pem_data(RSA_PRIVATE_KEY_PEM_PKCS8)
213+
ct = rsa.encrypt(p, test_pt)
214+
pt = rsa.decrypt(p, ct)
215+
self.assertEqual(test_pt, pt)
216+
173217
def test_rsa_encryption_roundtrip_der(self):
174218
param_list = [RSAEncryptionAlgorithm.PKCS1_5,
175219
RSAEncryptionAlgorithm.OAEP_SHA256,
@@ -211,6 +255,24 @@ def test_rsa_signing_roundtrip(self):
211255
rsa_pub = RSA.new_public_key_from_pem_data(RSA_PUBLIC_KEY_PEM)
212256
self.assertTrue(rsa_pub.verify(p, digest, signature))
213257

258+
def test_rsa_signing_roundtrip_pkcs8(self):
259+
param_list = [RSASignatureAlgorithm.PKCS1_5_SHA256,
260+
RSASignatureAlgorithm.PSS_SHA256,
261+
RSASignatureAlgorithm.PKCS1_5_SHA1]
262+
263+
for p in param_list:
264+
with self.subTest(msg="RSA Signing Roundtrip using algo p", p=p):
265+
if (p == RSASignatureAlgorithm.PKCS1_5_SHA1):
266+
h = Hash.sha1_new()
267+
else:
268+
h = Hash.sha256_new()
269+
h.update(b'totally original test string')
270+
digest = h.digest()
271+
272+
rsa = RSA.new_private_key_from_pem_data(RSA_PRIVATE_KEY_PEM_PKCS8)
273+
signature = rsa.sign(p, digest)
274+
self.assertTrue(rsa.verify(p, digest, signature))
275+
214276
def test_rsa_signing_roundtrip_der(self):
215277
param_list = [RSASignatureAlgorithm.PKCS1_5_SHA256,
216278
RSASignatureAlgorithm.PSS_SHA256,

0 commit comments

Comments
 (0)