ó
Õ{PXc           @` 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 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# 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_algorithm(   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(    (    sL   /usr/lib/python2.7/dist-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 ƒ ‚ n  | j d  k	 rð | j d k rð t d ƒ ‚ 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.t    s*   This backend does not support OAEP labels.s%   {0} 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   _labelt   Nonet
   ValueErrort   formatt   namet   _enc_dec_rsa_pkey_ctx(   t   backendR   t   datat   paddingt   padding_enum(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _enc_dec_rsa%   s*    	c         C` sd  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 ƒ ƒ }
 |  j |
 |  j	 j
 k ƒ |  j j | |
 ƒ } |  j | d k ƒ |  j j | j j j d ƒ ƒ } |  j | |  j	 j
 k ƒ |  j j | | ƒ } |  j | d k ƒ n  |  j	 j d |	 ƒ } |  j	 j d |	 ƒ } | | | | | t | ƒ ƒ } | d k rLt |  | ƒ n  |  j	 j | ƒ | d  S(   Ni   i    t   asciis   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_get_digestbynameR!   t
   _algorithmR)   t   encodet   EVP_PKEY_CTX_set_rsa_mgf1_mdt   EVP_PKEY_CTX_set_rsa_oaep_mdt   newt   lent   _handle_rsa_enc_dec_errort   buffer(   R+   R   R,   R.   R-   t   initt   cryptt   pkey_ctxt   rest   buf_sizet   mgf1_mdt   oaep_mdt   outlent   buf(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR*   I   sD    				c         C` sé   |  j  ƒ  } | s t ‚ | d j |  j j k s7 t ‚ t | t ƒ rt | d j |  j j k se t ‚ t	 d ƒ ‚ nq |  j j
 |  j j |  j j |  j j g } |  j j rÀ | j |  j j ƒ n  | d j | k sÙ t ‚ 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_errorst   AssertionErrort   libR   t   ERR_LIB_RSAR   R1   t   reasont!   RSA_R_DATA_TOO_LARGE_FOR_KEY_SIZER'   t   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(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyRG   u   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
 j ƒ sê t d t j ƒ ‚ 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.sG   When OpenSSL is older than 1.0.1 then only SHA1 is supported with MGF1.s%   {0} is not supported by this backend.(   R   R   R   R   R>   R7   R:   R   R   R   R!   R   R   R   R"   t   digest_sizeR'   t   _pss_mgf1_hash_supportedRA   t   UNSUPPORTED_HASHt   RSA_PKCS1_PSS_PADDINGR(   R)   R$   (   R+   R   R-   t	   algorithmt	   pkey_sizeR.   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _rsa_sig_determine_padding‘   s,    c         C` sú  |  j  j | j j d ƒ ƒ } |  j | |  j j k ƒ |  j  j | j |  j j ƒ } |  j | |  j j k ƒ |  j j	 | |  j  j
 ƒ } |  j  j | ƒ } |  j | d k ƒ |  j  j | | ƒ } |  j | d k ƒ |  j  j | | ƒ } |  j | d k ƒ t | t ƒ r¸|  j  j | t | | | ƒ ƒ } |  j | d k ƒ |  j  j r¸|  j  j | j j j j d ƒ ƒ }	 |  j |	 |  j j k ƒ |  j  j | |	 ƒ } |  j | d k ƒ q¸n  |  j j d ƒ }
 |  j  j | |  j j |
 | t | ƒ ƒ } |  j | d k ƒ |  j j d |
 d ƒ } |  j  j | | |
 | t | ƒ ƒ } | d k ré|  j ƒ  } | d j |  j  j k s{t ‚ d  } | d j |  j  j k r£d } n% | d j |  j  j  k sÂt ‚ d } | d  k	 sÚt ‚ t! | ƒ ‚ n  |  j j" | ƒ S(   NR0   i   i    s   size_t *s   unsigned char[]s@   Salt length too long for key size. Try using MAX_LENGTH instead.s0   Digest too large for key size. Use a larger key.(#   R   R@   R)   RB   R:   R8   R9   R6   R7   R;   R<   t   EVP_PKEY_sign_initt   EVP_PKEY_CTX_set_signature_mdR=   R   R   t    EVP_PKEY_CTX_set_rsa_pss_saltlenR   t   Cryptography_HAS_MGF1_MDR!   RA   RC   RE   t   EVP_PKEY_signRF   RR   RT   RU   RS   R&   RV   RW   t    RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYR'   RH   (   R+   R-   R.   Re   t   private_keyR,   t   evp_mdRK   RL   RN   t   buflenRQ   R_   RV   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _rsa_sig_sign¸   sn    										
	
