home *** CD-ROM | disk | FTP | other *** search
- # Source Generated with Decompyle++
- # File: in.pyc (Python 2.6)
-
- __revision__ = '$Id: RSA.py,v 1.20 2004/05/06 12:52:54 akuchling Exp $'
- from Crypto.PublicKey import pubkey
- from Crypto.Util import number
-
- try:
- from Crypto.PublicKey import _fastmath
- except ImportError:
- _fastmath = None
-
-
- class error(Exception):
- pass
-
-
- def generate(bits, randfunc, progress_func = None):
- obj = RSAobj()
- if progress_func:
- progress_func('p,q\n')
-
- p = q = 0x1L
- while number.size(p * q) < bits:
- p = pubkey.getPrime(bits / 2, randfunc)
- q = pubkey.getPrime(bits / 2, randfunc)
- if p > q:
- p = q
- q = p
-
- obj.p = p
- obj.q = q
- if progress_func:
- progress_func('u\n')
-
- obj.u = pubkey.inverse(obj.p, obj.q)
- obj.n = obj.p * obj.q
- obj.e = 0x10001L
- if progress_func:
- progress_func('d\n')
-
- obj.d = pubkey.inverse(obj.e, (obj.p - 1) * (obj.q - 1))
- return obj
-
-
- def construct(tuple):
- obj = RSAobj()
- if len(tuple) not in (2, 3, 5, 6):
- raise error, 'argument for construct() wrong length'
- len(tuple) not in (2, 3, 5, 6)
- for i in range(len(tuple)):
- field = obj.keydata[i]
- setattr(obj, field, tuple[i])
-
- if len(tuple) >= 5:
- if obj.p > obj.q:
- obj.p = obj.q
- obj.q = obj.p
-
-
- if len(tuple) == 5:
- obj.u = pubkey.inverse(obj.p, obj.q)
-
- return obj
-
-
- class RSAobj(pubkey.pubkey):
- keydata = [
- 'n',
- 'e',
- 'd',
- 'p',
- 'q',
- 'u']
-
- def _encrypt(self, plaintext, K = ''):
- if self.n <= plaintext:
- raise error, 'Plaintext too large'
- self.n <= plaintext
- return (pow(plaintext, self.e, self.n),)
-
-
- def _decrypt(self, ciphertext):
- if not hasattr(self, 'd'):
- raise error, 'Private key not available in this object'
- hasattr(self, 'd')
- if self.n <= ciphertext[0]:
- raise error, 'Ciphertext too large'
- self.n <= ciphertext[0]
- return pow(ciphertext[0], self.d, self.n)
-
-
- def _sign(self, M, K = ''):
- return (self._decrypt((M,)),)
-
-
- def _verify(self, M, sig):
- m2 = self._encrypt(sig[0])
- if m2[0] == M:
- return 1
- return 0
-
-
- def _blind(self, M, B):
- tmp = pow(B, self.e, self.n)
- return M * tmp % self.n
-
-
- def _unblind(self, M, B):
- tmp = pubkey.inverse(B, self.n)
- return M * tmp % self.n
-
-
- def can_blind(self):
- return 1
-
-
- def size(self):
- return number.size(self.n) - 1
-
-
- def has_private(self):
- if hasattr(self, 'd'):
- return 1
- return 0
-
-
- def publickey(self):
- return construct((self.n, self.e))
-
-
-
- class RSAobj_c(pubkey.pubkey):
- keydata = [
- 'n',
- 'e',
- 'd',
- 'p',
- 'q',
- 'u']
-
- def __init__(self, key):
- self.key = key
-
-
- def __getattr__(self, attr):
- if attr in self.keydata:
- return getattr(self.key, attr)
- if self.__dict__.has_key(attr):
- self.__dict__[attr]
- else:
- raise AttributeError, '%s instance has no attribute %s' % (self.__class__, attr)
- return attr in self.keydata
-
-
- def __getstate__(self):
- d = { }
- for k in self.keydata:
- if hasattr(self.key, k):
- d[k] = getattr(self.key, k)
- continue
-
- return d
-
-
- def __setstate__(self, state):
- n = state['n']
- e = state['e']
- if not state.has_key('d'):
- self.key = _fastmath.rsa_construct(n, e)
- else:
- d = state['d']
- if not state.has_key('q'):
- self.key = _fastmath.rsa_construct(n, e, d)
- else:
- p = state['p']
- q = state['q']
- u = state['u']
- self.key = _fastmath.rsa_construct(n, e, d, p, q, u)
-
-
- def _encrypt(self, plain, K):
- return (self.key._encrypt(plain),)
-
-
- def _decrypt(self, cipher):
- return self.key._decrypt(cipher[0])
-
-
- def _sign(self, M, K):
- return (self.key._sign(M),)
-
-
- def _verify(self, M, sig):
- return self.key._verify(M, sig[0])
-
-
- def _blind(self, M, B):
- return self.key._blind(M, B)
-
-
- def _unblind(self, M, B):
- return self.key._unblind(M, B)
-
-
- def can_blind(self):
- return 1
-
-
- def size(self):
- return self.key.size()
-
-
- def has_private(self):
- return self.key.has_private()
-
-
- def publickey(self):
- return construct_c((self.key.n, self.key.e))
-
-
-
- def generate_c(bits, randfunc, progress_func = None):
- if progress_func:
- progress_func('p,q\n')
-
- p = q = 0x1L
- while number.size(p * q) < bits:
- p = pubkey.getPrime(bits / 2, randfunc)
- q = pubkey.getPrime(bits / 2, randfunc)
- if p > q:
- p = q
- q = p
-
- if progress_func:
- progress_func('u\n')
-
- u = pubkey.inverse(p, q)
- n = p * q
- e = 0x10001L
- if progress_func:
- progress_func('d\n')
-
- d = pubkey.inverse(e, (p - 1) * (q - 1))
- key = _fastmath.rsa_construct(n, e, d, p, q, u)
- obj = RSAobj_c(key)
- return obj
-
-
- def construct_c(tuple):
- key = apply(_fastmath.rsa_construct, tuple)
- return RSAobj_c(key)
-
- object = RSAobj
- generate_py = generate
- construct_py = construct
- if _fastmath:
- generate = generate_c
- construct = construct_c
- error = _fastmath.error
-
-