ó
QjëOc           @   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  xI t t |  d | ƒ ƒ } d | d | _ t j | j d | ƒr Pq q | r{ | d ƒ n  xû t j d | j | ƒ | _ d } t | j d | j ƒ d k rÆ d } n  | ró t | j | | j ƒ d k ró d } n  | r%t	 | j d | j ƒ d d k r%d } n  t j
 | j | j ƒ } | rlt	 | j d | ƒ d d k rld } n  | r~ Pq~ q~ | rŒ| d ƒ n  t j d | j d | ƒ | _ | 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
i   i   t   randfuncs   g
i   i    s   x
s   y
(   t
   ElGamalobjt   bignumt   getPrimet   pR   t   isPrimet   getRandomRanget   gt   powt   divmodt   inverset   xt   y(   t   bitsR   t   progress_funct   objt   qt   safet   ginv(    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   generate#   s>    		$	)	&	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	   constructZ   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   _encryptk   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	   R   (   R"   R#   t   axt	   plaintext(    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyt   _decryptp   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   _signw   s     c         C   s›   | d d k  s' | d |  j  d k r+ d St |  j | d |  j  ƒ } | t | d | d |  j  ƒ |  j  } t |  j | |  j  ƒ } | | k r— 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   _verifyƒ   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   t   sizeR	   (   R"   (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyR5      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,   R0   R4   R5   R6   R7   (    (    (    s<   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/ElGamal.pyR   h   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   
7	6