c         C` s&  |  j  j | j j d ƒ ƒ } |  j | |  j j k ƒ |  j  j | j |  j j ƒ } |  j | |  j j k ƒ |  j j	 | |  j  j
 ƒ } |  j  j | ƒ }	 |  j |	 d k ƒ |  j  j | | ƒ }	 |  j |	 d k ƒ |  j  j | | ƒ }	 |  j |	 d k ƒ t | t ƒ r¸|  j  j | t | | | ƒ ƒ }	 |  j |	 d k ƒ |  j  j r¸|  j  j | j j j j d ƒ ƒ }
 |  j |
 |  j j k ƒ |  j  j | |
 ƒ }	 |  j |	 d k ƒ q¸n  |  j  j | | t | ƒ | t | ƒ ƒ }	 |  j |	 d k ƒ |	 d k r"|  j ƒ  } | st ‚ t ‚ n  d  S(   NR0   i   i    (   R   R@   R)   RB   R:   R8   R9   R6   R7   R;   R<   t   EVP_PKEY_verify_initRi   R=   R   R   Rj   R   Rk   R!   RA   RC   t   EVP_PKEY_verifyRF   RR   RS   R   (   R+   R-   R.   Re   t
   public_keyt	   signatureR,   Ro   RK   RL   RN   R_   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   _rsa_sig_verify  sT    									t   _RSASignatureContextc           B` s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C` s[   | |  _  | |  _ t | | | | ƒ |  _ | |  _ | |  _ t j |  j |  j  ƒ |  _ d  S(   N(	   t   _backendt   _private_keyRg   t   _padding_enumt   _paddingRA   R   t   Hasht	   _hash_ctx(   t   selfR+   Rn   R-   Re   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   __init__>  s    				c         C` s   |  j  j | ƒ d  S(   N(   R}   t   update(   R~   R,   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR€   I  s    c         C` s1   t  |  j |  j |  j |  j |  j |  j j ƒ  ƒ S(   N(   Rq   Rx   R{   Rz   RA   Ry   R}   t   finalize(   R~   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR   L  s    (   t   __name__t
   __module__R   R€   R   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyRw   <  s   		t   _RSAVerificationContextc           B` s#   e  Z d  „  Z d „  Z d „  Z RS(   c         C` sj   | |  _  | |  _ | |  _ | |  _ t | | | | ƒ |  _ | } | |  _ t j |  j |  j  ƒ |  _	 d  S(   N(
   Rx   t   _public_keyt
   _signatureR{   Rg   Rz   RA   R   R|   R}   (   R~   R+   Rt   Ru   R-   Re   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR   Y  s    					c         C` s   |  j  j | ƒ d  S(   N(   R}   R€   (   R~   R,   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR€   g  s    c         C` s7   t  |  j |  j |  j |  j |  j |  j |  j j ƒ  ƒ S(   N(	   Rv   Rx   R{   Rz   RA   R…   R†   R}   R   (   R~   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   verifyj  s    (   R‚   Rƒ   R   R€   R‡   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR„   W  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    (   Rx   t
   _rsa_cdataR7   R8   RE   R   t   RSA_get0_keyR9   R:   t   BN_num_bitst	   _key_size(   R~   R+   t	   rsa_cdatat   evp_pkeyt   n(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR   x  s    			#RŒ   c         C` s   t  |  j |  | | ƒ S(   N(   Rw   Rx   (   R~   R-   Re   (    (    sL   /usr/lib/python2.7/dist-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_sizeRF   R'   R/   Rx   (   R~   t
   ciphertextR-   t   key_size_bytes(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   decryptŠ  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   (   Rx   R   t   RSAPublicKey_dupR‰   R:   R8   R9   R;   t   RSA_freet   RSA_blinding_ont   _rsa_cdata_to_evp_pkeyR1   (   R~   t   ctxRL   RŽ   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyRt   ‘  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   (   Rx   R8   RE   R   RŠ   R‰   R:   R9   t   RSA_get0_factorst   RSA_get0_crt_paramsR   t   RSAPrivateNumberst
   _bn_to_intt   RSAPublicNumbers(	   R~   R   R¤   RŸ   R   Rž   R    R¡   R¢   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   private_numbersš  s<    ########		c         C` s"   |  j  j | | | |  j |  j ƒ S(   N(   Rx   t   _private_key_bytesR7   R‰   (   R~   t   encodingR(   t   encryption_algorithm(    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   private_bytes½  s    	c         C` sO   t  |  j |  | | ƒ } t |  j | | ƒ \ } } t |  j | | | |  | ƒ S(   N(   Rg   Rx   R   Rq   (   R~   R,   R-   Re   R.   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   signÆ  s    (   R‚   Rƒ   R   R   t   read_only_propertyR”   R   R—   Rt   Rª   R®   R¯   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyRˆ   v  s   						#		R1   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    (   Rx   R‰   R7   R8   RE   R   RŠ   R9   R:   R‹   RŒ   (   R~   R+   R   RŽ   R   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR   Õ  s    			#RŒ   c         C` s7   t  | t ƒ s t d ƒ ‚ n  t |  j |  | | | ƒ S(   Ns   signature must be bytes.(   R   t   bytesR   R„   Rx   (   R~   Ru   R-   Re   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   verifierä  s    c         C` s   t  |  j |  | | ƒ S(   N(   R/   Rx   (   R~   t	   plaintextR-   (    (    sL   /usr/lib/python2.7/dist-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   (   Rx   R8   RE   R   RŠ   R‰   R9   R:   R   R©   R¨   (   R~   R   R¤   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR£   ï  s    ##	c         C` s"   |  j  j | | |  |  j |  j ƒ S(   N(   Rx   t   _public_key_bytesR7   R‰   (   R~   R¬   R(   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   public_bytesü  s    	c         C` sR   t  |  j |  | | ƒ } t |  j | | ƒ \ } } t |  j | | | |  | | ƒ S(   N(   Rg   Rx   R   Rv   (   R~   Ru   R,   R-   Re   R.   (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR‡     s    (   R‚   Rƒ   R   R   R°   R”   R²   R´   R£   R¶   R‡   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyR1   Ó  s   						(*   t
   __future__R    R   R   R’   t   cryptographyR   t   cryptography.exceptionsR   R   R   t*   cryptography.hazmat.backends.openssl.utilsR   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*   RG   Rg   Rq   Rv   t   register_interfacet   objectRw   R„   Rˆ   R1   (    (    (    sL   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/rsa.pyt   <module>   s.   .			$	,		'	I	;\