def validate_pk_params(self): # check primality of p if not number.isPrime(self.p): raise Exception("p is not prime.") # check length of p if not (number.size(self.p) >= 2048): raise Exception( "p of insufficient length. Should be 2048 bits or greater.") # check primality of q if not number.isPrime(self.q): raise Exception("q is not prime.") # check length of q if not (number.size(self.q) >= 256): raise Exception( "q of insufficient length. Should be 256 bits or greater.") if (pow(self.g, self.q, self.p) != 1): raise Exception("g does not generate subgroup of order q.") if not (1 < self.g < self.p - 1): raise Exception("g out of range.") if not (1 < self.y < self.p - 1): raise Exception("y out of range.") if (pow(self.y, self.q, self.p) != 1): raise Exception("g does not generate proper group.")
def validate_pk_params(self): # check primality of p if not number.isPrime(self.p): raise Exception("p is not prime.") # check length of p if not (number.size(self.p) >= 2048): raise Exception("p of insufficient length. Should be 2048 bits or greater.") # check primality of q if not number.isPrime(self.q): raise Exception("q is not prime.") # check length of q if not (number.size(self.q) >= 256): raise Exception("q of insufficient length. Should be 256 bits or greater.") if (pow(self.g,self.q,self.p)!=1): raise Exception("g does not generate subgroup of order q.") if not (1 < self.g < self.p-1): raise Exception("g out of range.") if not (1 < self.y < self.p-1): raise Exception("y out of range.") if (pow(self.y,self.q,self.p)!=1): raise Exception("g does not generate proper group.")
def generate_c(bits, randfunc, progress_func = None): # Generate the prime factors of n if progress_func: progress_func('p,q\n') p = q = 1L while number.size(p*q) < bits: p = pubkey.getPrime(bits/2, randfunc) q = pubkey.getPrime(bits/2, randfunc) # p shall be smaller than q (for calc of u) if p > q: (p, q)=(q, p) if progress_func: progress_func('u\n') u=pubkey.inverse(p, q) n=p*q e = 65537L 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) ## print p ## print q ## print number.size(p), number.size(q), number.size(q*p), ## print obj.size(), bits assert bits <= 1+obj.size(), "Generated key is too small" return obj
def generate(bits, randfunc, progress_func=None): """generate(bits:int, randfunc:callable, progress_func:callable) Generate an RSA key of length 'bits', using 'randfunc' to get random data and 'progress_func', if present, to display the progress of the key generation. """ obj=RSAobj() # Generate the prime factors of n if progress_func: progress_func('p,q\n') p = q = 1L while number.size(p*q) < bits: p = pubkey.getPrime(bits/2, randfunc) q = pubkey.getPrime(bits/2, randfunc) # p shall be smaller than q (for calc of u) 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 = 65537L if progress_func: progress_func('d\n') obj.d=pubkey.inverse(obj.e, (obj.p-1)*(obj.q-1)) assert bits <= 1+obj.size(), "Generated key is too small" return obj
def size(self): """size() : int Return the maximum number of bits that can be handled by this key. """ return number.size(self.n) - 1