ó
T:´Nc           @   sc  d  Z  d Z d d d d g Z d d l Z e j d d	 k r] e j d
 d
 k r] d d l Tn  d d l Td d l m Z d d l	 m
 Z
 m Z m Z d d l m Z d d l m Z m Z d d l Z d d l m Z y d d l	 m Z Wn e k
 rd Z n Xd e j f d „  ƒ  YZ d e f d „  ƒ  YZ e ƒ  Z e j Z e j Z e j Z e j Z d S(   s&   RSA public-key cryptography algorithm.s   $Id$t   generatet	   constructt   errort	   importKeyiÿÿÿÿNi    i   i   (   t   *(   t   getRandomRange(   t   _RSAt	   _slowmatht   pubkey(   t   Random(   t	   DerObjectt   DerSequence(   t   inverse(   t	   _fastmatht   _RSAobjc           B   sË   e  Z d  d d d d d g Z d d „ Z d „  Z d „  Z d	 „  Z d
 „  Z d „  Z	 d d „ Z
 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z RS(   t   nt   et   dt   pt   qt   uc         C   s=   | |  _  | |  _ | d  k r0 t j ƒ  j } n  | |  _ d  S(   N(   t   implementationt   keyt   NoneR	   t   newt   readt	   _randfunc(   t   selfR   R   t   randfunc(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   __init__7   s
    		c         C   s?   | |  j  k r t |  j | ƒ St d |  j j | f ƒ ‚ d  S(   Ns   %s object has no %r attribute(   t   keydatat   getattrR   t   AttributeErrort	   __class__t   __name__(   R   t   attrname(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   __getattr__>   s    c         C   s   |  j  j | ƒ f S(   N(   R   t   _encrypt(   R   t   ct   K(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR%   F   s    c         C   si   | d  \ } t  d |  j j d d |  j ƒ} |  j j | | ƒ } |  j j | ƒ } |  j j | | ƒ S(   Ni   R   (   R   R   R   R   t   _blindt   _decryptt   _unblind(   R   R&   t
   ciphertextt   rt   cpt   mp(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR)   I   s
    "c         C   s   |  j  j | | ƒ S(   N(   R   R(   (   R   t   mR,   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR(   Z   s    c         C   s   |  j  j | | ƒ S(   N(   R   R*   (   R   R/   R,   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR*   ]   s    c         C   s   |  j  j | ƒ f S(   N(   R   t   _sign(   R   R/   R'   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR0   `   s    c         C   s    | d  \ } |  j  j | | ƒ S(   Ni   (   R   t   _verify(   R   R/   t   sigt   s(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR1   c   s    c         C   s   |  j  j ƒ  S(   N(   R   t   has_private(   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR4   j   s    c         C   s   |  j  j ƒ  S(   N(   R   t   size(   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR5   m   s    c         C   s   t  S(   N(   t   True(   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt	   can_blindp   s    c         C   s   t  S(   N(   R6   (   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   can_encrypts   s    c         C   s   t  S(   N(   R6   (   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   can_signv   s    c         C   s"   |  j  j |  j j |  j j f ƒ S(   N(   R   R   R   R   R   (   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt	   publickeyy   s    c         C   sL   i  } x? |  j  D]4 } y t |  j | ƒ | | <Wq t k
 rC q Xq W| S(   N(   R   R   R   R    (   R   R   t   k(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   __getstate__|   s    c         C   s~   t  |  d ƒ s t ƒ  |  _ n  g  } x5 |  j D]* } | j | ƒ sG Pn  | j | | ƒ q. W|  j j j t | ƒ Œ  |  _	 d  S(   NR   (
   t   hasattrt   RSAImplementationR   R   t   has_keyt   appendt   _matht   rsa_constructt   tupleR   (   R   R   t   tR;   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   __setstate__…   s    c         C   s«   g  } x` |  j  D]U } | d k rC | j d |  j ƒ  d f ƒ q t |  j | ƒ r | j | ƒ q q W|  j ƒ  r… | j d ƒ n  d |  j j t |  ƒ d j	 | ƒ f S(   NR   s   n(%d)i   t   privates   <%s @0x%x %s>t   ,(
   R   R@   R5   R=   R   R4   R!   R"   t   idt   join(   R   t   attrsR;   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   __repr__   s    !t   PEMc   
      C   s£  t  ƒ  } |  j ƒ  rz d } d |  j |  j |  j |  j |  j |  j |  j d |  j |  j d t |  j |  j ƒ g	 | (nm d } | j t	 d ƒ ƒ t
 d ƒ } t  ƒ  } |  j |  j g | (t	 d ƒ | j ƒ  | _ | j | j ƒ  ƒ | d k rý | j ƒ  S| d	 k r•t	 d
 | ƒ } | j ƒ  } g  t d t | ƒ d ƒ D]  } t j | | | d !ƒ ^ q>}	 | t	 d ƒ j |	 ƒ 7} | t	 d | ƒ 7} | St d | ƒ S(   s¼   Export the RSA key. A string is returned
        with the encoded public or the private half
        under the selected format.

        format:		'DER' (PKCS#1) or 'PEM' (RFC1421)
        s   RSA PRIVATEi    i   t   PUBLICs   0	*†H†÷ s
   BIT STRINGt    t   DERRL   s   -----BEGIN %s KEY-----
i0   t    s   -----END %s KEY-----s3   Unknown key format '%s'. Cannot export the RSA key.(   R   R4   R   R   R   R   R   R   R@   t   bR
   t   encodet   payloadt   ranget   lent   binasciit
   b2a_base64RI   t
   ValueError(
   R   t   formatt   dert   keyTypet   bitmapt   derPKt   pemt	   binaryKeyt   it   chunks(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt	   exportKey›   s.    	!"	
?N(   R"   t
   __module__R   R   R   R$   R%   R)   R(   R*   R0   R1   R4   R5   R7   R8   R9   R:   R<   RE   RK   Rb   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR   4   s&   															
	R>   c           B   sD   e  Z d  „  Z d „  Z d d d „ Z d „  Z d „  Z d „  Z RS(   c         K   s©   | j  d d  ƒ } | d  k rB t d  k	 r6 t |  _ qx t |  _ n6 | ro t d  k	 r` t |  _ qx t d ƒ ‚ n	 t |  _ |  j j |  _ | j  d d  ƒ |  _ d  |  _ d  S(   Nt   use_fast_maths   fast math module not availablet   default_randfunc(	   t   getR   R   RA   R   t   RuntimeErrorR   t   _default_randfunct   _current_randfunc(   R   t   kwargsRd   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR   ½   s    	c         C   s;   | d  k	 r | S|  j d  k r4 t j ƒ  j |  _ n  |  j S(   N(   R   Ri   R	   R   R   (   R   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   _get_randfuncÚ   s
    c         C   s   | d k  s | d @d k r+ t  d ƒ ‚ n  |  j | ƒ } t j | | | ƒ } |  j j | j | j | j | j	 | j
 | j ƒ } t |  | ƒ S(   Ni   iÿ   i    s8   RSA modulus length must be a multiple of 256 and >= 1024(   RX   Rk   R   t   generate_pyRA   RB   R   R   R   R   R   R   R   (   R   t   bitsR   t   progress_funct   rft   objR   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR    á   s    3c         C   s   |  j  j | Œ  } t |  | ƒ S(   N(   RA   RB   R   (   R   t   tupR   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR   ê   s    c         C   sX  t  ƒ  } | j | t ƒ t | ƒ d k r | j ƒ  r | d d k r | d 3| j t | d | d ƒ ƒ | d =|  j | ƒ St | ƒ d k rH| d t d ƒ k rHt	 ƒ  } | j | d t ƒ | j
 t d	 ƒ d k rE| j d t d
 ƒ d k rE| j | j d t ƒ t | ƒ d k rB| j ƒ  rB|  j | ƒ SqEqHn  t d ƒ ‚ d  S(   Ni	   i    i   i   i   i   s   0	*†H†÷ i   s   RN   s   RSA key format is not supported(   R   t   decodeR6   RU   t   hasOnlyIntsR@   R   R   RQ   R
   t   typeTagRS   RX   (   R   t	   externKeyRZ   R\   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   _importKeyDERî   s     	.	6c         C   sÒ   t  | t ƒ r0 | j d ƒ r0 | j d ƒ } n  | j t d ƒ ƒ r› | j t d ƒ t d ƒ ƒ j ƒ  } t j t d ƒ j	 | d d !ƒ ƒ } |  j
 | ƒ S| d t d ƒ d k rÂ |  j
 | ƒ St d	 ƒ ‚ d
 S(   s#  Import an RSA key (public or private half).

        externKey:	the RSA key to import, encoded as bytes.
                The key can be in DER (PKCS#1) or in unencrypted
                PEM format (RFC1421).

        Raises a ValueError/IndexError if the given key cannot be parsed.
        s   -----t   asciit    RP   i   iÿÿÿÿi    t   0s   RSA key format is not supportedN(   t
   isinstancet   unicodet
   startswithRR   RQ   t   replacet   splitRV   t
   a2b_base64RI   Rv   RX   (   R   Ru   t   linesRZ   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR     s    	$%N(	   R"   Rc   R   Rk   R   R    R   Rv   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR>   ¼   s   					(   t   __doc__t   __revision__t   __all__t   syst   version_infot   Crypto.Util.py21compatt   Crypto.Util.py3compatt   Crypto.Util.numberR   t   Crypto.PublicKeyR   R   R   t   CryptoR	   t   Crypto.Util.asn1R
   R   RV   R   R   t   ImportErrorR   R   t   objectR>   t   _implR    R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   <module>   s.   &

ˆf				