ó
Ô·ìMc           @   s  d  Z  d Z d d d d g Z d d l Td d l m Z m Z m Z d d	 l m	 Z	 d d
 l
 m Z m Z d d l 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ÿÿÿÿ(   t   *(   t   _RSAt	   _slowmatht   pubkey(   t   Random(   t	   DerObjectt   DerSequenceN(   t	   _fastmatht   _RSAobjc           B   sÈ   e  Z d  d d d d d g Z 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  S(   N(   t   implementationt   key(   t   selfR   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   __init__/   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__3   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   ;   s    c         C   s   | d  \ } |  j  j | ƒ S(   Ni   (   R   t   _decrypt(   R   R   t
   ciphertext(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR!   >   s    c         C   s   |  j  j | | ƒ S(   N(   R   t   _blind(   R   t   mt   r(    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR#   F   s    c         C   s   |  j  j | | ƒ S(   N(   R   t   _unblind(   R   R$   R%   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR&   I   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.pyR'   L   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.pyR(   O   s    c         C   s   |  j  j ƒ  S(   N(   R   t   has_private(   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR+   V   s    c         C   s   |  j  j ƒ  S(   N(   R   t   size(   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR,   Y   s    c         C   s   t  S(   N(   t   True(   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt	   can_blind\   s    c         C   s   t  S(   N(   R-   (   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   can_encrypt_   s    c         C   s   t  S(   N(   R-   (   R   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   can_signb   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	   publickeye   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__h   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   tR2   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   __setstate__q   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   R7   R,   R4   R   R+   R   R   t   idt   join(   R   t   attrsR2   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   __repr__{   s    !t   PEMc   
   
   C   su  t  ƒ  } |  j ƒ  rn d } d |  j |  j |  j |  j |  j |  j |  j d |  j |  j d |  j g	 | (na d } | j d ƒ t	 d ƒ } t  ƒ  } |  j |  j g | (d | j
 ƒ  | _ | j | j
 ƒ  ƒ | d k rå | j
 ƒ  S| d	 k rkd
 | } | j
 ƒ  } g  t d t | ƒ d ƒ D]  } t j | | | d !ƒ ^ q }	 | d j |	 ƒ 7} | 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   DERRC   s   -----BEGIN %s KEY-----
i0   t    s   -----END %s KEY-----(   R
   R+   R   R   R   R   R   R   R7   R	   t   encodet   payloadt   ranget   lent   binasciit
   b2a_base64R@   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&   t   NoneR'   R(   R+   R,   R.   R/   R0   R1   R3   R<   RB   RX   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR   ,   s&   																
	R5   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   getRZ   R   R8   R   t   RuntimeErrorR   t   _default_randfunct   _current_randfunc(   R   t   kwargsR[   (    (    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(   RZ   R`   R   t   newt   read(   R   t   randfunc(    (    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(   RN   Re   R   t   generate_pyR8   R9   R   R   R   R   R   R   R   (   R   t   bitsRd   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(   R8   R9   R   (   R   t   tupR   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR   Õ   s    c         C   s#  t  ƒ  } | j | t ƒ t | ƒ d k rf | j ƒ  rf | d d k rf | d d 5| d =|  j | ƒ St | ƒ d k r| d d k rt ƒ  } | j | d t ƒ | j d k r| j d d	 k r| j | j d t ƒ t | ƒ d k r| j ƒ  r|  j | ƒ Sqqn  t	 d
 ƒ ‚ d  S(   Ni	   i    i   i   i   s   0	*†H†÷ i   s   RE   s   RSA key format is not supported(
   R
   t   decodeR-   RK   t   hasOnlyIntsR   R	   t   typeTagRI   RN   (   R   t	   externKeyRP   RR   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   _importKeyDERÙ   s    	.
	"c         C   s€   | j  d ƒ rS | j d d ƒ j ƒ  } t j d j | d d !ƒ ƒ } |  j | ƒ S| d d k rp |  j | ƒ St d ƒ ‚ d	 S(
   s³   Import an RSA key (public or private half).

	externKey:	the RSA key to import, encoded as a string.
			The key can be in DER (PKCS#1) or in unencrypted
			PEM format (RFC1421).
	s   -----t    RG   i   iÿÿÿÿi    t   0s   RSA key format is not supportedN(   t
   startswitht   replacet   splitRL   t
   a2b_base64R@   Rp   RN   (   R   Ro   t   linesRP   (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR   ì   s    N(	   R   RY   R   Re   RZ   R    R   Rp   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyR5   §   s   					(   t   __doc__t   __revision__t   __all__t   Crypto.Util.python_compatt   Crypto.PublicKeyR   R   R   t   CryptoR   t   Crypto.Util.asn1R	   R
   RL   R   t   ImportErrorRZ   R   t   objectR5   t   _implR    R   R   R   (    (    (    s8   /usr/lib/python2.7/dist-packages/Crypto/PublicKey/RSA.pyt   <module>   s$   

{V				