1 # Author: Trevor Perrin 2 # See the LICENSE file for legal information regarding use of this file. 3 4 """PyCrypto RSA implementation.""" 5 6 from .cryptomath import * 7 8 from .rsakey import * 9 from .python_rsakey import Python_RSAKey 10 11 if pycryptoLoaded: 12 13 from Crypto.PublicKey import RSA 14 15 class PyCrypto_RSAKey(RSAKey): 16 def __init__(self, n=0, e=0, d=0, p=0, q=0, dP=0, dQ=0, qInv=0): 17 if not d: 18 self.rsa = RSA.construct( (n, e) ) 19 else: 20 self.rsa = RSA.construct( (n, e, d, p, q) ) 21 22 def __getattr__(self, name): 23 return getattr(self.rsa, name) 24 25 def hasPrivateKey(self): 26 return self.rsa.has_private() 27 28 def _rawPrivateKeyOp(self, m): 29 s = bytes(numberToByteArray(m, numBytes(self.n))) 30 c = bytesToNumber(bytearray(self.rsa.decrypt((s,)))) 31 return c 32 33 def _rawPublicKeyOp(self, c): 34 s = bytes(numberToByteArray(c, numBytes(self.n))) 35 m = bytesToNumber(bytearray(self.rsa.encrypt(s, None)[0])) 36 return m 37 38 def generate(bits): 39 key = PyCrypto_RSAKey() 40 def f(numBytes): 41 return bytes(getRandomBytes(numBytes)) 42 key.rsa = RSA.generate(bits, f) 43 return key 44 generate = staticmethod(generate) 45