home *** CD-ROM | disk | FTP | other *** search
/ Maximum CD 2010 November / maximum-cd-2010-11.iso / DiscContents / calibre-0.7.13.msi / file_2250 (.txt) < prev    next >
Encoding:
Python Compiled Bytecode  |  2010-08-06  |  4.7 KB  |  156 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. __revision__ = '$Id: qNEW.py,v 1.8 2003/04/04 15:13:35 akuchling Exp $'
  5. from Crypto.PublicKey import pubkey
  6. from Crypto.Util.number import *
  7. from Crypto.Hash import SHA
  8.  
  9. class error(Exception):
  10.     pass
  11.  
  12. HASHBITS = 160
  13.  
  14. def generate(bits, randfunc, progress_func = None):
  15.     obj = qNEWobj()
  16.     if progress_func:
  17.         progress_func('p,q\n')
  18.     
  19.     while None:
  20.         obj.q = getPrime(160, randfunc)
  21.         obj.seed = S = long_to_bytes(obj.q)
  22.         C = 0
  23.         N = 2
  24.         V = { }
  25.         n = (bits - 1) / HASHBITS
  26.         b = (bits - 1) % HASHBITS
  27.         powb = 0x2L << b
  28.         powL1 = pow(long(2), bits - 1)
  29.         while C < 4096:
  30.             for k in range(0, n + 1):
  31.                 V[k] = bytes_to_long(SHA.new(S + str(N) + str(k)).digest())
  32.             
  33.             p = V[n] % powb
  34.             for k in range(n - 1, -1, -1):
  35.                 p = (p << long(HASHBITS)) + V[k]
  36.             
  37.             p = p + powL1
  38.             p = p - p % 2 * obj.q - 1
  39.             if powL1 <= p and isPrime(p):
  40.                 break
  41.             
  42.             C = C + 1
  43.             N = N + n + 1
  44.         if C < 4096:
  45.             break
  46.         
  47.         if progress_func:
  48.             progress_func('4096 values of p tried\n')
  49.             continue
  50.         continue
  51.         obj.p = p
  52.         power = (p - 1) / obj.q
  53.         if progress_func:
  54.             progress_func('h,g\n')
  55.         
  56.     while None:
  57.         h = bytes_to_long(randfunc(bits)) % (p - 1)
  58.         g = pow(h, power, p)
  59.         if h < h:
  60.             pass
  61.         elif h < p - 1 and g > 1:
  62.             break
  63.             continue
  64.         continue
  65.         obj.g = g
  66.         if progress_func:
  67.             progress_func('x,y\n')
  68.         
  69.     while None:
  70.         x = bytes_to_long(randfunc(20))
  71.         if x < x:
  72.             pass
  73.         elif x < obj.q:
  74.             break
  75.             continue
  76.         continue
  77.         obj.x = x
  78.         obj.y = pow(g, x, p)
  79.         return obj
  80.  
  81.  
  82. def construct(tuple):
  83.     obj = qNEWobj()
  84.     if len(tuple) not in (4, 5):
  85.         raise error, 'argument for construct() wrong length'
  86.     len(tuple) not in (4, 5)
  87.     for i in range(len(tuple)):
  88.         field = obj.keydata[i]
  89.         setattr(obj, field, tuple[i])
  90.     
  91.     return obj
  92.  
  93.  
  94. class qNEWobj(pubkey.pubkey):
  95.     keydata = [
  96.         'p',
  97.         'q',
  98.         'g',
  99.         'y',
  100.         'x']
  101.     
  102.     def _sign(self, M, K = ''):
  103.         if self.q <= K:
  104.             raise error, 'K is greater than q'
  105.         self.q <= K
  106.         if M < 0:
  107.             raise error, 'Illegal value of M (<0)'
  108.         M < 0
  109.         if M >= pow(2, 0xA1L):
  110.             raise error, 'Illegal value of M (too large)'
  111.         M >= pow(2, 0xA1L)
  112.         r = pow(self.g, K, self.p) % self.q
  113.         s = (K - r * M * self.x % self.q) % self.q
  114.         return (r, s)
  115.  
  116.     
  117.     def _verify(self, M, sig):
  118.         (r, s) = sig
  119.         if r <= 0 and r >= self.q and s <= 0 or s >= self.q:
  120.             return 0
  121.         if M < 0:
  122.             raise error, 'Illegal value of M (<0)'
  123.         M < 0
  124.         if M <= 0 or M >= pow(2, 0xA1L):
  125.             return 0
  126.         v1 = pow(self.g, s, self.p)
  127.         v2 = pow(self.y, M * r, self.p)
  128.         v = v1 * v2 % self.p
  129.         v = v % self.q
  130.         if v == r:
  131.             return 1
  132.         return 0
  133.  
  134.     
  135.     def size(self):
  136.         return 160
  137.  
  138.     
  139.     def has_private(self):
  140.         return hasattr(self, 'x')
  141.  
  142.     
  143.     def can_sign(self):
  144.         return 1
  145.  
  146.     
  147.     def can_encrypt(self):
  148.         return 0
  149.  
  150.     
  151.     def publickey(self):
  152.         return construct((self.p, self.q, self.g, self.y))
  153.  
  154.  
  155. object = qNEWobj
  156.