1 """PyCrypto RSA implementation.""" 2 3 from cryptomath import * 4 5 from RSAKey import * 6 from Python_RSAKey import Python_RSAKey 7 8 if pycryptoLoaded: 9 10 from Crypto.PublicKey import RSA 11 12 class PyCrypto_RSAKey(RSAKey): 13 def __init__(self, n=0, e=0, d=0, p=0, q=0, dP=0, dQ=0, qInv=0): 14 if not d: 15 self.rsa = RSA.construct( (n, e) ) 16 else: 17 self.rsa = RSA.construct( (n, e, d, p, q) ) 18 19 def __getattr__(self, name): 20 return getattr(self.rsa, name) 21 22 def hasPrivateKey(self): 23 return self.rsa.has_private() 24 25 def hash(self): 26 return Python_RSAKey(self.n, self.e).hash() 27 28 def _rawPrivateKeyOp(self, m): 29 s = numberToString(m) 30 byteLength = numBytes(self.n) 31 if len(s)== byteLength: 32 pass 33 elif len(s) == byteLength-1: 34 s = '\0' + s 35 else: 36 raise AssertionError() 37 c = stringToNumber(self.rsa.decrypt((s,))) 38 return c 39 40 def _rawPublicKeyOp(self, c): 41 s = numberToString(c) 42 byteLength = numBytes(self.n) 43 if len(s)== byteLength: 44 pass 45 elif len(s) == byteLength-1: 46 s = '\0' + s 47 else: 48 raise AssertionError() 49 m = stringToNumber(self.rsa.encrypt(s, None)[0]) 50 return m 51 52 def writeXMLPublicKey(self, indent=''): 53 return Python_RSAKey(self.n, self.e).write(indent) 54 55 def generate(bits): 56 key = PyCrypto_RSAKey() 57 def f(numBytes): 58 return bytesToString(getRandomBytes(numBytes)) 59 key.rsa = RSA.generate(bits, f) 60 return key 61 generate = staticmethod(generate) 62