σ
/<υ\c           @` sΐ  d  d l  m Z m Z m Z d  d l Z d  d l m Z d  d l m Z m	 Z	 m
 Z
 d  d l m Z m Z m Z d  d l m Z d  d l m Z m Z m Z d  d l m Z m Z m Z m Z m Z m Z d  d	 l m Z m Z d
   Z d   Z  d   Z! d   Z" d   Z# d   Z$ d   Z% d   Z& e j' e  d e( f d     Y Z) e j' e  d e( f d     Y Z* e j' e  d e( f d     Y Z+ e j' e  d e( f d     Y Z, d S(   i    (   t   absolute_importt   divisiont   print_functionN(   t   utils(   t   InvalidSignaturet   UnsupportedAlgorithmt   _Reasons(   t   _calculate_digest_and_algorithmt   _check_not_prehashedt   _warn_sign_verify_deprecated(   t   hashes(   t   AsymmetricSignatureContextt   AsymmetricVerificationContextt   rsa(   t   AsymmetricPaddingt   MGF1t   OAEPt   PKCS1v15t   PSSt   calculate_max_pss_salt_length(   t   RSAPrivateKeyWithSerializationt   RSAPublicKeyWithSerializationc         C` s<   |  j  } | t j k s' | t j k r4 t | |  S| Sd  S(   N(   t   _salt_lengthR   t
   MAX_LENGTHR   R   (   t   psst   keyt   hash_algorithmt   salt(    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _get_rsa_pss_salt_length   s    	c         C` sΩ   t  | t  s t d   n  t  | t  r< |  j j } n t  | t  r₯ |  j j } t  | j t	  s~ t
 d t j   n  |  j |  sΓ t
 d t j   qΓ n t
 d j | j  t j   t |  | | | |  S(   Ns1   Padding must be an instance of AsymmetricPadding.s'   Only MGF1 is supported by this backend.sP   This combination of padding and hash algorithm is not supported by this backend.s$   {} is not supported by this backend.(   t
   isinstanceR   t	   TypeErrorR   t   _libt   RSA_PKCS1_PADDINGR   t   RSA_PKCS1_OAEP_PADDINGt   _mgfR   R   R   t   UNSUPPORTED_MGFt   rsa_padding_supportedt   UNSUPPORTED_PADDINGt   formatt   namet   _enc_dec_rsa_pkey_ctx(   t   backendR   t   datat   paddingt   padding_enum(    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _enc_dec_rsa&   s&    	c         C` sΤ  t  | t  r* |  j j } |  j j } n |  j j } |  j j } |  j j | j |  j	 j
  } |  j | |  j	 j
 k  |  j	 j | |  j j  } | |  } |  j | d k  |  j j | |  } |  j | d k  |  j j | j  }	 |  j |	 d k  t  | t  r|  j j r|  j | j j  }
 |  j j | |
  } |  j | d k  |  j | j  } |  j j | |  } |  j | d k  n  t  | t  rX| j d  k	 rXt | j  d k rX|  j j t | j   } |  j | |  j	 j
 k  |  j	 j | | j t | j   |  j j | | t | j   } |  j | d k  n  |  j	 j d |	  } |  j	 j d |	  } | | | | | t |   } | d k rΌt |  |  n  |  j	 j |  | d  S(   Ni   i    s   size_t *s   unsigned char[](    R   t   _RSAPublicKeyR   t   EVP_PKEY_encrypt_initt   EVP_PKEY_encryptt   EVP_PKEY_decrypt_initt   EVP_PKEY_decryptt   EVP_PKEY_CTX_newt	   _evp_pkeyt   _ffit   NULLt   openssl_assertt   gct   EVP_PKEY_CTX_freet   EVP_PKEY_CTX_set_rsa_paddingt   EVP_PKEY_sizeR   t   Cryptography_HAS_RSA_OAEP_MDt   _evp_md_non_null_from_algorithmR"   t
   _algorithmt   EVP_PKEY_CTX_set_rsa_mgf1_mdt   EVP_PKEY_CTX_set_rsa_oaep_mdt   _labelt   Nonet   lent   OPENSSL_malloct   memmovet    EVP_PKEY_CTX_set0_rsa_oaep_labelt   newt   _handle_rsa_enc_dec_errort   buffer(   R)   R   R*   R,   R+   t   initt   cryptt   pkey_ctxt   rest   buf_sizet   mgf1_mdt   oaep_mdt   labelptrt   outlent   buf(    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR(   G   sP    		"	c         C` sν   |  j    } |  j |  |  j | d j |  j j k  t | t  rw |  j | d j |  j j k  t	 d   nr |  j j
 |  j j |  j j |  j j g } |  j j rΓ | j |  j j  n  |  j | d j | k  t	 d   d  S(   Ni    sG   Data too long for key size. Encrypt less data or use a larger key size.s   Decryption failed.(   t   _consume_errorsR7   t   libR   t   ERR_LIB_RSAR   R.   t   reasont!   RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZEt
   ValueErrort   RSA_R_BLOCK_TYPE_IS_NOT_01t   RSA_R_BLOCK_TYPE_IS_NOT_02t   RSA_R_OAEP_DECODING_ERRORt    RSA_R_DATA_TOO_LARGE_FOR_MODULUSt*   Cryptography_HAS_RSA_R_PKCS_DECODING_ERRORt   appendt   RSA_R_PKCS_DECODING_ERROR(   R)   R   t   errorst   decoding_errors(    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyRH      s      			c         C` sρ   t  | t  s t d   n  |  j j | j  } |  j | d k  t  | t  rd |  j j } n t  | t	  rΟ t  | j
 t  s t d t j   n  | | j d d k  rΐ t d   n  |  j j } n t d j | j  t j   | S(   Ns'   Expected provider of AsymmetricPadding.i    s'   Only MGF1 is supported by this backend.i   sD   Digest too large for key size. Use a larger key or different digest.s$   {} is not supported by this backend.(   R   R   R   R   R;   R4   R7   R   R    R   R"   R   R   R   R#   t   digest_sizeRY   t   RSA_PKCS1_PSS_PADDINGR&   R'   R%   (   R)   R   R+   t	   algorithmt	   pkey_sizeR,   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _rsa_sig_determine_padding   s$    c         C` s  t  |  | | |  } |  j |  } |  j j | j |  j j  } |  j | |  j j k  |  j j | |  j j	  } | |  }	 |  j |	 d k  |  j j
 | |  }	 |	 d k rα |  j   t d j | j  t j   n  |  j j | |  }	 |  j |	 d k  t | t  r|  j j | t | | |   }	 |  j |	 d k  |  j | j j  }
 |  j j | |
  }	 |  j |	 d k  n  | S(   Ni   i    s4   {} is not supported by this backend for RSA signing.(   Rg   R=   R   R3   R4   R5   R6   R7   R8   R9   t   EVP_PKEY_CTX_set_signature_mdRT   R   R&   R'   R   t   UNSUPPORTED_HASHR:   R   R   t    EVP_PKEY_CTX_set_rsa_pss_saltlenR   R"   R>   R?   (   R)   R+   Re   R   R*   t	   init_funcR,   t   evp_mdRL   RM   RO   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _rsa_sig_setupΌ   s2    
		c         C` sM  t  |  | | | | |  j j  } |  j j d  } |  j j | |  j j | | t |   } |  j | d k  |  j j d | d  } |  j j | | | | t |   } | d k r<|  j	   }	 |  j |	 d j
 |  j j k  |	 d j |  j j k rd }
 n& |  j |	 d j |  j j k  d }
 t |
   n  |  j j |  S(   Ns   size_t *i   s   unsigned char[]i    s@   Salt length too long for key size. Try using MAX_LENGTH instead.s0   Digest too large for key size. Use a larger key.(   Rm   R   t   EVP_PKEY_sign_initR5   RG   t   EVP_PKEY_signR6   RC   R7   RT   RU   RV   RW   RX   t    RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYRY   RI   (   R)   R+   Re   t   private_keyR*   RL   t   buflenRM   RS   Ra   RW   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _rsa_sig_signέ   s4    			 
	
c         C` s   t  |  | | | | |  j j  } |  j j | | t |  | t |   } |  j | d k  | d k r} |  j   t  n  d  S(   Ni    (   Rm   R   t   EVP_PKEY_verify_initt   EVP_PKEY_verifyRC   R7   RT   R   (   R)   R+   Re   t
   public_keyt	   signatureR*   RL   RM   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _rsa_sig_verify  s    	!
t   _RSASignatureContextc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` sV   | |  _  | |  _ t | | | |  | |  _ | |  _ t j |  j |  j   |  _ d  S(   N(   t   _backendt   _private_keyRg   t   _paddingR>   R
   t   Hasht	   _hash_ctx(   t   selfR)   Rq   R+   Re   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   __init__  s    				c         C` s   |  j  j |  d  S(   N(   R~   t   update(   R   R*   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   !  s    c         C` s+   t  |  j |  j |  j |  j |  j j    S(   N(   Rs   Rz   R|   R>   R{   R~   t   finalize(   R   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   $  s    (   t   __name__t
   __module__R   R   R   (    (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyRy     s   		t   _RSAVerificationContextc           B` s#   e  Z d    Z d   Z d   Z RS(   c         C` se   | |  _  | |  _ | |  _ | |  _ t | | | |  | } | |  _ t j |  j |  j   |  _ d  S(   N(	   Rz   t   _public_keyt
   _signatureR|   Rg   R>   R
   R}   R~   (   R   R)   Rv   Rw   R+   Re   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   0  s    					c         C` s   |  j  j |  d  S(   N(   R~   R   (   R   R*   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   >  s    c         C` s1   t  |  j |  j |  j |  j |  j |  j j    S(   N(   Rx   Rz   R|   R>   R   R   R~   R   (   R   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   verifyA  s    (   R   R   R   R   R   (    (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   .  s   		t   _RSAPrivateKeyc           B` sV   e  Z d    Z e j d  Z d   Z d   Z d   Z d   Z	 d   Z
 d   Z RS(   c         C` s€   | |  _  | |  _ | |  _ |  j  j j d  } |  j  j j |  j | |  j  j j |  j  j j  |  j  j | d |  j  j j k  |  j  j j	 | d  |  _
 d  S(   Ns	   BIGNUM **i    (   Rz   t
   _rsa_cdataR4   R5   RG   R   t   RSA_get0_keyR6   R7   t   BN_num_bitst	   _key_size(   R   R)   t	   rsa_cdatat   evp_pkeyt   n(    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   N  s    			#R   c         C` s'   t    t |  t |  j |  | |  S(   N(   R	   R   Ry   Rz   (   R   R+   Re   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   signer]  s    
c         C` sS   t  t j |  j d   } | t |  k r= t d   n  t |  j |  | |  S(   Ng       @s,   Ciphertext length must be equal to key size.(   t   intt   matht   ceilt   key_sizeRC   RY   R-   Rz   (   R   t
   ciphertextR+   t   key_size_bytes(    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   decryptb  s    c         C` s΄   |  j  j j |  j  } |  j  j | |  j  j j k  |  j  j j | |  j  j j  } |  j  j j	 | |  j  j j  } |  j  j | d k  |  j  j
 |  } t |  j  | |  S(   Ni   (   Rz   R   t   RSAPublicKey_dupR   R7   R5   R6   R8   t   RSA_freet   RSA_blinding_ont   _rsa_cdata_to_evp_pkeyR.   (   R   t   ctxRM   R   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyRv   i  s    !!c   	      C` sΰ  |  j  j j d  } |  j  j j d  } |  j  j j d  } |  j  j j d  } |  j  j j d  } |  j  j j d  } |  j  j j d  } |  j  j j d  } |  j  j j |  j | | |  |  j  j | d |  j  j j k  |  j  j | d |  j  j j k  |  j  j | d |  j  j j k  |  j  j j |  j | |  |  j  j | d |  j  j j k  |  j  j | d |  j  j j k  |  j  j j	 |  j | | |  |  j  j | d |  j  j j k  |  j  j | d |  j  j j k  |  j  j | d |  j  j j k  t
 j d |  j  j | d  d |  j  j | d  d |  j  j | d  d |  j  j | d  d |  j  j | d  d |  j  j | d  d	 t
 j d
 |  j  j | d  d |  j  j | d    S(   Ns	   BIGNUM **i    t   pt   qt   dt   dmp1t   dmq1t   iqmpt   public_numberst   eR   (   Rz   R5   RG   R   R   R   R7   R6   t   RSA_get0_factorst   RSA_get0_crt_paramsR   t   RSAPrivateNumberst
   _bn_to_intt   RSAPublicNumbers(	   R   R   R₯   R    R   R   R‘   R’   R£   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   private_numbersr  s<    ########		c         C` s"   |  j  j | | | |  j |  j  S(   N(   Rz   t   _private_key_bytesR4   R   (   R   t   encodingR&   t   encryption_algorithm(    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   private_bytes  s    	c         C` s4   t  |  j | |  \ } } t |  j | | |  |  S(   N(   R   Rz   Rs   (   R   R*   R+   Re   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   sign  s    (   R   R   R   R   t   read_only_propertyR   R   R   Rv   R«   R―   R°   (    (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   L  s   						#		R.   c           B` sM   e  Z d    Z e j d  Z d   Z d   Z d   Z d   Z	 d   Z
 RS(   c         C` s€   | |  _  | |  _ | |  _ |  j  j j d  } |  j  j j |  j | |  j  j j |  j  j j  |  j  j | d |  j  j j k  |  j  j j	 | d  |  _
 d  S(   Ns	   BIGNUM **i    (   Rz   R   R4   R5   RG   R   R   R6   R7   R   R   (   R   R)   R   R   R   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   §  s    			#R   c         C` s:   t    t j d |  t |  t |  j |  | | |  S(   NRw   (   R	   R   t   _check_bytesR   R   Rz   (   R   Rw   R+   Re   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   verifierΆ  s
    
c         C` s   t  |  j |  | |  S(   N(   R-   Rz   (   R   t	   plaintextR+   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   encryptΏ  s    c         C` sΞ   |  j  j j d  } |  j  j j d  } |  j  j j |  j | | |  j  j j  |  j  j | d |  j  j j k  |  j  j | d |  j  j j k  t j	 d |  j  j
 | d  d |  j  j
 | d   S(   Ns	   BIGNUM **i    R₯   R   (   Rz   R5   RG   R   R   R   R6   R7   R   Rͺ   R©   (   R   R   R₯   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR€   Β  s    ##	c         C` s"   |  j  j | | |  |  j |  j  S(   N(   Rz   t   _public_key_bytesR4   R   (   R   R­   R&   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   public_bytesΟ  s    	c         C` s7   t  |  j | |  \ } } t |  j | | |  | |  S(   N(   R   Rz   Rx   (   R   Rw   R*   R+   Re   (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR   Ψ  s    (   R   R   R   R   R±   R   R³   R΅   R€   R·   R   (    (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyR.   ₯  s   							(-   t
   __future__R    R   R   R   t   cryptographyR   t   cryptography.exceptionsR   R   R   t*   cryptography.hazmat.backends.openssl.utilsR   R   R	   t   cryptography.hazmat.primitivesR
   t)   cryptography.hazmat.primitives.asymmetricR   R   R   t1   cryptography.hazmat.primitives.asymmetric.paddingR   R   R   R   R   R   t-   cryptography.hazmat.primitives.asymmetric.rsaR   R   R   R-   R(   RH   Rg   Rm   Rs   Rx   t   register_interfacet   objectRy   R   R   R.   (    (    (    sG   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/rsa.pyt   <module>   s0   .			!	8		 	!	%	X