ó
T:´Nc           @   sÑ   d  Z  d Z d g Z d d l Z e j d d k rT e j d d k rT d d l Tn  d d	 l m Z m Z d
 e	 f d „  ƒ  YZ
 d e f d „  ƒ  YZ d d d d d „ Z d e f d „  ƒ  YZ d d „ Z d S(   sU   Pure Python implementation of the RSA-related portions of Crypto.PublicKey._fastmath.s   $Id$t   rsa_constructiÿÿÿÿNi    i   i   (   t   *(   t   sizet   inverset   errorc           B   s   e  Z RS(    (   t   __name__t
   __module__(    (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR   %   s   t   _RSAKeyc           B   sP   e  Z d  „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z	 RS(   c         C   s   | t  | |  j |  j ƒ S(   N(   t   powt   et   n(   t   selft   mt   r(    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyt   _blind)   s    c         C   s   t  | |  j ƒ | |  j S(   N(   R   R
   (   R   R   R   (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyt   _unblind-   s    c         C   sí   |  j  ƒ  s t d ƒ ‚ n  t |  d ƒ r× t |  d ƒ r× t |  d ƒ r× t | |  j |  j d |  j ƒ } t | |  j |  j d |  j ƒ } | | } | d k  r´ | |  j } n  | |  j |  j } | |  j | St | |  j |  j ƒ S(   Ns   No private keyt   pt   qt   ui   i    (	   t   has_privatet	   TypeErrort   hasattrR   t   dR   R   R   R
   (   R   t   ct   m1t   m2t   h(    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyt   _decrypt1   s    -##
c         C   s   t  | |  j |  j ƒ S(   N(   R   R	   R
   (   R   R   (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyt   _encrypt?   s    c         C   s(   |  j  ƒ  s t d ƒ ‚ n  |  j | ƒ S(   Ns   No private key(   R   R   R   (   R   R   (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyt   _signC   s    c         C   s   |  j  | ƒ | k S(   N(   R   (   R   R   t   sig(    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyt   _verifyH   s    c         C   s   t  |  d ƒ S(   NR   (   R   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR   K   s    c         C   s   t  |  j ƒ d S(   s7   Return the maximum number of bits that can be encryptedi   (   R   R
   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR   N   s    (
   R   R   R   R   R   R   R   R   R   R   (    (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR   (   s   							c         C   sZ  t  |  t ƒ s t ‚ t  | t ƒ s* t ‚ t  | t t d ƒ f ƒ sK t ‚ t  | t t d ƒ f ƒ sl t ‚ t  | t t d ƒ f ƒ s t ‚ t  | t t d ƒ f ƒ s® t ‚ t ƒ  } |  | _ | | _ | d k	 rá | | _ n  | d k	 rù | | _	 n  | d k	 r| | _
 n  | d k	 r)| | _ n- | d k	 rV| d k	 rVt | | ƒ | _ n  | S(   s   Construct an RSAKey objectN(   t
   isinstancet   longt   AssertionErrort   typet   NoneR   R
   R	   R   R   R   R   R   (   R
   R	   R   R   R   R   t   obj(    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR    R   s(    !!!!			   t   _DSAKeyc           B   s,   e  Z d  „  Z d „  Z d „  Z d „  Z RS(   c         C   s   t  |  j ƒ d S(   s7   Return the maximum number of bits that can be encryptedi   (   R   R   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR   g   s    c         C   s   t  |  d ƒ S(   Nt   x(   R   (   R   (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR   k   s    c         C   s    |  j  ƒ  s t d ƒ ‚ n  d | k  o5 |  j k  n sI t d ƒ ‚ n  t | |  j ƒ } t |  j | |  j ƒ |  j } | | |  j | |  j } | | f S(   Ns   No private keyl    s   k is not between 2 and q-1(	   R   R   R   t
   ValueErrorR   R   t   gR   R'   (   R   R   t   kt   inv_kR   t   s(    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR   n   s    c         C   s¾   d | k  o |  j  k  n s@ d | k  o: |  j  k  n rD t St | |  j  ƒ } | | |  j  } | | |  j  } t |  j | |  j ƒ t |  j | |  j ƒ |  j |  j  } | | k S(   Ni    (   R   t   FalseR   R   R)   R   t   y(   R   R   R   R,   t   wt   u1t   u2t   v(    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR   y   s    @<(   R   R   R   R   R   R   (    (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyR&   f   s   			c         C   s¾   t  |  t ƒ s t ‚ t  | t ƒ s* t ‚ t  | t ƒ s? t ‚ t  | t ƒ sT t ‚ t  | t t d  ƒ f ƒ su t ‚ t ƒ  } |  | _ | | _ | | _ | | _	 | d  k	 rº | | _
 n  | S(   N(   R    R!   R"   R#   R$   R&   R.   R)   R   R   R'   (   R.   R)   R   R   R'   R%   (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyt   dsa_constructƒ   s    !					 (   t   __doc__t   __revision__t   __all__t   syst   version_infot   Crypto.Util.py21compatt   Crypto.Util.numberR   R   t	   ExceptionR   t   objectR   R$   R    R&   R3   (    (    (    s>   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/_slowmath.pyt   <module>   s   	&*