
/<\c           @` s  d  d l  m Z m Z m Z d  d l Z d  d l Z d  d l Z d  d l Z d  d l m Z d  d l	 Z
 d  d l Z d  d l m Z d  d l m Z m Z d  d l m Z m Z d  d l m Z m Z m Z m Z m Z m Z m Z m Z m Z m Z m Z m  Z  m! Z! d  d l" m# Z# d  d	 l$ m% Z% d  d
 l& m' Z' d  d l( m) Z) m* Z* d  d l+ m, Z, m- Z- m. Z. m/ Z/ d  d l0 m1 Z1 m2 Z2 m3 Z3 d  d l4 m5 Z5 m6 Z6 d  d l7 m8 Z8 m9 Z9 d  d l: m; Z; m< Z< m= Z= d  d l> m? Z? m@ Z@ mA ZA mB ZB mC ZC mD ZD mE ZE mF ZF mG ZG d  d lH mI ZI d  d lJ mK ZK d  d lL mM ZM mN ZN d  d lO mP ZP mQ ZQ d  d lR mS ZS mT ZT d  d lU mV ZV mW ZW d  d lX mY ZY mZ ZZ d  d l[ m\ Z\ m] Z] m^ Z^ m_ Z_ d  d l` ma Za d  d lb mc Zc md Zd d  d le mf Zf mg Zg mh Zh mi Zi d  d lj mk Zk ml Zl mm Zm mn Zn d  d lo mp Zp mq Zq mr Zr ms Zs mt Zt mu Zu mv Zv mw Zw mx Zx d  d ly mz Zz m{ Z{ m| Z| m} Z} m~ Z~ m Z m Z m Z d  d  l m Z d  d! l m Z d  d" l m Z e j d# d$ d% g  Z e j e  e j e  e j e  e j e  e j e  e j e  e j e  e j e  e j e  e j e  e j e  e j e!  e j ea j   j j e   d& e f d'     Y             Z d( e f d)     YZ d*   Z e   Z d S(+   i    (   t   absolute_importt   divisiont   print_functionN(   t   contextmanager(   t   range(   t   utilst   x509(   t   UnsupportedAlgorithmt   _Reasons(   t   CMACBackendt   CipherBackendt   DERSerializationBackendt	   DHBackendt
   DSABackendt   EllipticCurveBackendt   HMACBackendt   HashBackendt   PBKDF2HMACBackendt   PEMSerializationBackendt
   RSABackendt   ScryptBackendt   X509Backend(   t   aead(   t   _CipherContext(   t   _CMACContext(   t   _CRL_ENTRY_REASON_ENUM_TO_CODEt	   _Integers(   t   _DHParameterst   _DHPrivateKeyt   _DHPublicKeyt   _dh_params_dup(   t   _DSAParameterst   _DSAPrivateKeyt   _DSAPublicKey(   t   _EllipticCurvePrivateKeyt   _EllipticCurvePublicKey(   t   _Ed25519PrivateKeyt   _Ed25519PublicKey(   t   _ED448_KEY_SIZEt   _Ed448PrivateKeyt   _Ed448PublicKey(	   t$   _CRL_ENTRY_EXTENSION_ENCODE_HANDLERSt   _CRL_EXTENSION_ENCODE_HANDLERSt   _EXTENSION_ENCODE_HANDLERSt)   _OCSP_BASICRESP_EXTENSION_ENCODE_HANDLERSt'   _OCSP_REQUEST_EXTENSION_ENCODE_HANDLERSt   _encode_asn1_int_gct   _encode_asn1_str_gct   _encode_name_gct   _txt2obj_gc(   t   _HashContext(   t   _HMACContext(   t   _OCSPRequestt   _OCSPResponse(   t   _POLY1305_KEY_SIZEt   _Poly1305Context(   t   _RSAPrivateKeyt   _RSAPublicKey(   t   _X25519PrivateKeyt   _X25519PublicKey(   t   _X448PrivateKeyt   _X448PublicKey(   t   _Certificatet   _CertificateRevocationListt   _CertificateSigningRequestt   _RevokedCertificate(   t   binding(   t   hashest   serialization(   t   dsat   ect   ed25519t   rsa(   t   MGF1t   OAEPt   PKCS1v15t   PSS(	   t   AESt   ARC4t   Blowfisht   CAST5t   Camelliat   ChaCha20t   IDEAt   SEEDt	   TripleDES(   t   CBCt   CFBt   CFB8t   CTRt   ECBt   GCMt   OFBt   XTS(   t   scrypt(   t   ssh(   t   ocspt
   _MemoryBIOt   biot   char_ptrt   Backendc           B` s  e  Z d  Z d Z d   Z d   Z d   Z e j d    Z	 d   Z
 d   Z d   Z d	   Z d
   Z d   Z d   Z d   Z 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 d   Z d   Z  d   Z! d   Z" d   Z# d   Z$ d    Z% d!   Z& d"   Z' d#   Z( d$   Z) d%   Z* d&   Z+ d'   Z, d(   Z- d)   Z. d*   Z/ d+   Z0 d,   Z1 d-   Z2 d.   Z3 d/   Z4 d0   Z5 d1   Z6 d2   Z7 d3   Z8 d4   Z9 d5   Z: d6   Z; d7   Z< d8   Z= d9   Z> d:   Z? d;   Z@ d<   ZA d=   ZB d>   ZC d?   ZD d@   ZE dA   ZF dB   ZG dC   ZH dD   ZI dE   ZJ dF   ZK dG   ZL dH   ZM dI   ZN dJ   ZO dK   ZP dL   ZQ dM   ZR dN   ZS dO   ZT dP   ZU dQ   ZV dR   ZW dS   ZX dT   ZY dU   ZZ dV   Z[ dW   Z\ dX   Z] dY   Z^ dZ   Z_ e d[    Z` d\   Za d]   Zb d^   Zc d_   Zd d`   Ze da   Zf db   Zg dc   Zh dd   Zi de   Zj df   Zk dg   Zl dh   Zm di   Zn d dj  Zo dk   Zp dl   Zq dm   Zr dn   Zs do   Zt dp   Zu dq   Zv dr   Zw ds   Zx dt   Zy du   Zz dv   Z{ dw   Z| dx   Z} dy   Z~ dz   Z d{   Z d|   Z d}   Z d~   Z d   Z e j d    Z d   Z e j d    Z d   Z d   Z d   Z RS(   s)   
    OpenSSL API binding interfaces.
    t   opensslc         C` s   t  j   |  _ |  j j |  _ |  j j |  _ i  |  _ |  j   |  j	   |  j j
 g |  _ |  j j r |  j j |  j j  n  d  S(   N(   RB   t   Bindingt   _bindingt   ffit   _ffit   libt   _libt   _cipher_registryt   _register_default_cipherst   activate_osrandom_enginet   EVP_PKEY_DHt	   _dh_typest   Cryptography_HAS_EVP_PKEY_DHXt   appendt   EVP_PKEY_DHX(   t   self(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   __init__s   s    	

c         C` s   t  j |  j |  S(   N(   RB   t   _openssl_assertRk   (   Rt   t   ok(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   openssl_assert   s    c         C` sy   |  j  j ru |  j  j   } | |  j j k ru |  j  j |  |  j  j   |  j  j |  } |  j | d k  qu n  d  S(   Ni   (	   Rk   t   Cryptography_HAS_ENGINEt   ENGINE_get_default_RANDRi   t   NULLt   ENGINE_unregister_RANDt   RAND_cleanupt   ENGINE_finishRx   (   Rt   t   et   res(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   activate_builtin_random   s    c         c` s   |  j  j |  j  j  } |  j | |  j j k  |  j  j |  } |  j | d k  z	 | VWd  |  j  j |  } |  j | d k  |  j  j |  } |  j | d k  Xd  S(   Ni   (	   Rk   t   ENGINE_by_idt   Cryptography_osrandom_engine_idRx   Ri   R{   t   ENGINE_initt   ENGINE_freeR~   (   Rt   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _get_osurandom_engine   s    	c         C` sd   |  j  j r` |  j   |  j   , } |  j  j |  } |  j | d k  Wd  QX|  j  j   n  d  S(   Ni   (   Rk   Ry   R   R   t   ENGINE_set_default_RANDRx   R}   (   Rt   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyRn      s    
c         C` s   |  j  j d d  } |  j   G } |  j j | d t |  | |  j  j d  } |  j | d k  Wd  QX|  j  j |  j	 d  S(   Ns   char[]i@   t   get_implementationi    t   ascii(
   Ri   t   newR   Rk   t   ENGINE_ctrl_cmdt   lenR{   Rx   t   stringt   decode(   Rt   t   bufR   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   osrandom_engine_implementation   s    c         C` s+   |  j  j |  j j |  j j   j d  S(   s   
        Friendly string name of the loaded OpenSSL library. This is not
        necessarily the same version as it was compiled against.

        Example: OpenSSL 1.0.1e 11 Feb 2013
        R   (   Ri   R   Rk   t   OpenSSL_versiont   OPENSSL_VERSIONR   (   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   openssl_version_text   s    	c         C` s   |  j  j   S(   N(   Rk   t   OpenSSL_version_num(   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   openssl_version_number   s    c         C` s   t  |  | |  S(   N(   R3   (   Rt   t   keyt	   algorithm(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_hmac_ctx   s    c         C` sn   | j  d k s | j  d k rF d j | j  | j d  j d  } n | j  j d  } |  j j |  } | S(   Nt   blake2bt   blake2ss   {}{}i   R   (   t   namet   formatt   digest_sizet   encodeRk   t   EVP_get_digestbyname(   Rt   R   t   algt   evp_md(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _evp_md_from_algorithm   s    c         C` s,   |  j  |  } |  j | |  j j k  | S(   N(   R   Rx   Ri   R{   (   Rt   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _evp_md_non_null_from_algorithm   s    c         C` s   |  j  |  } | |  j j k S(   N(   R   Ri   R{   (   Rt   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   hash_supported   s    c         C` s   |  j  |  S(   N(   R   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   hmac_supported   s    c         C` s   t  |  |  S(   N(   R2   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_hash_ctx   s    c         C` sZ   y# |  j  t |  t |  f } Wn t k
 r7 t SX| |  | |  } |  j j | k S(   N(   Rl   t   typet   KeyErrort   FalseRi   R{   (   Rt   t   ciphert   modet   adaptert
   evp_cipher(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   cipher_supported   s    #c         C` sG   | | f |  j  k r0 t d j | |    n  | |  j  | | f <d  S(   Ns"   Duplicate registration for: {} {}.(   Rl   t
   ValueErrorR   (   Rt   t
   cipher_clst   mode_clsR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   register_cipher_adapter   s    	c         C` s  x< t  t t t t t t g D] } |  j t | t	 d   q Wx6 t  t t t t g D] } |  j t
 | t	 d   qU Wx3 t  t t t g D] } |  j t | t	 d   q W|  j t t t	 d   x3 t  t t t g D] } |  j t | t	 d   q Wx3 t  t t t g D] } |  j t | t	 d   qWxK t j t t g t  t t t g  D]% \ } } |  j | | t	 d   qXW|  j t t d   t	 d   |  j t t d   t	 d   |  j t t t  d  S(	   Ns+   {cipher.name}-{cipher.key_size}-{mode.name}s   des-ede3-{mode.name}s   des-ede3s   bf-{mode.name}s   seed-{mode.name}s   {cipher.name}-{mode.name}t   rc4t   chacha20(   RV   RY   RZ   R\   RW   RX   R[   R   RM   t   GetCipherByNameRQ   RU   RO   RT   t	   itertoolst   productRP   RS   RN   R   t   NoneRR   R]   t   _get_xts_cipher(   Rt   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyRm      sZ    "				c         C` s   t  |  | | t  j  S(   N(   R   t   _ENCRYPT(   Rt   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_symmetric_encryption_ctx)  s    c         C` s   t  |  | | t  j  S(   N(   R   t   _DECRYPT(   Rt   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_symmetric_decryption_ctx,  s    c         C` s   |  j  |  S(   N(   R   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   pbkdf2_hmac_supported/  s    c   
   	   C` s   |  j  j d |  } |  j |  } |  j  j |  } |  j j | t |  | t |  | | | |  }	 |  j |	 d k  |  j  j |  S(   Ns   unsigned char[]i   (	   Ri   R   R   t   from_bufferRk   t   PKCS5_PBKDF2_HMACR   Rx   t   buffer(
   Rt   R   t   lengtht   saltt
   iterationst   key_materialR   R   t   key_material_ptrR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   derive_pbkdf2_hmac2  s    				c         C` s   t  j |  j  S(   N(   RB   t   _consume_errorsRk   (   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR   D  s    c         C` s  | |  j  j k s t  t j s |  j j |  } |  j  j d |  } |  j j | |  } |  j	 | d k  t
 j |  j  j |  |  d  } |  j j |  r | } n  | S|  j j |  } |  j	 | |  j  j k  |  j  j |  } |  j j |  t
 | d  Sd  S(   Ns   unsigned char[]i    t   bigi   (   Ri   R{   t   AssertionErrort   sixt   PY2Rk   t   BN_num_bytesR   t	   BN_bn2binRx   t   intt
   from_bytesR   t   BN_is_negativet	   BN_bn2hexR   t   OPENSSL_free(   Rt   t   bnt   bn_num_bytest   bin_ptrt   bin_lent   valt	   hex_cdatat   hex_str(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt
   _bn_to_intG  s    	"
c         C` s8  | d	 k s$ | |  j j k s$ t  | d	 k r? |  j j } n  t j s | j t | j   d d  d  } |  j	 j
 | t |  |  } |  j | |  j j k  | St |  j d  d j d  } |  j j d  } | | d <|  j	 j | |  } |  j | d k  |  j | d |  j j k  | d Sd	 S(
   s
  
        Converts a python integer to a BIGNUM. The returned BIGNUM will not
        be garbage collected (to support adding them to structs that take
        ownership of the object). Be sure to register it for GC if it will
        be discarded after use.
        g       @i   R   t   Li   R   s	   BIGNUM **i    N(   R   Ri   R{   R   R   R   t   to_bytesR   t
   bit_lengthRk   t	   BN_bin2bnR   Rx   t   hext   rstripR   R   t	   BN_hex2bn(   Rt   t   numR   t   binaryt   bn_ptrt   hex_numR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt
   _int_to_bn]  s    $	&"
c         C` s   t  j | |  |  j j   } |  j | |  j j k  |  j j | |  j j  } |  j	 |  } |  j j | |  j j
  } |  j j | | | |  j j  } |  j | d k  |  j |  } t |  | |  S(   Ni   (   RH   t   _verify_rsa_parametersRk   t   RSA_newRx   Ri   R{   t   gct   RSA_freeR   t   BN_freet   RSA_generate_key_ext   _rsa_cdata_to_evp_pkeyR8   (   Rt   t   public_exponentt   key_sizet	   rsa_cdataR   R   t   evp_pkey(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_rsa_private_key|  s    	c         C` s&   | d k o% | d @d k o% | d k S(   Ni   i   i    i   (    (   Rt   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt!   generate_rsa_parameters_supported  s    c      	   C` s  t  j | j | j | j | j | j | j | j j	 | j j
  |  j j   } |  j | |  j j k  |  j j | |  j j  } |  j | j  } |  j | j  } |  j | j  } |  j | j  } |  j | j  } |  j | j  } |  j | j j	  }	 |  j | j j
  }
 |  j j | | |  } |  j | d k  |  j j | |
 |	 |  } |  j | d k  |  j j | | | |  } |  j | d k  |  j j | |  j j  } |  j | d k  |  j |  } t |  | |  S(   Ni   (   RH   t   _check_private_key_componentst   pt   qt   dt   dmp1t   dmq1t   iqmpt   public_numbersR   t   nRk   R   Rx   Ri   R{   R   R   R   t   RSA_set0_factorst   RSA_set0_keyt   RSA_set0_crt_paramst   RSA_blinding_onR   R8   (   Rt   t   numbersR   R   R   R   R   R   R   R   R   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_rsa_private_numbers  s<    	c         C` s   t  j | j | j  |  j j   } |  j | |  j j k  |  j j	 | |  j j
  } |  j | j  } |  j | j  } |  j j | | | |  j j  } |  j | d k  |  j |  } t |  | |  S(   Ni   (   RH   t   _check_public_key_componentsR   R   Rk   R   Rx   Ri   R{   R   R   R   R   R   R9   (   Rt   R  R   R   R   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_rsa_public_numbers  s    !c         C` sG   |  j  j   } |  j | |  j j k  |  j j | |  j  j  } | S(   N(   Rk   t   EVP_PKEY_newRx   Ri   R{   R   t   EVP_PKEY_free(   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _create_evp_pkey_gc  s    c         C` s8   |  j    } |  j j | |  } |  j | d k  | S(   Ni   (   R  Rk   t   EVP_PKEY_set1_RSARx   (   Rt   R   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR     s    c         C` sh   |  j  j |  } |  j j | t |   } |  j | |  j  j k  t |  j  j | |  j j	  |  S(   s   
        Return a _MemoryBIO namedtuple of (BIO, char*).

        The char* is the storage for the BIO and it must stay alive until the
        BIO is finished with.
        (
   Ri   R   Rk   t   BIO_new_mem_bufR   Rx   R{   Ra   R   t   BIO_free(   Rt   t   datat   data_ptrRb   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _bytes_to_bio  s
    	c         C` sr   |  j  j   } |  j | |  j j k  |  j  j |  } |  j | |  j j k  |  j j | |  j  j  } | S(   s.   
        Creates an empty memory BIO.
        (   Rk   t	   BIO_s_memRx   Ri   R{   t   BIO_newR   R  (   Rt   t
   bio_methodRb   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _create_mem_bio_gc  s    c         C` su   |  j  j d  } |  j j | |  } |  j | d k  |  j | d |  j  j k  |  j  j | d |  } | S(   sE   
        Reads a memory BIO. This only works on memory BIOs.
        s   char **i    (   Ri   R   Rk   t   BIO_get_mem_dataRx   R{   R   (   Rt   Rb   R   t   buf_lent   bio_data(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _read_mem_bio  s    c         C` s_  |  j  j |  } | |  j  j k rz |  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t	 |  | |  S| |  j  j
 k r |  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t |  | |  S| |  j  j k rJ|  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t |  | |  S| |  j k r|  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t |  | |  S| t |  j  d d  k rt |  |  S| t |  j  d d  k rt |  |  S| t |  j  d d  k r't |  |  S| t |  j  d d  k rOt |  |  St d   d S(   sd   
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        t   EVP_PKEY_ED25519t   EVP_PKEY_X448t   EVP_PKEY_X25519t   EVP_PKEY_ED448s   Unsupported key type.N(   Rk   t   EVP_PKEY_idt   EVP_PKEY_RSAt   EVP_PKEY_get1_RSARx   Ri   R{   R   R   R8   t   EVP_PKEY_DSAt   EVP_PKEY_get1_DSAt   DSA_freeR    t   EVP_PKEY_ECt   EVP_PKEY_get1_EC_KEYt   EC_KEY_freeR"   Rp   t   EVP_PKEY_get1_DHt   DH_freeR   t   getattrR   R$   R<   R:   R'   R   (   Rt   R   t   key_typeR   t	   dsa_cdatat   ec_cdatat   dh_cdata(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _evp_pkey_to_private_key  s<    c         C` s_  |  j  j |  } | |  j  j k rz |  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t	 |  | |  S| |  j  j
 k r |  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t |  | |  S| |  j  j k rJ|  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t |  | |  S| |  j k r|  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t |  | |  S| t |  j  d d  k rt |  |  S| t |  j  d d  k rt |  |  S| t |  j  d d  k r't |  |  S| t |  j  d d  k rOt |  |  St d   d S(   sc   
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        R  R  R  R  s   Unsupported key type.N(   Rk   R  R  R  Rx   Ri   R{   R   R   R9   R  R  R   R!   R!  R"  R#  R#   Rp   R$  R%  R   R&  R   R%   R=   R;   R(   R   (   Rt   R   R'  R   R(  R)  R*  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _evp_pkey_to_public_key  s<    c         C` sK   |  j  j r7 t | t j t j t j t j t j f  St | t j  Sd  S(   N(	   Rk   t   Cryptography_HAS_RSA_OAEP_MDt
   isinstanceRC   t   SHA1t   SHA224t   SHA256t   SHA384t   SHA512(   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _oaep_hash_supportedH  s    c         C` s   t  | t  r t St  | t  rG t  | j t  rG |  j | j j  St  | t  r t  | j t  r |  j	 | j j  o |  j	 | j  o | j
 d  k p t | j
  d k p |  j j d k St Sd  S(   Ni    i   (   R.  RK   t   TrueRL   t   _mgfRI   R   t
   _algorithmRJ   R4  t   _labelR   R   Rk   t   Cryptography_HAS_RSA_OAEP_LABELR   (   Rt   t   padding(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   rsa_padding_supportedV  s    !!$c         C` s   | d k r t  d   n  |  j j   } |  j | |  j j k  |  j j | |  j j  } |  j j | | |  j j d |  j j |  j j |  j j  } |  j | d k  t	 |  |  S(   Ni   i   i   s+   Key size must be 1024 or 2048 or 3072 bits.i    i   (   i   i   i   (
   R   Rk   t   DSA_newRx   Ri   R{   R   R   t   DSA_generate_parameters_exR   (   Rt   R   t   ctxR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dsa_parametersg  s    	!c         C` sx   |  j  j | j  } |  j | |  j j k  |  j j | |  j  j  } |  j  j |  |  j	 |  } t
 |  | |  S(   N(   Rk   t   DSAparams_dupt
   _dsa_cdataRx   Ri   R{   R   R   t   DSA_generate_keyt   _dsa_cdata_to_evp_pkeyR    (   Rt   t
   parametersR>  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dsa_private_keyx  s    c         C` s   |  j  |  } |  j |  S(   N(   R?  RE  (   Rt   R   RD  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt'   generate_dsa_private_key_and_parameters  s    c         C` s]   |  j  j | | | |  } |  j | d k  |  j  j | | |  } |  j | d k  d  S(   Ni   (   Rk   t   DSA_set0_pqgRx   t   DSA_set0_key(   Rt   R(  R   R   t   gt   pub_keyt   priv_keyR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _dsa_cdata_set_values  s    c   
      C` s   t  j |  | j j } |  j j   } |  j | |  j j k  |  j j	 | |  j j
  } |  j | j  } |  j | j  } |  j | j  } |  j | j j  } |  j | j  } |  j | | | | | |  |  j |  }	 t |  | |	  S(   N(   RE   t   _check_dsa_private_numbersR   t   parameter_numbersRk   R<  Rx   Ri   R{   R   R   R   R   R   RI  t   yt   xRL  RC  R    (
   Rt   R  RN  R(  R   R   RI  RJ  RK  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_dsa_private_numbers  s    c   	      C` s   t  j | j  |  j j   } |  j | |  j j k  |  j j | |  j j	  } |  j
 | j j  } |  j
 | j j  } |  j
 | j j  } |  j
 | j  } |  j j } |  j | | | | | |  |  j |  } t |  | |  S(   N(   RE   t   _check_dsa_parametersRN  Rk   R<  Rx   Ri   R{   R   R   R   R   R   RI  RO  RL  RC  R!   (	   Rt   R  R(  R   R   RI  RJ  RK  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_dsa_public_numbers  s    c         C` s   t  j |  |  j j   } |  j | |  j j k  |  j j | |  j j  } |  j	 | j
  } |  j	 | j  } |  j	 | j  } |  j j | | | |  } |  j | d k  t |  |  S(   Ni   (   RE   RR  Rk   R<  Rx   Ri   R{   R   R   R   R   R   RI  RG  R   (   Rt   R  R(  R   R   RI  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_dsa_parameter_numbers  s    c         C` s8   |  j    } |  j j | |  } |  j | d k  | S(   Ni   (   R  Rk   t   EVP_PKEY_set1_DSARx   (   Rt   R(  R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyRC    s    c         C` s   |  j  |  S(   N(   R   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   dsa_hash_supported  s    c         C` s   t  S(   N(   R5  (   Rt   R   R   RI  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   dsa_parameters_supported  s    c         C` s   |  j  | t d | j   S(   Ns    (   R   RV   t
   block_size(   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   cmac_algorithm_supported  s    c         C` s   t  |  |  S(   N(   R   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_cmac_ctx  s    c   
      ` sZ  t  | t j  s! t d   n  t  | t j  rU t  | t j  rU t d   n    j |  }   j	 j
   }   j |   j j k    j j |   j	 j  }   j	 j | t j j j  }   j | d k    j	 j | t   | j   }   j | d k  | j   }   j	 j | | j  }   j | d k    j	 j   }   j |   j j k    j j |   f d    }   j d | j d t d | d   j	 j d	 t     j	 j! | |  }   j | d k    j	 j" | | j |  } | d
 k rM  j#   }	   j |	 d
 j$   j	 j%   j	 j&   t d   n  t'   |  S(   Ns.   Algorithm must be a registered hash algorithm.s5   MD5 is not a supported hash algorithm for EC/DSA CSRsi   c         ` s(     j  j |    j j   j  j d   S(   Nt   X509_EXTENSION_free(   Rk   t   sk_X509_EXTENSION_pop_freeRi   t	   addressoft   _original_lib(   RP  (   Rt   (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   <lambda>  s   	t
   extensionst   handlerst   x509_objt   add_funcR   i    s   Digest too big for RSA key((   R.  RC   t   HashAlgorithmt	   TypeErrort   MD5RH   t   RSAPrivateKeyR   R   Rk   t   X509_REQ_newRx   Ri   R{   R   t   X509_REQ_freet   X509_REQ_set_versionR   t   Versiont   v1t   valuet   X509_REQ_set_subject_nameR0   t   _subject_namet
   public_keyt   X509_REQ_set_pubkeyt	   _evp_pkeyt   sk_X509_EXTENSION_new_nullt   _create_x509_extensionst   _extensionsR+   t   sk_X509_EXTENSION_insertR   t   X509_REQ_add_extensionst   X509_REQ_signR   t   _lib_reason_matcht   ERR_LIB_RSAt    RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYR@   (
   Rt   t   buildert   private_keyR   R   t   x509_reqR   Rp  t   sk_extensiont   errors(    (   Rt   sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_csr  sT    						
	c   	      C` s  t  | t j  s! t d   n  t  | t j  sB t d   n  t  | t j  rv t  | t j  rv t	 d   n  |  j
 |  } |  j j   } |  j j | t j j  } |  j j | | j j  } |  j | d k  |  j j | t |  | j   } |  j | d k  |  j j | | j j  } |  j | d k  t |  | j  } |  j j | |  } |  j | d k  |  j |  j j |  | j   |  j |  j j! |  | j"  |  j# d | j$ d t% d | d |  j j& d	 t'  |  j j( | t |  | j)   } |  j | d k  |  j j* | | j |  } | d
 k r|  j+   } |  j | d
 j, |  j j- |  j j.   t	 d   n  t/ |  |  S(   Ns   Builder type mismatch.s.   Algorithm must be a registered hash algorithm.s=   MD5 is not a supported hash algorithm for EC/DSA certificatesi   R`  Ra  Rb  Rc  R   i    s   Digest too big for RSA key(0   R.  R   t   CertificateBuilderRe  RC   Rd  Rf  RH   Rg  R   R   Rk   t   X509_newRi   R   t   backendt	   X509_freet   X509_set_versiont   _versionRm  Rx   t   X509_set_subject_nameR0   Ro  t   X509_set_pubkeyt   _public_keyRr  R.   t   _serial_numbert   X509_set_serialNumbert   _set_asn1_timet   X509_get_notBeforet   _not_valid_beforet   X509_get_notAftert   _not_valid_afterRt  Ru  R+   t   X509_add_extR5  t   X509_set_issuer_namet   _issuer_namet	   X509_signR   Ry  Rz  R{  R>   (	   Rt   R|  R}  R   R   t	   x509_certR   t   serial_numberR  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_certificate  sZ    						
	c         C` sn   | j  d k r* | j d  j d  } n | j d  j d  } |  j j | |  } |  j | d k  d  S(   Ni  s   %Y%m%d%H%M%SZR   s   %y%m%d%H%M%SZi   (   t   yeart   strftimeR   Rk   t   ASN1_TIME_set_stringRx   (   Rt   t	   asn1_timet   timet   asn1_strR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR  q  s
    c         C` sW   |  j  j   } |  j | |  j j k  |  j j | |  j  j  } |  j | |  | S(   N(   Rk   t   ASN1_TIME_newRx   Ri   R{   R   t   ASN1_TIME_freeR  (   Rt   R  R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _create_asn1_timey  s
    c         C` s  t  | t j  s! t d   n  t  | t j  sB t d   n  t  | t j  rv t  | t j  rv t	 d   n  |  j
 |  } |  j j   } |  j j | t j j  } |  j j | d  } |  j | d k  |  j j | t |  | j   } |  j | d k  |  j | j  } |  j j | |  } |  j | d k  |  j | j  } |  j j | |  } |  j | d k  |  j d | j d t d | d |  j j d	 t  xg | j  D]\ }	 |  j j! |	 j"  }
 |  j |
 |  j j# k  |  j j$ | |
  } |  j | d k  qW|  j j% | | j& |  } | d
 k r|  j'   } |  j | d
 j( |  j j) |  j j*   t	 d   n  t+ |  |  S(   Ns   Builder type mismatch.s.   Algorithm must be a registered hash algorithm.s5   MD5 is not a supported hash algorithm for EC/DSA CRLsi   R`  Ra  Rb  Rc  R   i    s   Digest too big for RSA key(,   R.  R   t    CertificateRevocationListBuilderRe  RC   Rd  Rf  RH   Rg  R   R   Rk   t   X509_CRL_newRi   R   R  t   X509_CRL_freet   X509_CRL_set_versionRx   t   X509_CRL_set_issuer_nameR0   R  R  t   _last_updatet   X509_CRL_set_lastUpdatet   _next_updatet   X509_CRL_set_nextUpdateRt  Ru  R*   t   X509_CRL_add_extR5  t   _revoked_certificatest   Cryptography_X509_REVOKED_dupt   _x509_revokedR{   t   X509_CRL_add0_revokedt   X509_CRL_signRr  R   Ry  Rz  R{  R?   (   Rt   R|  R}  R   R   t   x509_crlR   t   last_updatet   next_updatet   revoked_certt   revokedR  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_crl  sX    					
	c   
      C` s   x t  |  D] \ } } |  j | |  } |  j | |  j j k  | rh |  j j | |  j j  } n  | | | |  }	 |  j |	 d k  q Wd  S(   Ni   (   t	   enumeratet   _create_x509_extensionRx   Ri   R{   R   Rk   R[  (
   Rt   R`  Ra  Rb  Rc  R   t   it	   extensiont   x509_extensionR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyRt    s    	c         C` sC   t  |  | j j  } |  j j |  j j | | j r9 d n d |  S(   Ni   i    (   R1   t   oidt   dotted_stringRk   t   X509_EXTENSION_create_by_OBJRi   R{   t   critical(   Rt   R  Rm  t   obj(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _create_raw_x509_extension  s    	c   	      C` s  t  | j t j  r: t |  | j j  } |  j | |  St  | j t j  r t g  | j D] } | j ^ q\  j   } t |  |  } |  j | |  St  | j t j	  r t
 j j   j   } t |  |  } |  j | |  Sy | | j } Wn) t k
 rt d j | j    n X| |  | j  } |  j j | j j j d   } t j | |  j j k  |  j j | | j rd n d |  Sd  S(   Ns   Extension not supported: {}R   i   i    (   R.  Rm  R   t   UnrecognizedExtensionR/   R  t
   TLSFeatureR   t   dumpt   PrecertPoisont
   asn1cryptot   coret   NullR  R   t   NotImplementedErrorR   Rk   t   OBJ_txt2nidR  R   R  Rx   t	   NID_undeft   X509V3_EXT_i2dR  (	   Rt   Ra  R  Rm  RP  t   asn1R   t
   ext_structt   nid(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR    s,    +		c         C` s  t  | t j  s! t d   n  |  j j   } |  j | |  j j k  |  j j	 | |  j j
  } t |  | j  } |  j j | |  } |  j | d k  |  j | j  } |  j j | |  } |  j | d k  |  j d | j d t d | d |  j j d t  t |  d  |  S(   Ns   Builder type mismatch.i   R`  Ra  Rb  Rc  R   (   R.  R   t   RevokedCertificateBuilderRe  Rk   t   X509_REVOKED_newRx   Ri   R{   R   t   X509_REVOKED_freeR.   R  t   X509_REVOKED_set_serialNumberR  t   _revocation_datet   X509_REVOKED_set_revocationDateRt  Ru  R)   t   X509_REVOKED_add_extR5  RA   R   (   Rt   R|  t   x509_revokedR  R   t   rev_date(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_revoked_certificate  s&    			c         C` s   |  j  |  j j |  j | |  S(   N(   t	   _load_keyRk   t   PEM_read_bio_PrivateKeyR+  (   Rt   R  t   password(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_private_key  s
    	c         C` s5  |  j  |  } |  j j | j |  j j |  j j |  j j  } | |  j j k ry |  j j | |  j j  } |  j |  S|  j	   |  j j
 | j  } |  j | d k  |  j j | j |  j j |  j j |  j j  } | |  j j k r'|  j j | |  j j  } |  j |  } t |  | |  S|  j   d  S(   Ni   (   R  Rk   t   PEM_read_bio_PUBKEYRb   Ri   R{   R   R  R,  R   t	   BIO_resetRx   t   PEM_read_bio_RSAPublicKeyR   R   R9   t   _handle_key_loading_error(   Rt   R  t   mem_bioR   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_public_key  s     	'
	'c         C` s   |  j  |  } |  j j | j |  j j |  j j |  j j  } | |  j j k ry |  j j | |  j j  } t |  |  S|  j	   d  S(   N(
   R  Rk   t   PEM_read_bio_DHparamsRb   Ri   R{   R   R%  R   R  (   Rt   R  R  R*  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_parameters7  s    	'c         C` sW   |  j  |  } |  j | |  } | r4 |  j |  S|  j |  j j |  j | |  Sd  S(   N(   R  t"   _evp_pkey_from_der_traditional_keyR+  R  Rk   t   d2i_PKCS8PrivateKey_bio(   Rt   R  R  R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_private_keyB  s    	c         C` s|   |  j  j | j |  j j  } | |  j j k rj |  j j | |  j  j  } | d  k	 rf t d   n  | S|  j	   d  Sd  S(   Ns4   Password was given but private key is not encrypted.(
   Rk   t   d2i_PrivateKey_bioRb   Ri   R{   R   R  R   Re  R   (   Rt   R  R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR  U  s    
c         C` s  |  j  |  } |  j j | j |  j j  } | |  j j k rg |  j j | |  j j  } |  j |  S|  j	   |  j j
 | j  } |  j | d k  |  j j | j |  j j  } | |  j j k r|  j j | |  j j  } |  j |  } t |  | |  S|  j   d  S(   Ni   (   R  Rk   t   d2i_PUBKEY_bioRb   Ri   R{   R   R  R,  R   R  Rx   t   d2i_RSAPublicKey_bioR   R   R9   R  (   Rt   R  R  R   R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_public_keyc  s    
	c         C` s  |  j  |  } |  j j | j |  j j  } | |  j j k rg |  j j | |  j j  } t |  |  S|  j j	 r |  j
   |  j j | j  } |  j | d k  |  j j | j |  j j  } | |  j j k r |  j j | |  j j  } t |  |  Sn  |  j   d  S(   Ni   (   R  Rk   t   d2i_DHparams_bioRb   Ri   R{   R   R%  R   Rq   R   R  Rx   t   Cryptography_d2i_DHxparams_bioR  (   Rt   R  R  R*  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_parametersz  s     	
	c         C` s   |  j  |  } |  j j | j |  j j |  j j |  j j  } | |  j j k rj |  j   t d   n  |  j j | |  j j	  } t
 |  |  S(   Nsw   Unable to load certificate. See https://cryptography.io/en/latest/faq/#why-can-t-i-import-my-pem-file for more details.(   R  Rk   t   PEM_read_bio_X509Rb   Ri   R{   R   R   R   R  R>   (   Rt   R  R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_x509_certificate  s    	'
c         C` s   |  j  |  } |  j j | j |  j j  } | |  j j k rX |  j   t d   n  |  j j | |  j j	  } t
 |  |  S(   Ns   Unable to load certificate(   R  Rk   t   d2i_X509_bioRb   Ri   R{   R   R   R   R  R>   (   Rt   R  R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_x509_certificate  s    
c         C` s   |  j  |  } |  j j | j |  j j |  j j |  j j  } | |  j j k rj |  j   t d   n  |  j j | |  j j	  } t
 |  |  S(   Nso   Unable to load CRL. See https://cryptography.io/en/latest/faq/#why-can-t-i-import-my-pem-file for more details.(   R  Rk   t   PEM_read_bio_X509_CRLRb   Ri   R{   R   R   R   R  R?   (   Rt   R  R  R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_x509_crl  s    	'
c         C` s   |  j  |  } |  j j | j |  j j  } | |  j j k rX |  j   t d   n  |  j j | |  j j	  } t
 |  |  S(   Ns   Unable to load CRL(   R  Rk   t   d2i_X509_CRL_bioRb   Ri   R{   R   R   R   R  R?   (   Rt   R  R  R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_x509_crl  s    
c         C` s   |  j  |  } |  j j | j |  j j |  j j |  j j  } | |  j j k rj |  j   t d   n  |  j j | |  j j	  } t
 |  |  S(   Nss   Unable to load request. See https://cryptography.io/en/latest/faq/#why-can-t-i-import-my-pem-file for more details.(   R  Rk   t   PEM_read_bio_X509_REQRb   Ri   R{   R   R   R   Ri  R@   (   Rt   R  R  R~  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_x509_csr  s    	'
c         C` s   |  j  |  } |  j j | j |  j j  } | |  j j k rX |  j   t d   n  |  j j | |  j j	  } t
 |  |  S(   Ns   Unable to load request(   R  Rk   t   d2i_X509_REQ_bioRb   Ri   R{   R   R   R   Ri  R@   (   Rt   R  R  R~  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_x509_csr  s    
c   
      C` s  |  j  |  } |  j j d  } | d  k	 rj t j d |  |  j j |  } | | _ t |  | _	 n  | | j
 |  j j |  j j |  j j d  |  } | |  j j k r6| j d k r)|  j   }	 |  j |	  | j d k r t d   q3| j d k s
t  t d j | j d	    q6|  j   n  |  j j | |  j j  } | d  k	 r{| j d k r{t d
   n  | d  k	 r| j d	 k s| d  k st  | |  S(   Ns   CRYPTOGRAPHY_PASSWORD_DATA *R  t   Cryptography_pem_password_cbi    is3   Password was not given but private key is encryptedisA   Passwords longer than {} bytes are not supported by this backend.i   s4   Password was given but private key is not encrypted.(   R  Ri   R   R   R   t   _check_byteslikeR   R  R   R   Rb   R{   R]  Rk   R^  t   errorR   Rx   Re  R   R   R   t   maxsizeR  R   R  t   called(
   Rt   t   openssl_read_funct   convert_funcR  R  R  t   userdatat   password_ptrR   R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR    s@    				c         ` s<    j    } | s! t d   n| d j   j j   j j  se | d j   j j   j j  rt t d   n | d j   j j   j j  s | d j   j j	   j j
  r t d t j   nk t   f d   | D  r t d   n@ | d j   j j   j j	   j j f k s,t  t d   d  S(   Ns   Could not deserialize key data.i    s    Bad decrypt. Incorrect password?s0   PEM data is encrypted with an unsupported cipherc         3` s-   |  ]# } | j    j j   j j  Vq d  S(   N(   Ry  Rk   t   ERR_LIB_EVPt'   EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM(   t   .0R  (   Rt   (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pys	   <genexpr>)  s   s!   Unsupported public key algorithm.(   R   R   Ry  Rk   R  t   EVP_R_BAD_DECRYPTt   ERR_LIB_PKCS12t!   PKCS12_R_PKCS12_CIPHERFINAL_ERRORt   EVP_R_UNKNOWN_PBE_ALGORITHMt   ERR_LIB_PEMt   PEM_R_UNSUPPORTED_ENCRYPTIONR   R   t   UNSUPPORTED_CIPHERt   anyRj   t   ERR_LIB_ASN1R   (   Rt   R  (    (   Rt   sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR    s2    

	


		c         C` s   y |  j  |  } Wn t k
 r2 |  j j } n X|  j j |  } | |  j j k r |  j   } |  j | |  j j k p | d j	 |  j j
 |  j j   t S|  j | |  j j k  |  j j |  t Sd  S(   Ni    (   t   _elliptic_curve_to_nidR   Rk   R  t   EC_GROUP_new_by_curve_nameRi   R{   R   Rx   Ry  t
   ERR_LIB_ECt   EC_R_UNKNOWN_GROUPR   t   EC_GROUP_freeR5  (   Rt   t   curvet	   curve_nidt   groupR  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   elliptic_curve_supported9  s     
	c         C` s#   t  | t j  s t S|  j |  S(   N(   R.  RF   t   ECDSAR   R  (   Rt   t   signature_algorithmR  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt,   elliptic_curve_signature_algorithm_supportedP  s    c         C` s   |  j  |  rb |  j |  } |  j j |  } |  j | d k  |  j |  } t |  | |  St d j | j	  t
 j   d S(   s@   
        Generate a new private key on the named curve.
        i   s#   Backend object does not support {}.N(   R  t   _ec_key_new_by_curveRk   t   EC_KEY_generate_keyRx   t   _ec_cdata_to_evp_pkeyR"   R   R   R   R   t   UNSUPPORTED_ELLIPTIC_CURVE(   Rt   R  R)  R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt#   generate_elliptic_curve_private_keyY  s    c         C` s   | j  } |  j | j  } |  j j |  j | j  |  j j  } |  j j	 | |  } |  j
 | d k  |  j | | j | j  } |  j |  } t |  | |  S(   Ni   (   R   R  R  Ri   R   R   t   private_valueRk   t   BN_clear_freet   EC_KEY_set_private_keyRx   t)   _ec_key_set_public_key_affine_coordinatesRP  RO  R  R"   (   Rt   R  t   publicR)  R"  R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt#   load_elliptic_curve_private_numbersm  s    		c         C` sL   |  j  | j  } |  j | | j | j  } |  j |  } t |  | |  S(   N(   R  R  R%  RP  RO  R  R#   (   Rt   R  R)  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt"   load_elliptic_curve_public_numbers  s
    c   	   
   C` s%  |  j  |  } |  j j |  } |  j | |  j j k  |  j j |  } |  j | |  j j k  |  j j | |  j j  } |  j	   P } |  j j
 | | | t |  |  } | d k r |  j   t d   n  Wd  QX|  j j | |  } |  j | d k  |  j |  } t |  | |  S(   Ni   s(   Invalid public bytes for the given curve(   R  Rk   t   EC_KEY_get0_groupRx   Ri   R{   t   EC_POINT_newR   t   EC_POINT_freet   _tmp_bn_ctxt   EC_POINT_oct2pointR   R   R   t   EC_KEY_set_public_keyR  R#   (	   Rt   R  t   point_bytesR)  R  t   pointt   bn_ctxR   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt    load_elliptic_curve_public_bytes  s     	
c         C` s  |  j  |  } |  j |  \ } } |  j j |  } |  j | |  j j k  |  j j | |  j j  } |  j	 |  } |  j j | |  j j
  } |  j    } |  j j | | | |  j j |  j j |  }	 |  j |	 d k  |  j j |  }
 |  j j |  } | | | |
 | |  }	 |  j |	 d k  Wd  QX|  j j | |  }	 |  j |	 d k  |  j	 |  } |  j j | |  j j
  } |  j j | |  }	 |  j |	 d k  |  j |  } t |  | |  S(   Ni   (   R  t    _ec_key_determine_group_get_funcRk   R*  Rx   Ri   R{   R   R+  R   R#  R,  t   EC_POINT_mult
   BN_CTX_getR.  R$  R  R"   (   Rt   R"  R  R)  t   get_funcR  R0  Rm  R1  R   t   bn_xt   bn_yt   privateR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt!   derive_elliptic_curve_private_key  s.    c         C` sS   |  j  |  } |  j j |  } |  j | |  j j k  |  j j | |  j j  S(   N(   R  Rk   t   EC_KEY_new_by_curve_nameRx   Ri   R{   R   R#  (   Rt   R  R  R)  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR    s    c         C` s   |  j  |  } |  j j | j |  j j  } | |  j j k rX |  j   t d   n  |  j j | |  j j	  } t
 |  |  S(   Ns   Unable to load OCSP request(   R  Rk   t   d2i_OCSP_REQUEST_bioRb   Ri   R{   R   R   R   t   OCSP_REQUEST_freeR4   (   Rt   R  R  t   request(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_ocsp_request  s    
c         C` s   |  j  |  } |  j j | j |  j j  } | |  j j k rX |  j   t d   n  |  j j | |  j j	  } t
 |  |  S(   Ns   Unable to load OCSP response(   R  Rk   t   d2i_OCSP_RESPONSE_bioRb   Ri   R{   R   R   R   t   OCSP_RESPONSE_freeR5   (   Rt   R  R  t   response(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_ocsp_response  s    
c   	      C` s  |  j  j   } |  j | |  j j k  |  j j | |  j  j  } | j \ } } } |  j |  } |  j  j	 | | j
 | j
  } |  j | |  j j k  |  j  j | |  } |  j | |  j j k  |  j d | j d t d | d |  j  j d t  t |  |  S(   NR`  Ra  Rb  Rc  R   (   Rk   t   OCSP_REQUEST_newRx   Ri   R{   R   R=  t   _requestR   t   OCSP_cert_to_idt   _x509t   OCSP_request_add0_idRt  Ru  R-   t   OCSP_REQUEST_add_extR5  R4   (	   Rt   R|  t   ocsp_reqt   certt   issuerR   R   t   certidt   onereq(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_ocsp_request  s"    			c         C` s  |  j  j   } |  j | |  j j k  |  j j | |  j  j  } |  j | j j	  } |  j  j
 | | j j j | j j j  } |  j | |  j j k  |  j j | |  j  j  } | j j d  k r d } n t | j j } | j j d  k r|  j j } n |  j | j j  } |  j j }	 | j j d  k	 rM|  j | j j  }	 n  |  j | j j  }
 |  j  j | | | j j j | | |
 |	  } |  j | |  j j k  |  j |  } | j \ } } |  j  j } | t j j k r| |  j  j O} n  | j d  k	 rHx? | j D]1 } |  j  j  | | j  } |  j | d k  qWn  |  j! d | j" d t# d | d |  j  j$ d t%  |  j  j& | | j | j' | |  j j |  } | d k r|  j(   } |  j | d j) |  j  j* |  j  j+   t, d	   n  | S(
   Nii   R`  Ra  Rb  Rc  R   i    s,   responder_cert must be signed by private_key(-   Rk   t   OCSP_BASICRESP_newRx   Ri   R{   R   t   OCSP_BASICRESP_freeR   t	   _responseR7  RF  t   _certRG  t   _issuert   OCSP_CERTID_freet   _revocation_reasonR   R   t   _revocation_timeR  R  t   _this_updatet   OCSP_basic_add1_statust   _cert_statusRm  t   _responder_idt   OCSP_NOCERTSR`   t   OCSPResponderEncodingt   HASHt   OCSP_RESPID_KEYt   _certst   OCSP_basic_add1_certRt  Ru  R,   t   OCSP_BASICRESP_add_extR5  t   OCSP_basic_signRr  R   Ry  t   ERR_LIB_X509t   X509_R_KEY_VALUES_MISMATCHR   (   Rt   R|  R}  R   t   basicR   RM  t   reasont   rev_timeR  t   this_updateR   t   responder_certt   responder_encodingt   flagsRK  R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _create_ocsp_basic_response  st    							
	c         C` s   | t  j j k r* |  j | | |  } n |  j j } |  j j | j |  } |  j	 | |  j j k  |  j j
 | |  j j  } t |  |  S(   N(   R`   t   OCSPResponseStatust
   SUCCESSFULRm  Ri   R{   Rk   t   OCSP_response_createRm  Rx   R   RA  R5   (   Rt   t   response_statusR|  R}  R   Rf  t	   ocsp_resp(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_ocsp_response<  s    	c         C` s   |  j  |  o t | t j  S(   N(   R  R.  RF   t   ECDH(   Rt   R   R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt+   elliptic_curve_exchange_algorithm_supportedL  s    c         C` s8   |  j    } |  j j | |  } |  j | d k  | S(   Ni   (   R  Rk   t   EVP_PKEY_set1_EC_KEYRx   (   Rt   R)  R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR  R  s    c         C` s{   i d d 6d d 6} | j  | j | j  } |  j j | j    } | |  j j k rw t d j | j  t j	   n  | S(   s/   
        Get the NID for a curve name.
        t
   prime192v1t	   secp192r1t
   prime256v1t	   secp256r1s$   {} is not a supported elliptic curve(
   t   getR   Rk   t
   OBJ_sn2nidR   R  R   R   R   R   (   Rt   R  t   curve_aliasest
   curve_nameR  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR  X  s    
c         c` st   |  j  j   } |  j | |  j j k  |  j j | |  j  j  } |  j  j |  z	 | VWd  |  j  j |  Xd  S(   N(	   Rk   t
   BN_CTX_newRx   Ri   R{   R   t   BN_CTX_freet   BN_CTX_startt
   BN_CTX_end(   Rt   R1  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR,  l  s    	c         C` s  |  j  | |  j j k  |  j j d  } |  j  | |  j j k  |  j j |  } |  j  | |  j j k  |  j j |  } |  j  | |  j j k  |  j j |  } |  j  | |  j j k  | | k r |  j j	 r |  j j
 } n |  j j } | st  | | f S(   su   
        Given an EC_KEY determine the group and what function is required to
        get point coordinates.
        s   characteristic-two-field(   Rx   Ri   R{   Rk   R|  R  R)  t   EC_GROUP_method_oft   EC_METHOD_get_field_typet   Cryptography_HAS_EC2Mt$   EC_POINT_get_affine_coordinates_GF2mt#   EC_POINT_get_affine_coordinates_GFpR   (   Rt   R>  t   nid_two_fieldR  t   methodR  R6  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR3  w  s    c         C` s   | d k  s | d k  r' t  d   n  |  j j |  j |  |  j j  } |  j j |  j |  |  j j  } |  j j | | |  } | d k r |  j   t  d   n  | S(   sg   
        Sets the public key point in the EC_KEY context to the affine x and y
        values.
        i    s2   Invalid EC key. Both x and y must be non-negative.i   s   Invalid EC key.(   R   Ri   R   R   Rk   R   t(   EC_KEY_set_public_key_affine_coordinatesR   (   Rt   R>  RP  RO  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR%    s    $$
c         C` s  t  | t j  s! t d   n  | t j j k rB t d   n  | t j j k rc t d   n  | t j j k r t d   n  t  | t j  s t d   n  t  | t j	  r d } d } |  j
 j } nc t  | t j  r)|  j j d  } | j } t |  } | d	 k r5t d
   q5n t d   |  j j |  }	 | t j j k r| t j j k r|  j j }
 | } q| t j j k st  |	 |  j j k r|  j j }
 nE |	 |  j j k r|  j j }
 n$ |	 |  j j k st  |  j j }
 | } n | t j j k r| t j j k r\t  | t j	  sLt d   n  |  j |	 |  S| t j j k stt  |  j j }
 | } n t d   |  j    } |
 | | | | | |  j
 j |  j
 j  } |  j! | d k  |  j" |  S(   Ns2   format must be an item from the PrivateFormat enums-   X9.62 format is only valid for EC public keyss/   raw format is invalid with this key or encodings/   raw encoding is invalid with this key or formatsB   Encryption algorithm must be a KeySerializationEncryption instancet    i    s   aes-256-cbci  sB   Passwords longer than 1023 bytes are not supported by this backends   Unsupported encryption typesD   Encryption is not supported for DER encoded traditional OpenSSL keyss-   encoding must be Encoding.PEM or Encoding.DERi   (#   R.  RD   t   PrivateFormatRe  t   Encodingt   X962R   t   Rawt   KeySerializationEncryptiont   NoEncryptionRi   R{   t   BestAvailableEncryptionRk   t   EVP_get_cipherbynameR  R   R  t   PEMt   PKCS8t   PEM_write_bio_PKCS8PrivateKeyt   TraditionalOpenSSLR   R  t   PEM_write_bio_RSAPrivateKeyR  t   PEM_write_bio_DSAPrivateKeyR!  t   PEM_write_bio_ECPrivateKeyt   DERt"   _private_key_bytes_traditional_dert   i2d_PKCS8PrivateKey_bioR  Rx   R  (   Rt   t   encodingR   t   encryption_algorithmR   t   cdataR  t   passlenR   R'  t	   write_bioR   Rb   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _private_key_bytes  s|    							c         C` s   | |  j  j k r! |  j  j } nF | |  j  j k rB |  j  j } n% |  j | |  j  j k  |  j  j } |  j   } | | |  } |  j | d k  |  j	 |  S(   Ni   (
   Rk   R  t   i2d_RSAPrivateKey_bioR!  t   i2d_ECPrivateKey_bioRx   R  t   i2d_DSAPrivateKey_bioR  R  (   Rt   R'  R  R  Rb   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR    s    c   	      C` s  t  | t j  s! t d   n  | t j j t j j f k rN t d   n  | t j j k ro t d   n  | t j j k r t d   n  | t j j	 k s | t j j	 k r | t j j	 k	 s | t j j	 k	 r t d   n  |  j
 |  S| t j j k rT| t j j k r'|  j j } n$ | t j j k s?t  |  j j } | } n | t j j k r|  j j |  |  j j k st  | t j j k r|  j j } n$ | t j j k st  |  j j } | } n t d   |  j   } | | |  } |  j | d k  |  j |  S(   Ns/   encoding must be an item from the Encoding enums-   Point formats are not valid for this key types/   raw format is invalid with this key or encodings/   raw encoding is invalid with this key or formats1   OpenSSH format must be used with OpenSSH encodings1   format must be an item from the PublicFormat enumi   (   R.  RD   R  Re  t   PublicFormatt   UncompressedPointt   CompressedPointR   R  t   OpenSSHt   _openssh_public_key_bytest   SubjectPublicKeyInfoR  Rk   t   PEM_write_bio_PUBKEYR  R   t   i2d_PUBKEY_biot   PKCS1R  R  t   PEM_write_bio_RSAPublicKeyt   i2d_RSAPublicKey_bioR  Rx   R  (	   Rt   R  R   R   R   R  R  Rb   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _public_key_bytes  sF    	$		c         C` s  t  | t j  rX | j   } d t j t j d  t j | j	  t j | j
   St  | t j  r | j   } | j } d t j t j d  t j | j  t j | j  t j | j  t j | j   St  | t j  r0| j t j j t j j  } d t j t j d  t j |   St  | t j  r| j   } y5 i d t j 6d t j 6d	 t j 6t | j  } Wn t  k
 rt! d
   n X| j t j j" t j j#  } d | d t j t j d |  t j |  t j |   St! d   d  S(   Ns   ssh-rsa s   ssh-rsas   ssh-dss s   ssh-dsss   ssh-ed25519 s   ssh-ed25519t   nistp256t   nistp384t   nistp521sZ   Only SECP256R1, SECP384R1, and SECP521R1 curves are supported by the SSH public key formats   ecdsa-sha2-t    s3   OpenSSH encoding is not supported for this key type($   R.  RH   t   RSAPublicKeyR   t   base64t	   b64encodeR_   t   _ssh_write_stringt   _ssh_write_mpintR   R   RE   t   DSAPublicKeyRN  R   R   RI  RO  RG   t   Ed25519PublicKeyt   public_bytesRD   R  R  R  RF   t   EllipticCurvePublicKeyt	   SECP256R1t	   SECP384R1t	   SECP521R1R   R  R   R   R  R  (   Rt   R   R   RN  t	   raw_bytesR~  R0  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR  Q  sH    			<	


	c         C` s+  | t  j j k r! t d   n  |  j j d  } |  j j | |  j j | |  j j  | t  j j	 k r | d |  j j k r |  j j
 } q |  j j } nR | t  j j k r | d |  j j k r |  j j } q |  j j } n t d   |  j   } | | |  } |  j | d k  |  j |  S(   Ns!   OpenSSH encoding is not supporteds	   BIGNUM **i    s/   encoding must be an item from the Encoding enumi   (   RD   R  R  Re  Ri   R   Rk   t   DH_get0_pqgR{   R  t   PEM_write_bio_DHxparamst   PEM_write_bio_DHparamsR  t   Cryptography_i2d_DHxparams_biot   i2d_DHparams_bioR  Rx   R  (   Rt   R  R   R  R   R  Rb   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _parameter_bytes  s*    	c         C` s   | d k  r t  d   n  | d k r6 t  d   n  |  j j   } |  j | |  j j k  |  j j | |  j j  } |  j j | | | |  j j  } |  j | d k  t	 |  |  S(   Ni   s%   DH key_size must be at least 512 bitsi   i   s   DH generator must be 2 or 5i   (   i   i   (
   R   Rk   t   DH_newRx   Ri   R{   R   R%  t   DH_generate_parameters_exR   (   Rt   t	   generatorR   t   dh_param_cdataR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dh_parameters  s    	c         C` s8   |  j    } |  j j | |  } |  j | d k  | S(   Ni   (   R  Rk   t   EVP_PKEY_set1_DHRx   (   Rt   R*  R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _dh_cdata_to_evp_pkey  s    c         C` sV   t  | j |   } |  j j |  } |  j | d k  |  j |  } t |  | |  S(   Ni   (   R   t	   _dh_cdataRk   t   DH_generate_keyRx   R  R   (   Rt   RD  t   dh_key_cdataR   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dh_private_key  s
    c         C` s   |  j  |  j | |   S(   N(   R  R  (   Rt   R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt&   generate_dh_private_key_and_parameters  s    c         C` s  | j  j } |  j j   } |  j | |  j j k  |  j j | |  j j  } |  j	 | j
  } |  j	 | j  } | j d  k	 r |  j	 | j  } n |  j j } |  j	 | j  j  } |  j	 | j  } |  j j | | | |  }	 |  j |	 d k  |  j j | | |  }	 |  j |	 d k  |  j j d d  }
 |  j j | |
  }	 |  j |	 d k  |
 d d k r| j d k o|
 d |  j j Ad k rt d   n  |  j |  } t |  | |  S(   Ni   s   int[]i    i   s.   DH private numbers did not pass safety checks.(   R   RN  Rk   R  Rx   Ri   R{   R   R%  R   R   RI  R   R   RO  RP  t   DH_set0_pqgt   DH_set0_keyR   t   Cryptography_DH_checkt   DH_NOT_SUITABLE_GENERATORR   R  R   (   Rt   R  RN  R*  R   RI  R   RJ  RK  R   t   codesR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_dh_private_numbers  s2    
c   
      C` s0  |  j  j   } |  j | |  j j k  |  j j | |  j  j  } | j } |  j | j	  } |  j | j
  } | j d  k	 r |  j | j  } n |  j j } |  j | j  } |  j  j | | | |  } |  j | d k  |  j  j | | |  j j  } |  j | d k  |  j |  }	 t |  | |	  S(   Ni   (   Rk   R  Rx   Ri   R{   R   R%  RN  R   R   RI  R   R   RO  R  R  R  R   (
   Rt   R  R*  RN  R   RI  R   RJ  R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_dh_public_numbers  s     	c         C` s   |  j  j   } |  j | |  j j k  |  j j | |  j  j  } |  j | j  } |  j | j	  } | j
 d  k	 r |  j | j
  } n |  j j } |  j  j | | | |  } |  j | d k  t |  |  S(   Ni   (   Rk   R  Rx   Ri   R{   R   R%  R   R   RI  R   R   R  R   (   Rt   R  R*  R   RI  R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_dh_parameter_numbers  s    c         C` s  |  j  j   } |  j | |  j j k  |  j j | |  j  j  } |  j |  } |  j |  } | d  k	 r |  j |  } n |  j j } |  j  j	 | | | |  } |  j | d k  |  j j
 d d  } |  j  j | |  } |  j | d k  | d d k S(   Ni   s   int[]i    (   Rk   R  Rx   Ri   R{   R   R%  R   R   R  R   R  (   Rt   R   RI  R   R*  R   R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   dh_parameters_supported*  s    c         C` s   |  j  j d k S(   Ni   (   Rk   Rq   (   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   dh_x942_serialization_supported@  s    c         ` s   t    |  }   j j d  }   j j | |  }   j | d   j j k    j j |   f d    }   j | d k    j j | d |  S(   Ns   unsigned char **i    c         ` s     j  j |  d  S(   Ni    (   Rk   R   (   t   pointer(   Rt   (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR_  I  R  (	   R0   Ri   R   Rk   t   i2d_X509_NAMERx   R{   R   R   (   Rt   R   t	   x509_namet   ppR   (    (   Rt   sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x509_name_bytesC  s    	c         C` s   t  |  d k r! t d   n  |  j   } |  j j | |  j j  } t j | d k  |  j j | | t  |   } t j | d k  t	 |  |  S(   Ni    s%   An X25519 public key is 32 bytes longi   (
   R   R   R  Rk   t   EVP_PKEY_set_typet
   NID_X25519R  Rx   t   EVP_PKEY_set1_tls_encodedpointR;   (   Rt   R  R   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x25519_load_public_bytesN  s    	c         C` s   t  |  d k r! t d   n  d } |  j d  K } | | d d +| | d )|  j |  } t j j | j |  j j	  } Wd  QX|  j
 | |  j j	 k  |  j j | |  j j  } |  j
 |  j j |  |  j j k  t |  |  S(   Ni    s&   An X25519 private key is 32 bytes longs   0. 0+en" i0   i    i   (   R   R   t   _zeroed_bytearrayR  R  Rk   R  Rb   Ri   R{   Rx   R   R  R  R  R:   (   Rt   R  t   pkcs8_prefixt   baRb   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x25519_load_private_bytes]  s    
$c         C` s   |  j  j | |  j j  } |  j | |  j j k  |  j j | |  j  j  } |  j  j |  } |  j | d k  |  j j d  } |  j  j	 | |  } |  j | d k  |  j | d |  j j k  |  j j | d |  j  j
  } | S(   Ni   s   EVP_PKEY **i    (   Rk   t   EVP_PKEY_CTX_new_idRi   R{   Rx   R   t   EVP_PKEY_CTX_freet   EVP_PKEY_keygen_initR   t   EVP_PKEY_keygenR  (   Rt   R  t   evp_pkey_ctxR   t	   evp_ppkeyR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _evp_pkey_keygen_gc  s    c         C` s"   |  j  |  j j  } t |  |  S(   N(   R  Rk   R  R:   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x25519_generate_key  s    c         C` s
   |  j  j S(   N(   Rk   t#   CRYPTOGRAPHY_OPENSSL_110_OR_GREATER(   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x25519_supported  s    c         C` s   t  |  d k r! t d   n  |  j j |  j j |  j j | t  |   } |  j | |  j j k  |  j j | |  j j	  } t
 |  |  S(   Ni8   s#   An X448 public key is 56 bytes long(   R   R   Rk   t   EVP_PKEY_new_raw_public_keyt   NID_X448Ri   R{   Rx   R   R  R=   (   Rt   R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x448_load_public_bytes  s    	$c         C` s   t  |  d k r! t d   n  |  j j |  } |  j j |  j j |  j j | t  |   } |  j | |  j j k  |  j j	 | |  j j
  } t |  |  S(   Ni8   s$   An X448 private key is 56 bytes long(   R   R   Ri   R   Rk   t   EVP_PKEY_new_raw_private_keyR  R{   Rx   R   R  R<   (   Rt   R  R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x448_load_private_bytes  s    	$c         C` s"   |  j  |  j j  } t |  |  S(   N(   R  Rk   R  R<   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x448_generate_key  s    c         C` s   |  j  j S(   N(   Rk   t"   CRYPTOGRAPHY_OPENSSL_LESS_THAN_111(   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   x448_supported  s    c         C` s   |  j  j S(   N(   Rk   t#   CRYPTOGRAPHY_OPENSSL_LESS_THAN_111B(   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   ed25519_supported  s    c         C` s   t  j d |  t |  t j k r4 t d   n  |  j j |  j j |  j	 j
 | t |   } |  j | |  j	 j
 k  |  j	 j | |  j j  } t |  |  S(   NR  s&   An Ed25519 public key is 32 bytes long(   R   t   _check_bytesR   RG   t   _ED25519_KEY_SIZER   Rk   R  t   NID_ED25519Ri   R{   Rx   R   R  R%   (   Rt   R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   ed25519_load_public_bytes  s    	$c         C` s   t  |  t j k r$ t d   n  t j d |  |  j j |  } |  j j	 |  j j
 |  j j | t  |   } |  j | |  j j k  |  j j | |  j j  } t |  |  S(   Ns'   An Ed25519 private key is 32 bytes longR  (   R   RG   R  R   R   R  Ri   R   Rk   R  R  R{   Rx   R   R  R$   (   Rt   R  R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   ed25519_load_private_bytes  s    	$c         C` s"   |  j  |  j j  } t |  |  S(   N(   R  Rk   R  R$   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   ed25519_generate_key  s    c         C` s   |  j  j S(   N(   Rk   R  (   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   ed448_supported  s    c         C` s   t  j d |  t |  t k r1 t d   n  |  j j |  j j |  j j	 | t |   } |  j
 | |  j j	 k  |  j j | |  j j  } t |  |  S(   NR  s$   An Ed448 public key is 57 bytes long(   R   R  R   R&   R   Rk   R  t	   NID_ED448Ri   R{   Rx   R   R  R(   (   Rt   R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   ed448_load_public_bytes  s    	$c         C` s   t  j d |  t |  t k r1 t d   n  |  j j |  } |  j j |  j j	 |  j j
 | t |   } |  j | |  j j
 k  |  j j | |  j j  } t |  |  S(   NR  s%   An Ed448 private key is 57 bytes long(   R   R  R   R&   R   Ri   R   Rk   R  R  R{   Rx   R   R  R'   (   Rt   R  R  R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   ed448_load_private_bytes  s    	$c         C` s"   |  j  |  j j  } t |  |  S(   N(   R  Rk   R  R'   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   ed448_generate_key  s    c         C` s  |  j  j d |  } |  j  j |  } |  j j | t |  | t |  | | | t j | | 
 }	 |	 d k r |  j   }
 |  j j	 s |  j
 |
 d j |  j j |  j j  p |
 d j |  j j |  j j   n  d | | d } t d j |    n  |  j  j |  S(	   Ns   unsigned char[]i   i    i   i   i   sJ   Not enough memory to derive key. These parameters require {} MB of memory.i   (   Ri   R   R   Rk   t   EVP_PBE_scryptR   R^   t
   _MEM_LIMITR   R  Rx   Ry  R  t   ERR_R_MALLOC_FAILUREt   EVP_R_MEMORY_LIMIT_EXCEEDEDt   MemoryErrorR   R   (   Rt   R   R   R   R   t   rR   R   R   R   R  t
   min_memory(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   derive_scrypt  s(    	!
	
	c         C` s+   t  j |  } |  j j |  |  j j k S(   N(   R   t   _aead_cipher_nameRk   R  Ri   R{   (   Rt   R   t   cipher_name(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   aead_cipher_supported	  s    c         c` s-   t  |  } z	 | VWd |  j | |  Xd S(   s   
        This method creates a bytearray, which we copy data into (hopefully
        also from a mutable buffer that can be dynamically erased!), and then
        zero when we're done.
        N(   t	   bytearrayt
   _zero_data(   Rt   R   R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR  	  s    	c         C` s%   x t  |  D] } d | | <q Wd  S(   Ni    (   R   (   Rt   R  R   R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR  (	  s    c         c` s   | d k r |  j j Vng t |  } |  j j d | d  } |  j j | | |  z	 | VWd |  j |  j j d |  |  Xd S(   s  
        This method takes bytes, which can be a bytestring or a mutable
        buffer like a bytearray, and yields a null-terminated version of that
        data. This is required because PKCS12_parse doesn't take a length with
        its password char * and ffi.from_buffer doesn't provide null
        termination. So, to support zeroing the data via bytearray we
        need to build this ridiculous construct that copies the memory, but
        zeroes it after use.
        s   char[]i   Ns	   uint8_t *(   R   Ri   R{   R   R   t   memmoveR  t   cast(   Rt   R  t   data_lenR   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   _zeroed_null_terminated_buf/	  s    	c      
   C` s  | d  k	 r t j d |  n  |  j |  } |  j j | j |  j j  } | |  j j k rw |  j	   t
 d   n  |  j j | |  j j  } |  j j d  } |  j j d  } |  j j d  } |  j |  % } |  j j | | | | |  }	 Wd  QX|	 d k r#|  j	   t
 d   n  d  }
 d  } g  } | d |  j j k r||  j j | d |  j j  } |  j |  } n  | d |  j j k r|  j j | d |  j j  } t |  |  }
 n  | d |  j j k r|  j j | d |  j j  } |  j j | d  } xv t |  D]e } |  j j | |  } |  j j | |  j j  } |  j | |  j j k  | j t |  |   qWn  | |
 | f S(   NR  s!   Could not deserialize PKCS12 datas   EVP_PKEY **s   X509 **s   Cryptography_STACK_OF_X509 **i    s   Invalid password or PKCS12 data(   R   R   R  R  Rk   t   d2i_PKCS12_bioRb   Ri   R{   R   R   R   t   PKCS12_freeR   R  t   PKCS12_parseR  R+  R  R>   t   sk_X509_freet   sk_X509_numR   t   sk_X509_valueRx   Rr   (   Rt   R  R  Rb   t   p12t   evp_pkey_ptrt   x509_ptrt   sk_x509_ptrt   password_bufR   RK  R   t   additional_certificatesR   R   t   sk_x509R   R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt%   load_key_and_certificates_from_pkcs12F	  sF    
	
c         C` s   |  j  j d k S(   Ni   (   Rk   t   Cryptography_HAS_POLY1305(   Rt   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   poly1305_supportedt	  s    c         C` s>   t  j d |  t |  t k r1 t d   n  t |  |  S(   NR   s   A poly1305 key is 32 bytes long(   R   R  R   R6   R   R7   (   Rt   R   (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_poly1305_ctxw	  s    N(   t   __name__t
   __module__t   __doc__R   Ru   Rx   R   t
   contextlibR   R   Rn   R   R   R   R   R   R   R   R   R   R   R   Rm   R   R   R   R   R   R   R   R   R   R   R  R  R  R   R  R  R  R+  R,  R4  R;  R?  RE  RF  RL  RQ  RS  RT  RC  RV  RW  RY  RZ  R  R  R  R  R  Rt  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R!  R'  R(  R2  R:  R  R?  RC  RO  Rm  Rs  Ru  R  R  R,  R3  R%  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R   R  R  R  R  R	  R
  R  R  R  R  R  R  R*  R,  R-  (    (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyRd   ^   s  																	9									"							+	+																M	S			K													
		
		
	1	-								"		
	
		P							_		=	5				
		0						"																			.	R   c           B` s   e  Z d    Z d   Z RS(   c         C` s   | |  _  d  S(   N(   t   _fmt(   Rt   t   fmt(    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyRu   	  s    c         C` s:   |  j  j d | d |  j   } | j j | j d   S(   NR   R   R   (   R2  R   t   lowerRk   R  R   (   Rt   R  R   R   R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   __call__	  s    !(   R.  R/  Ru   R5  (    (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR   	  s   	c         C` s/   d j  | j d  } |  j j | j d   S(   Ns
   aes-{}-xtsi   R   (   R   R   Rk   R  R   (   R  R   R   R  (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyR   	  s    (   t
   __future__R    R   R   R  t   collectionsR1  R   R   t   asn1crypto.coreR  R   t	   six.movesR   t   cryptographyR   R   t   cryptography.exceptionsR   R   t'   cryptography.hazmat.backends.interfacesR	   R
   R   R   R   R   R   R   R   R   R   R   R   t$   cryptography.hazmat.backends.opensslR   t,   cryptography.hazmat.backends.openssl.ciphersR   t)   cryptography.hazmat.backends.openssl.cmacR   t0   cryptography.hazmat.backends.openssl.decode_asn1R   R   t'   cryptography.hazmat.backends.openssl.dhR   R   R   R   t(   cryptography.hazmat.backends.openssl.dsaR   R    R!   t'   cryptography.hazmat.backends.openssl.ecR"   R#   t,   cryptography.hazmat.backends.openssl.ed25519R$   R%   t*   cryptography.hazmat.backends.openssl.ed448R&   R'   R(   t0   cryptography.hazmat.backends.openssl.encode_asn1R)   R*   R+   R,   R-   R.   R/   R0   R1   t+   cryptography.hazmat.backends.openssl.hashesR2   t)   cryptography.hazmat.backends.openssl.hmacR3   t)   cryptography.hazmat.backends.openssl.ocspR4   R5   t-   cryptography.hazmat.backends.openssl.poly1305R6   R7   t(   cryptography.hazmat.backends.openssl.rsaR8   R9   t+   cryptography.hazmat.backends.openssl.x25519R:   R;   t)   cryptography.hazmat.backends.openssl.x448R<   R=   t)   cryptography.hazmat.backends.openssl.x509R>   R?   R@   RA   t$   cryptography.hazmat.bindings.opensslRB   t   cryptography.hazmat.primitivesRC   RD   t)   cryptography.hazmat.primitives.asymmetricRE   RF   RG   RH   t1   cryptography.hazmat.primitives.asymmetric.paddingRI   RJ   RK   RL   t1   cryptography.hazmat.primitives.ciphers.algorithmsRM   RN   RO   RP   RQ   RR   RS   RT   RU   t,   cryptography.hazmat.primitives.ciphers.modesRV   RW   RX   RY   RZ   R[   R\   R]   t"   cryptography.hazmat.primitives.kdfR^   t,   cryptography.hazmat.primitives.serializationR_   t   cryptography.x509R`   t
   namedtupleRa   t   register_interfacet   register_interface_ifRf   Rj   t   Cryptography_HAS_SCRYPTt   objectRd   R   R   R  (    (    (    sK   lib/python2.7/site-packages/cryptography/hazmat/backends/openssl/backend.pyt   <module>   s   X"@"""@::         		