|
Lines 36-41
Link Here
|
| 36 |
from Crypto.Util.asn1 import DerObject, DerSequence |
36 |
from Crypto.Util.asn1 import DerObject, DerSequence |
| 37 |
import binascii |
37 |
import binascii |
| 38 |
|
38 |
|
|
|
39 |
from Crypto.Util.number import inverse |
| 39 |
try: |
40 |
try: |
| 40 |
from Crypto.PublicKey import _fastmath |
41 |
from Crypto.PublicKey import _fastmath |
| 41 |
except ImportError: |
42 |
except ImportError: |
|
Lines 143-149
Link Here
|
| 143 |
keyType = "RSA PRIVATE" |
144 |
keyType = "RSA PRIVATE" |
| 144 |
der[:] = [ 0, self.n, self.e, self.d, self.p, self.q, |
145 |
der[:] = [ 0, self.n, self.e, self.d, self.p, self.q, |
| 145 |
self.d % (self.p-1), self.d % (self.q-1), |
146 |
self.d % (self.p-1), self.d % (self.q-1), |
| 146 |
self.u ] |
147 |
inverse(self.q, self.p) ] |
| 147 |
else: |
148 |
else: |
| 148 |
keyType = "PUBLIC" |
149 |
keyType = "PUBLIC" |
| 149 |
der.append('\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00') |
150 |
der.append('\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00') |
|
Lines 162-168
Link Here
|
| 162 |
pem += ''.join(chunks) |
163 |
pem += ''.join(chunks) |
| 163 |
pem += "-----END %s KEY-----" % keyType |
164 |
pem += "-----END %s KEY-----" % keyType |
| 164 |
return pem |
165 |
return pem |
| 165 |
return ValueError("") |
166 |
return ValueError("Unknown key format '%s'. Cannot export the RSA key." % format) |
| 166 |
|
167 |
|
| 167 |
class RSAImplementation(object): |
168 |
class RSAImplementation(object): |
| 168 |
def __init__(self, **kwargs): |
169 |
def __init__(self, **kwargs): |
|
Lines 204-210
Link Here
|
| 204 |
def generate(self, bits, randfunc=None, progress_func=None): |
205 |
def generate(self, bits, randfunc=None, progress_func=None): |
| 205 |
if bits < 1024 or (bits & 0xff) != 0: |
206 |
if bits < 1024 or (bits & 0xff) != 0: |
| 206 |
# pubkey.getStrongPrime doesn't like anything that's not a multiple of 128 and > 512 |
207 |
# pubkey.getStrongPrime doesn't like anything that's not a multiple of 128 and > 512 |
| 207 |
raise ValueError("RSA modulus length must be a multiple of 256 and > 1024") |
208 |
raise ValueError("RSA modulus length must be a multiple of 256 and >= 1024") |
| 208 |
rf = self._get_randfunc(randfunc) |
209 |
rf = self._get_randfunc(randfunc) |
| 209 |
obj = _RSA.generate_py(bits, rf, progress_func) # TODO: Don't use legacy _RSA module |
210 |
obj = _RSA.generate_py(bits, rf, progress_func) # TODO: Don't use legacy _RSA module |
| 210 |
key = self._math.rsa_construct(obj.n, obj.e, obj.d, obj.p, obj.q, obj.u) |
211 |
key = self._math.rsa_construct(obj.n, obj.e, obj.d, obj.p, obj.q, obj.u) |
|
Lines 219-229
Link Here
|
| 219 |
der.decode(externKey, True) |
220 |
der.decode(externKey, True) |
| 220 |
if len(der)==9 and der.hasOnlyInts() and der[0]==0: |
221 |
if len(der)==9 and der.hasOnlyInts() and der[0]==0: |
| 221 |
# ASN.1 RSAPrivateKey element |
222 |
# ASN.1 RSAPrivateKey element |
| 222 |
del der[6:8] # Remove d mod (p-1) and d mod (q-1) |
223 |
del der[6:] # Remove d mod (p-1), d mod (q-1), and q^{-1} mod p |
|
|
224 |
der.append(inverse(der[4],der[5])) # Add p^{-1} mod q |
| 223 |
del der[0] # Remove version |
225 |
del der[0] # Remove version |
| 224 |
return self.construct(der[:]) |
226 |
return self.construct(der[:]) |
| 225 |
if len(der)==2: |
227 |
if len(der)==2: |
| 226 |
# ASN.1 SubjectPublicKeyInfo element |
228 |
# ASN.1 SubjectPublicKeyInfo element |
|
|
229 |
# The DER object is a SEQUENCE with two elements: |
| 230 |
# The DER object is a SEQUENCE with two elements: |
| 231 |
# |
| 232 |
# The first element is always the same: |
| 233 |
# 0x30 0x0D SEQUENCE, 12 bytes of payload |
| 234 |
# 0x06 0x09 OBJECT IDENTIFIER, 9 bytes of payload |
| 235 |
# 0x2A 0x86 0x48 0x86 0xF7 0x0D 0x01 0x01 0x01 |
| 236 |
# 0x2A 0x86 0x48 0x86 0xF7 0x0D 0x01 0x01 0x01 |
| 237 |
# 0x2A 0x86 0x48 0x86 0xF7 0x0D 0x01 0x01 0x01 |
| 238 |
# |
| 239 |
# 0x2A 0x86 0x48 0x86 0xF7 0x0D 0x01 0x01 0x01 |
| 227 |
if der[0]=='\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00': |
240 |
if der[0]=='\x30\x0D\x06\x09\x2A\x86\x48\x86\xF7\x0D\x01\x01\x01\x05\x00': |
| 228 |
bitmap = DerObject() |
241 |
bitmap = DerObject() |
| 229 |
bitmap.decode(der[1], True) |
242 |
bitmap.decode(der[1], True) |
|
Lines 239-244
Link Here
|
| 239 |
externKey: the RSA key to import, encoded as a string. |
252 |
externKey: the RSA key to import, encoded as a string. |
| 240 |
The key can be in DER (PKCS#1) or in unencrypted |
253 |
The key can be in DER (PKCS#1) or in unencrypted |
| 241 |
PEM format (RFC1421). |
254 |
PEM format (RFC1421). |
|
|
255 |
|
| 256 |
Raises a ValueError/IndexError if the given key cannot be parsed. |
| 242 |
""" |
257 |
""" |
| 243 |
if externKey.startswith('-----'): |
258 |
if externKey.startswith('-----'): |
| 244 |
# This is probably a PEM encoded key |
259 |
# This is probably a PEM encoded key |