<s> """<STR_LIT>""" <EOL> __revision__ = "<STR_LIT>" <EOL> __all__ = [ '<STR_LIT>' , '<STR_LIT>' , '<STR_LIT:error>' , '<STR_LIT>' ] <EOL> from Crypto . PublicKey . pubkey import * <EOL> from Crypto . Util import number <EOL> class error ( Exception ) : <EOL> pass <EOL> def generate ( bits , randfunc , progress_func = None ) : <EOL> """<STR_LIT>""" <EOL> obj = ElGamalobj ( ) <EOL> if progress_func : <EOL> progress_func ( '<STR_LIT>' ) <EOL> while <NUM_LIT:1> : <EOL> q = bignum ( getPrime ( bits - <NUM_LIT:1> , randfunc ) ) <EOL> obj . p = <NUM_LIT:2> * q + <NUM_LIT:1> <EOL> if number . isPrime ( obj . p , randfunc = randfunc ) : <EOL> break <EOL> if progress_func : <EOL> progress_func ( '<STR_LIT>' ) <EOL> while <NUM_LIT:1> : <EOL> obj . g = number . getRandomRange ( <NUM_LIT:3> , obj . p , randfunc ) <EOL> safe = <NUM_LIT:1> <EOL> if pow ( obj . g , <NUM_LIT:2> , obj . p ) == <NUM_LIT:1> : <EOL> safe = <NUM_LIT:0> <EOL> if safe and pow ( obj . g , q , obj . p ) == <NUM_LIT:1> : <EOL> safe = <NUM_LIT:0> <EOL> if safe and divmod ( obj . p - <NUM_LIT:1> , obj . g ) [ <NUM_LIT:1> ] == <NUM_LIT:0> : <EOL> safe = <NUM_LIT:0> <EOL> ginv = number . inverse ( obj . g , obj . p ) <EOL> if safe and divmod ( obj . p - <NUM_LIT:1> , ginv ) [ <NUM_LIT:1> ] == <NUM_LIT:0> : <EOL> safe = <NUM_LIT:0> <EOL> if safe : <EOL> break <EOL> if progress_func : <EOL> progress_func ( '<STR_LIT>' ) <EOL> obj . x = number . getRandomRange ( <NUM_LIT:2> , obj . p - <NUM_LIT:1> , randfunc ) <EOL> if progress_func : <EOL> progress_func ( '<STR_LIT>' ) <EOL> obj . y = pow ( obj . g , obj . x , obj . p ) <EOL> return obj <EOL> def construct ( tup ) : <EOL> """<STR_LIT>""" <EOL> obj = ElGamalobj ( ) <EOL> if len ( tup ) not in [ <NUM_LIT:3> , <NUM_LIT:4> ] : <EOL> raise ValueError ( '<STR_LIT>' ) <EOL> for i in range ( len ( tup ) ) : <EOL> field = obj . keydata [ i ] <EOL> setattr ( obj , field , tup [ i ] ) <EOL> return obj <EOL> class ElGamalobj ( pubkey ) : <EOL> """<STR_LIT>""" <EOL> keydata = [ '<STR_LIT:p>' , '<STR_LIT:g>' , '<STR_LIT:y>' , '<STR_LIT:x>' ] <EOL> def encrypt ( self , plaintext , K ) : <EOL> """<STR_LIT>""" <EOL> return pubkey . encrypt ( self , plaintext , K ) <EOL> def decrypt ( self , ciphertext ) : <EOL> """<STR_LIT>""" <EOL> return pubkey . decrypt ( self , ciphertext ) <EOL> def sign ( self , M , K ) : <EOL> """<STR_LIT>""" <EOL> return pubkey . sign ( self , M , K ) <EOL> def verify ( self , M , signature ) : <EOL> """<STR_LIT>""" <EOL> return pubkey . verify ( self , M , signature ) <EOL> def _encrypt ( self , M , K ) : <EOL> a = pow ( self . g , K , self . p ) <EOL> b = ( M * pow ( self . y , K , self . p ) ) % self . p <EOL> return ( a , b ) <EOL> def _decrypt ( self , M ) : <EOL> if ( not hasattr ( self , '<STR_LIT:x>' ) ) : <EOL> raise TypeError ( '<STR_LIT>' ) <EOL> ax = pow ( M [ <NUM_LIT:0> ] , self . x , self . p ) <EOL> plaintext = ( M [ <NUM_LIT:1> ] * inverse ( ax , self . p ) ) % self . p <EOL> return plaintext <EOL> def _sign ( self , M , K ) : <EOL> if ( not hasattr ( self , '<STR_LIT:x>' ) ) : <EOL> raise TypeError ( '<STR_LIT>' ) <EOL> p1 = self . p - <NUM_LIT:1> <EOL> if ( GCD ( K , p1 ) != <NUM_LIT:1> ) : <EOL> raise ValueError ( '<STR_LIT>' ) <EOL> a = pow ( self . g , K , self . p ) <EOL> t = ( M - self . x * a ) % p1 <EOL> while t < <NUM_LIT:0> : t = t + p1 <EOL> b = ( t * inverse ( K , p1 ) ) % p1 <EOL> return ( a , b ) <EOL> def _verify ( self , M , sig ) : <EOL> if sig [ <NUM_LIT:0> ] < <NUM_LIT:1> or sig [ <NUM_LIT:0> ] > self . p - <NUM_LIT:1> : <EOL> return <NUM_LIT:0> <EOL> v1 = pow ( self . y , sig [ <NUM_LIT:0> ] , self . p ) <EOL> v1 = ( v1 * pow ( sig [ <NUM_LIT:0> ] , sig [ <NUM_LIT:1> ] , self . p ) ) % self . p <EOL> v2 = pow ( self . g , M , self . p ) <EOL> if v1 == v2 : <EOL> return <NUM_LIT:1> <EOL> return <NUM_LIT:0> <EOL> def size ( self ) : <EOL> return number . size ( self . p ) - <NUM_LIT:1> <EOL> def has_private ( self ) : <EOL> if hasattr ( self , '<STR_LIT:x>' ) : <EOL> return <NUM_LIT:1> <EOL> else : <EOL> return <NUM_LIT:0> <EOL> def publickey ( self ) : <EOL> return construct ( ( self . p , self . g , self . y ) ) <EOL> object = ElGamalobj </s>
