62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
|
"""PyCrypto RSA implementation."""
|
||
|
|
||
|
from cryptomath import *
|
||
|
|
||
|
from RSAKey import *
|
||
|
from Python_RSAKey import Python_RSAKey
|
||
|
|
||
|
if pycryptoLoaded:
|
||
|
|
||
|
from Crypto.PublicKey import RSA
|
||
|
|
||
|
class PyCrypto_RSAKey(RSAKey):
|
||
|
def __init__(self, n=0, e=0, d=0, p=0, q=0, dP=0, dQ=0, qInv=0):
|
||
|
if not d:
|
||
|
self.rsa = RSA.construct( (n, e) )
|
||
|
else:
|
||
|
self.rsa = RSA.construct( (n, e, d, p, q) )
|
||
|
|
||
|
def __getattr__(self, name):
|
||
|
return getattr(self.rsa, name)
|
||
|
|
||
|
def hasPrivateKey(self):
|
||
|
return self.rsa.has_private()
|
||
|
|
||
|
def hash(self):
|
||
|
return Python_RSAKey(self.n, self.e).hash()
|
||
|
|
||
|
def _rawPrivateKeyOp(self, m):
|
||
|
s = numberToString(m)
|
||
|
byteLength = numBytes(self.n)
|
||
|
if len(s)== byteLength:
|
||
|
pass
|
||
|
elif len(s) == byteLength-1:
|
||
|
s = '\0' + s
|
||
|
else:
|
||
|
raise AssertionError()
|
||
|
c = stringToNumber(self.rsa.decrypt((s,)))
|
||
|
return c
|
||
|
|
||
|
def _rawPublicKeyOp(self, c):
|
||
|
s = numberToString(c)
|
||
|
byteLength = numBytes(self.n)
|
||
|
if len(s)== byteLength:
|
||
|
pass
|
||
|
elif len(s) == byteLength-1:
|
||
|
s = '\0' + s
|
||
|
else:
|
||
|
raise AssertionError()
|
||
|
m = stringToNumber(self.rsa.encrypt(s, None)[0])
|
||
|
return m
|
||
|
|
||
|
def writeXMLPublicKey(self, indent=''):
|
||
|
return Python_RSAKey(self.n, self.e).write(indent)
|
||
|
|
||
|
def generate(bits):
|
||
|
key = PyCrypto_RSAKey()
|
||
|
def f(numBytes):
|
||
|
return bytesToString(getRandomBytes(numBytes))
|
||
|
key.rsa = RSA.generate(bits, f)
|
||
|
return key
|
||
|
generate = staticmethod(generate)
|