|
1 | 1 | import binascii |
2 | 2 |
|
3 | 3 | import six |
4 | | -from pyasn1.codec.der import decoder, encoder |
| 4 | +from pyasn1.codec.der import encoder |
5 | 5 | from pyasn1.error import PyAsn1Error |
6 | | -from pyasn1.type import namedtype, univ |
| 6 | +from pyasn1.type import univ |
7 | 7 |
|
8 | 8 | import rsa as pyrsa |
9 | 9 | import rsa.pem as pyrsa_pem |
10 | 10 | from rsa.asn1 import OpenSSLPubKey, AsnPubKey, PubKeyHeader |
11 | 11 |
|
12 | 12 | from jose.backends.base import Key |
| 13 | +from jose.backends._asn1 import rsa_private_key_pkcs1_to_pkcs8, rsa_private_key_pkcs8_to_pkcs1 |
13 | 14 | from jose.constants import ALGORITHMS |
14 | 15 | from jose.exceptions import JWKError |
15 | 16 | from jose.utils import base64_to_long, long_to_base64 |
@@ -114,48 +115,6 @@ def _legacy_private_key_pkcs8_to_pkcs1(pkcs8_key): |
114 | 115 | return pkcs8_key[len(LEGACY_INVALID_PKCS8_RSA_HEADER):] |
115 | 116 |
|
116 | 117 |
|
117 | | -class PKCS8RsaPrivateKeyAlgorithm(univ.Sequence): |
118 | | - """ASN1 structure for recording RSA PrivateKeyAlgorithm identifiers.""" |
119 | | - componentType = namedtype.NamedTypes( |
120 | | - namedtype.NamedType("rsaEncryption", univ.ObjectIdentifier()), |
121 | | - namedtype.NamedType("parameters", univ.Null()) |
122 | | - ) |
123 | | - |
124 | | - |
125 | | -class PKCS8PrivateKey(univ.Sequence): |
126 | | - """ASN1 structure for recording PKCS8 private keys.""" |
127 | | - componentType = namedtype.NamedTypes( |
128 | | - namedtype.NamedType("version", univ.Integer()), |
129 | | - namedtype.NamedType("privateKeyAlgorithm", PKCS8RsaPrivateKeyAlgorithm()), |
130 | | - namedtype.NamedType("privateKey", univ.OctetString()) |
131 | | - ) |
132 | | - |
133 | | - |
134 | | -def _private_key_pkcs8_to_pkcs1(pkcs8_key): |
135 | | - """Convert a PKCS8-encoded RSA private key to PKCS1.""" |
136 | | - decoded_values = decoder.decode(pkcs8_key, asn1Spec=PKCS8PrivateKey()) |
137 | | - |
138 | | - try: |
139 | | - decoded_key = decoded_values[0] |
140 | | - except IndexError: |
141 | | - raise ValueError("Invalid private key encoding") |
142 | | - |
143 | | - return decoded_key["privateKey"] |
144 | | - |
145 | | - |
146 | | -def _private_key_pkcs1_to_pkcs8(pkcs1_key): |
147 | | - """Convert a PKCS1-encoded RSA private key to PKCS8.""" |
148 | | - algorithm = PKCS8RsaPrivateKeyAlgorithm() |
149 | | - algorithm["rsaEncryption"] = RSA_ENCRYPTION_ASN1_OID |
150 | | - |
151 | | - pkcs8_key = PKCS8PrivateKey() |
152 | | - pkcs8_key["version"] = 0 |
153 | | - pkcs8_key["privateKeyAlgorithm"] = algorithm |
154 | | - pkcs8_key["privateKey"] = pkcs1_key |
155 | | - |
156 | | - return encoder.encode(pkcs8_key) |
157 | | - |
158 | | - |
159 | 118 | class RSAKey(Key): |
160 | 119 | SHA256 = 'SHA-256' |
161 | 120 | SHA384 = 'SHA-384' |
@@ -196,7 +155,7 @@ def __init__(self, key, algorithm): |
196 | 155 | try: |
197 | 156 | der = pyrsa_pem.load_pem(key, b'PRIVATE KEY') |
198 | 157 | try: |
199 | | - pkcs1_key = _private_key_pkcs8_to_pkcs1(der) |
| 158 | + pkcs1_key = rsa_private_key_pkcs8_to_pkcs1(der) |
200 | 159 | except PyAsn1Error: |
201 | 160 | # If the key was encoded using the old, invalid, |
202 | 161 | # encoding then pyasn1 will throw an error attempting |
@@ -259,7 +218,7 @@ def to_pem(self, pem_format='PKCS8'): |
259 | 218 | if isinstance(self._prepared_key, pyrsa.PrivateKey): |
260 | 219 | der = self._prepared_key.save_pkcs1(format='DER') |
261 | 220 | if pem_format == 'PKCS8': |
262 | | - pkcs8_der = _private_key_pkcs1_to_pkcs8(der) |
| 221 | + pkcs8_der = rsa_private_key_pkcs1_to_pkcs8(der) |
263 | 222 | pem = pyrsa_pem.save_pem(pkcs8_der, pem_marker='PRIVATE KEY') |
264 | 223 | elif pem_format == 'PKCS1': |
265 | 224 | pem = pyrsa_pem.save_pem(der, pem_marker='RSA PRIVATE KEY') |
|
0 commit comments