Skip to content

Commit a40e3b7

Browse files
committed
add PEM->DER conversion function to remove pycrypto_backend dependency on Crypto.IO module
1 parent ddcfbf9 commit a40e3b7

File tree

1 file changed

+18
-2
lines changed

1 file changed

+18
-2
lines changed

jose/backends/pycrypto_backend.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1+
from base64 import b64encode
2+
13
import six
24

35
import Crypto.Hash.SHA256
46
import Crypto.Hash.SHA384
57
import Crypto.Hash.SHA512
68

7-
from Crypto.IO import PEM
89
from Crypto.PublicKey import RSA
910
from Crypto.Signature import PKCS1_v1_5
1011
from Crypto.Util.asn1 import DerSequence
@@ -26,6 +27,21 @@
2627
_RSAKey = RSA._RSAobj
2728

2829

30+
def _der_to_pem(der_key, marker):
31+
"""
32+
Perform a simple DER to PEM conversion.
33+
"""
34+
pem_key_chunks = [('-----BEGIN %s-----' % marker).encode('utf-8')]
35+
36+
# Limit base64 output lines to 64 characters by limiting input lines to 48 characters.
37+
for chunk_start in range(0, len(der_key), 48):
38+
pem_key_chunks.append(b64encode(der_key[chunk_start:chunk_start + 48]))
39+
40+
pem_key_chunks.append(('-----END %s-----' % marker).encode('utf-8'))
41+
42+
return b'\n'.join(pem_key_chunks)
43+
44+
2945
class RSAKey(Key):
3046
"""
3147
Performs signing and verification operations using
@@ -159,7 +175,7 @@ def to_pem(self, pem_format='PKCS8'):
159175
else:
160176
pkcs8_der = self.prepared_key.exportKey('DER')
161177
pkcs1_der = rsa_public_key_pkcs8_to_pkcs1(pkcs8_der)
162-
pem = PEM.encode(pkcs1_der, 'RSA PUBLIC KEY').encode('utf-8')
178+
pem = _der_to_pem(pkcs1_der, 'RSA PUBLIC KEY')
163179
return pem
164180
else:
165181
pem = self.prepared_key.exportKey('PEM', pkcs=pkcs)

0 commit comments

Comments
 (0)