ó
BwLc           @   sk   d  Z  d d l Td d l m Z d e f d „  ƒ  YZ d
 d „ Z d „  Z d e	 f d	 „  ƒ  YZ
 e
 Z d
 S(   s   $Id$iÿÿÿÿ(   t   *(   t   numbert   errorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyR      s   c         C   s¤  t  ƒ  } | r | d ƒ n  t t |  | ƒ ƒ | _ | rG | d ƒ n  |  d t | d ƒ ƒ d @} | d k  r~ |  d } n  xT t t | | ƒ ƒ | _ | j | j k  r¯ Pn  | d |  } | d k r d } q q | rè | d ƒ n  x- |  d t | d ƒ ƒ } | d k rë Pqë që xT t t | | ƒ ƒ | _ | j | j k  rIPn  | d |  } | d k rd } qq| r‚| d	 ƒ n  t | j | j | j ƒ | _ | S(
   sí   generate(bits:int, randfunc:callable, progress_func:callable)

    Generate an ElGamal key of length 'bits', using 'randfunc' to get
    random data and 'progress_func', if present, to display
    the progress of the key generation.
    s   p
s   g
i   i?   i    i   s   x
i   s   y
(	   t
   ElGamalobjt   bignumt   getPrimet   pt   ordt   gt   xt   powt   y(   t   bitst   randfunct   progress_funct   objt   size(    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   generate#   sB    	c         C   sl   t  ƒ  } t |  ƒ d k r* t d ƒ ‚ n  x; t t |  ƒ ƒ D]' } | j | } t | | |  | ƒ q= W| S(   sŸ   construct(tuple:(long,long,long,long)|(long,long,long,long,long)))
             : ElGamalobj
    Construct an ElGamal key from a 3- or 4-tuple of numbers.
    i   i   s%   argument for construct() wrong length(   i   i   (   R   t   lent
   ValueErrort   ranget   keydatat   setattr(   t   tupleR   t   it   field(    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt	   constructO   s    	R   c           B   sY   e  Z d  d d d g Z d „  Z d „  Z d „  Z d „  Z d „  Z d	 „  Z d
 „  Z	 RS(   R   R
   R   R   c         C   sE   t  |  j | |  j ƒ } | t  |  j | |  j ƒ |  j } | | f S(   N(   R   R
   R   R   (   t   selft   Mt   Kt   at   b(    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   _encrypt`   s    #c         C   s_   t  |  d ƒ s t d ƒ ‚ n  t | d |  j |  j ƒ } | d t | |  j ƒ |  j } | S(   NR   s(   Private key not available in this objecti    i   (   t   hasattrt	   TypeErrorR   R   R   t   inverse(   R   R   t   axt	   plaintext(    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   _decrypte   s
    !c         C   sº   t  |  d ƒ s t d ƒ ‚ n  |  j d } t | | ƒ d k rO t d ƒ ‚ n  t |  j | |  j ƒ } | |  j | | } x | d k  r˜ | | } q W| t | | ƒ | } | | f S(   NR   s(   Private key not available in this objecti   s   Bad K value: GCD(K,p-1)!=1i    (	   R#   R$   R   t   GCDR   R   R
   R   R%   (   R   R   R   t   p1R    t   tR!   (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   _signl   s     c         C   sp   t  |  j | d |  j ƒ } | t  | d | d |  j ƒ |  j } t  |  j | |  j ƒ } | | k rl d Sd S(   Ni    i   (   R   R   R   R
   (   R   R   t   sigt   v1t   v2(    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   _verifyx   s    (c         C   s   t  j |  j ƒ d S(   sB   Return the maximum number of bits that can be handled by this key.i   (   R   R   R   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyR   €   s    c         C   s   t  |  d ƒ r d Sd Sd S(   sQ   Return a Boolean denoting whether the object contains
        private components.R   i   i    N(   R#   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   has_private„   s    c         C   s   t  |  j |  j |  j f ƒ S(   s?   Return a new key object containing only the public information.(   R   R   R
   R   (   R   (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt	   publickeyŒ   s    (
   R   R   R   R"   R(   R,   R0   R   R1   R2   (    (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyR   ]   s   						N(   t   __revision__t   Crypto.PublicKey.pubkeyt   Crypto.UtilR   t	   ExceptionR   t   NoneR   R   t   pubkeyR   t   object(    (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   <module>   s   
,	4