ó
BwLc           @   sˆ   d  Z  d d l Td d l m Z d d l m Z m Z d d l m Z d e	 f d „  ƒ  YZ
 d „  Z d d	 „ Z d
 d d „  ƒ  YZ d S(   s   $Id$iÿÿÿÿ(   t   *(   t   number(   t   bytes_to_longt   long_to_bytes(   t   SHAt   errorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_DSA.pyR   #   s   c         C   s/  |  d ƒ } t  j | ƒ j ƒ  } t  j t t | ƒ d ƒ ƒ j ƒ  } t d ƒ } xu t d d ƒ D]d } t | | ƒ t | | ƒ A} | d k rŸ | d B} n  | d k r¸ | d B} n  | d | } qb Wx t | ƒ sæ | d } qÍ Wt	 d d ƒ | k  ot	 d d	 ƒ k  n r| | f St
 d
 ƒ ‚ d  S(   Ni   i   i    i€   i   i   i   l   Ÿ l     s   Bad q value generated(   R   t   newt   digestR   R   t   bignumt   ranget   ordt   isPrimet   powt   RuntimeError(   t   randfunct   St   hash1t   hash2t   qt   it   c(    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_DSA.pyt	   generateQ&   s     %.
c         C   sî  |  d k  r t  d ƒ ‚ n  t ƒ  } | r7 | d ƒ n  x¢t | ƒ \ } | _ t |  d d ƒ d } d d i  } } } | j d ?d @}	 t t d ƒ |	 ƒ }
 t t d ƒ |  d ƒ } xú | d	 k  rµxN t d | d ƒ D]9 } t t	 j
 | t | ƒ t | ƒ ƒ j ƒ  ƒ | | <qÜ W| | |
 } x0 t | d d
 d
 ƒ D] } | d >| | } q>W| | } | | d | j d } | | k r™t | ƒ r™Pn  | d | | d } } q¼ W| d	 k  rÆPn  | r: | d ƒ q: q: | | _ t | d | j ƒ d } | r| d ƒ n  x_ t | |  ƒ ƒ | d } t | | | ƒ } d | k  o\| d k  n r| d k rPqq| | _ | r| d ƒ n  x8 t | d ƒ ƒ } d | k  o¿| j k  n r“Pq“q“| t | | | ƒ | _ | _ | S(   sè   generate(bits:int, randfunc:callable, progress_func:callable)

    Generate a DSA key of length 'bits', using 'randfunc' to get
    random data and 'progress_func', if present, to display
    the progress of the key generation.
    i    s   Key length < 160 bitss   p,q
i   i    i   i   i   i   iÿÿÿÿl     s   4096 multiples failed
s   h,g
s   x,y
i   (   t
   ValueErrort   DSAobjR   R   t   divmodR   R
   R   R   R   R   t   strR	   R   t   pt   gt   xt   y(   t   bitsR   t   progress_funct   objR   t   nt   Ct   Nt   Vt   bt   powbt   powL1t   kt   Wt   XR   t   powert   hR   R   (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_DSA.pyt   generate_py8   sZ    	7
	,	R   c           B   s   e  Z RS(    (   R   R   (    (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_DSA.pyR   p   s   N(    (   t   __revision__t   Crypto.PublicKey.pubkeyt   Crypto.UtilR   t   Crypto.Util.numberR   R   t   Crypto.HashR   t	   ExceptionR   R   t   NoneR/   R   (    (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_DSA.pyt   <module>   s   
	8