
BwLc           @   s   d  Z  d d l m Z d d l Td d l m Z d e f d     YZ d Z d d  Z
 d	   Z d
 e j f d     YZ e Z d S(   s   $Id$i(   t   pubkey(   t   *(   t   SHAt   errorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyR   !   s   i   c         C   s  t    } | r | d  n  xt d |  | _ t | j  | _ } d d i  } } } |  d t } |  d t }	 d |	 >}
 t t d  |  d  } x | d k  rxN t d | d  D]9 } t	 t
 j | t |  t |   j    | | <q W| | |
 } x6 t | d d d  D] } | t t  >| | } qW| | } | | d | j d } | | k rt |  rPn  | d | | d } } q W| d k  rPn  | r | d	  q q | | _ | d | j } | r| d
  n  x_ t	 | |    | d } t | | |  } d | k  o:| d k  n r| d k rPqq| | _ | rn| d  n  x8 t	 | d   } d | k  o| j k  n rqPqqqq| t | | |  | _ | _ | S(   s   generate(bits:int, randfunc:callable, progress_func:callable)

    Generate a qNEW 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,q
i   i    i   i   l    i   is   4096 values of p tried
s   h,g
s   x,y
i   (   t   qNEWobjt   getPrimet   qt   long_to_bytest   seedt   HASHBITSt   powt   longt   ranget   bytes_to_longR   t   newt   strt   digestt   isPrimet   pt   gt   xt   y(   t   bitst   randfunct   progress_funct   objt   St   Ct   Nt   Vt   nt   bt   powbt   powL1t   kR   t   powert   hR   R   (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt   generate&   sX    	 
7
	,	c         C   si   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)
    Construct a qNEW object from a 4- or 5-tuple of numbers.
    i   i   s%   argument for construct() wrong length(   i   i   (   R   t   lenR   R   t   keydatat   setattr(   t   tupleR   t   it   field(    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt	   constructy   s    	R   c           B   s_   e  Z d  d d d d g Z d d  Z d   Z d   Z d	   Z d
   Z d   Z d   Z	 RS(   R   R   R   R   R   t    c         C   s   |  j  | k r t d  n  | d k  r3 t d  n  | t d d  k rT t d  n  t |  j | |  j  |  j  } | | | |  j |  j  |  j  } | | f S(   Ns   K is greater than qi    s   Illegal value of M (<0)i   l    s   Illegal value of M (too large)(   R   R   R   R   R   R   (   t   selft   Mt   Kt   rt   s(    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt   _sign   s    #c         C   s   | \ } } | d k sB | |  j  k sB | d k sB | |  j  k rF d S| d k  r^ t d  n  | d k s | t d d  k r d St |  j | |  j  } t |  j | | |  j  } | | |  j } | |  j  } | | k r d Sd S(   Ni    s   Illegal value of M (<0)i   l    i   (   R   R   R   R   R   R   (   R0   R1   t   sigR3   R4   t   v1t   v2t   v(    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt   _verify   s    6!c         C   s   d S(   sB   Return the maximum number of bits that can be handled by this key.i   (    (   R0   (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt   size   s    c         C   s   t  |  d  S(   sQ   Return a Boolean denoting whether the object contains
        private components.R   (   t   hasattr(   R0   (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt   has_private   s    c         C   s   d S(   sP   Return a Boolean value recording whether this algorithm can generate signatures.i   (    (   R0   (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt   can_sign   s    c         C   s   d S(   sI   Return a Boolean value recording whether this algorithm can encrypt data.i    (    (   R0   (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt   can_encrypt   s    c         C   s"   t  |  j |  j |  j |  j f  S(   s?   Return a new key object containing only the public information.(   R.   R   R   R   R   (   R0   (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt	   publickey   s    (
   R   R   R)   R5   R:   R;   R=   R>   R?   R@   (    (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyR      s   
					N(   t   __revision__t   Crypto.PublicKeyR    t   Crypto.Util.numbert   Crypto.HashR   t	   ExceptionR   R   t   NoneR'   R.   R   t   object(    (    (    s9   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/qNEW.pyt   <module>   s   
S	2