
y;Yc           @` 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 Z d  d l	 Z	 d  d l m
 Z
 d  d l 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! 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, d  d l- m. Z. m/ Z/ d  d l0 m1 Z1 m2 Z2 m3 Z3 m4 Z4 m5 Z5 m6 Z6 m7 Z7 d  d l8 m9 Z9 d  d l: m; Z; d  d l< m= Z= m> Z> d  d l? m@ Z@ mA ZA mB ZB mC ZC d  d lD mE ZF d  d lG mH ZH d  d lI mJ ZJ mK ZK d  d lL mM ZM mN ZN mO ZO d  d lP mQ ZQ mR ZR mS ZS mT ZT d  d lU mV ZV mW ZW mX ZX mY ZY mZ ZZ m[ Z[ m\ Z\ m] Z] d  d l^ m_ Z_ m` Z` ma Za mb Zb mc Zc md Zd me Ze e jf d d d g  Zg d eh f d     YZi eH jj d d d d     Zk e jl e  e jl e  e jl e  e jl e  e jl e  e jl e  e jl e  e jl e  e jl e  e jl e  e jl e  e jl e  e jm eH jn   jo jp e  d! eh f d"     Y             Zq d# eh f d$     YZr eq   Zs d S(%   i    (   t   absolute_importt   divisiont   print_functionN(   t   contextmanager(   t   utilst   x509(   t   UnsupportedAlgorithmt   _Reasons(   t   CMACBackendt   CipherBackendt   DERSerializationBackendt	   DHBackendt
   DSABackendt   EllipticCurveBackendt   HMACBackendt   HashBackendt   PBKDF2HMACBackendt   PEMSerializationBackendt
   RSABackendt   ScryptBackendt   X509Backend(   t   _AESCTRCipherContextt   _CipherContext(   t   _CMACContext(   t   _DHParameterst   _DHPrivateKeyt   _DHPublicKey(   t   _DSAParameterst   _DSAPrivateKeyt   _DSAPublicKey(   t   _EllipticCurvePrivateKeyt   _EllipticCurvePublicKey(   t$   _CRL_ENTRY_EXTENSION_ENCODE_HANDLERSt   _CRL_EXTENSION_ENCODE_HANDLERSt   _EXTENSION_ENCODE_HANDLERSt   _encode_asn1_int_gct   _encode_asn1_str_gct   _encode_name_gct   _txt2obj_gc(   t   _HashContext(   t   _HMACContext(   t   _RSAPrivateKeyt   _RSAPublicKey(   t   _Certificatet   _CertificateRevocationListt   _CertificateSigningRequestt   _RevokedCertificate(   t   ffi(   t   binding(   t   hashest   serialization(   t   dsat   ect   rsa(   t   MGF1t   OAEPt   PKCS1v15t   PSS(   t   AESt   ARC4t   Blowfisht   CAST5t   Camelliat   IDEAt   SEEDt	   TripleDES(   t   CBCt   CFBt   CFB8t   CTRt   ECBt   GCMt   OFBt
   _MemoryBIOt   biot   char_ptrt   _PasswordUserdatac           B` s   e  Z d    Z RS(   c         C` s   | |  _  d |  _ d  |  _ d  S(   Ni    (   t   passwordt   calledt   Nonet	   exception(   t   selfRM   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   __init__F   s    		(   t   __name__t
   __module__RR   (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRL   E   s   s   int (char *, int, int, void *)t   namet   Cryptography_pem_password_cbc         C` s   t  j |  } | j d 7_ | j s: t d  | _ d St | j  | k  r t  j |  |  } | j | t | j  *t | j  St d j	 | d   | _ d Sd S(   s  
    A pem_password_cb function pointer that copied the password to
    OpenSSL as required and returns the number of bytes copied.

    typedef int pem_password_cb(char *buf, int size,
                                int rwflag, void *userdata);

    Useful for decrypting PKCS8 files and so on.

    The userdata pointer must point to a cffi handle of a
    _PasswordUserdata instance.
    i   s4   Password was not given but private key is encrypted.isB   Passwords longer than {0} bytes are not supported by this backend.i    N(
   t   _ffit   from_handleRN   RM   t	   TypeErrorRP   t   lent   buffert
   ValueErrort   format(   t   buft   sizet   writingt   userdata_handlet   udt   pw_buf(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _pem_password_cbL   s    	t   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 da 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+   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 e dQ    ZV dR   ZW dS   ZX dT   ZY dU   ZZ dV   Z[ dW   Z\ dX   Z] dY   Z^ dZ   Z_ d[   Z` d\   Za d]   Zb d^   Zc d_   Zd d`   Ze RS(b   s)   
    OpenSSL API binding interfaces.
    t   opensslc         C` s   t  j   |  _ |  j j |  _ |  j j |  _ |  j j d  } |  j | d k  i  |  _	 |  j
   |  j   t j d |  _ d  S(   Nt   utf8onlyi   i   (   R0   t   Bindingt   _bindingR/   RW   t   libt   _libt    ASN1_STRING_set_default_mask_asct   openssl_assertt   _cipher_registryt   _register_default_cipherst   activate_osrandom_enginet   syst   maxsizet   _scrypt_mem_limit(   RQ   t   res(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRR      s    	

c         C` s   t  j |  j |  S(   N(   R0   t   _openssl_assertRk   (   RQ   t   ok(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRm      s    c         C` sj   |  j  j   } | |  j j k rf |  j  j |  |  j  j   |  j  j |  } |  j | d k  n  d  S(   Ni   (   Rk   t   ENGINE_get_default_RANDRW   t   NULLt   ENGINE_unregister_RANDt   RAND_cleanupt   ENGINE_finishRm   (   RQ   t   eRt   (    (    sP   /usr/lib/python2.7/dist-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_idRi   t   _osrandom_engine_idRm   RW   Rx   t   ENGINE_initt   ENGINE_freeR{   (   RQ   R|   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _get_osurandom_engine   s    	c         C` sU   |  j    |  j   , } |  j j |  } |  j | d k  Wd  QX|  j j   d  S(   Ni   (   R}   R   Rk   t   ENGINE_set_default_RANDRm   Rz   (   RQ   R|   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRp      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(
   RW   t   newR   Rk   t   ENGINE_ctrl_cmdRZ   Rx   Rm   t   stringt   decode(   RQ   R^   R|   Rt   (    (    sP   /usr/lib/python2.7/dist-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   (   RW   R   Rk   t   OpenSSL_versiont   OPENSSL_VERSIONR   (   RQ   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   openssl_version_text   s    	c         C` s   t  |  | |  S(   N(   R(   (   RQ   t   keyt	   algorithm(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_hmac_ctx   s    c         C` s\   | j  d k s | j  d k rF d j | j  | j d  j d  } n | j  j d  } | S(   Nt   blake2bt   blake2ss   {0}{1}i   R   (   RU   R]   t   digest_sizet   encode(   RQ   R   t   alg(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _build_openssl_digest_name   s    c         C` s1   |  j  |  } |  j j |  } | |  j j k S(   N(   R   Rk   t   EVP_get_digestbynameRW   Rx   (   RQ   R   RU   t   digest(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   hash_supported   s    c         C` s   |  j  |  S(   N(   R   (   RQ   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   hmac_supported   s    c         C` s   t  |  |  S(   N(   R'   (   RQ   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_hash_ctx   s    c         C` s@   |  j  | |  r t St | t  r8 t | t  r8 t St Sd  S(   N(   t   _evp_cipher_supportedt   Truet
   isinstanceRE   R:   t   False(   RQ   t   ciphert   mode(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   cipher_supported   s
    c         C` sZ   y# |  j  t |  t |  f } Wn t k
 r7 t SX| |  | |  } |  j j | k S(   N(   Rn   t   typet   KeyErrorR   RW   Rx   (   RQ   R   R   t   adaptert
   evp_cipher(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR      s    #c         C` sG   | | f |  j  k r0 t d j | |    n  | |  j  | | f <d  S(   Ns$   Duplicate registration for: {0} {1}.(   Rn   R\   R]   (   RQ   t
   cipher_clst   mode_clsR   (    (    sP   /usr/lib/python2.7/dist-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   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   rc4(   RB   RE   RF   RH   RC   RD   RG   R   R:   t   GetCipherByNameR>   RA   R<   R@   t	   itertoolst   productR=   R?   R;   R   RO   (   RQ   R   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRo     sP    "			c         C` s[   t  | t  rA t  | t  rA |  j | |  rA t |  | |  St |  | | t j  Sd  S(   N(   R   RE   R:   R   R   R   t   _ENCRYPT(   RQ   R   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_symmetric_encryption_ctx6  s    c         C` s[   t  | t  rA t  | t  rA |  j | |  rA t |  | |  St |  | | t j  Sd  S(   N(   R   RE   R:   R   R   R   t   _DECRYPT(   RQ   R   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_symmetric_decryption_ctx?  s    c         C` s   |  j  |  S(   N(   R   (   RQ   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   pbkdf2_hmac_supportedH  s    c   	   	   C` s   |  j  j d |  } |  j j | j j d   } |  j | |  j  j k  |  j j | t	 |  | t	 |  | | | |  } |  j | d k  |  j  j
 |  S(   Ns   unsigned char[]R   i   (   RW   R   Rk   R   RU   R   Rm   Rx   t   PKCS5_PBKDF2_HMACRZ   R[   (	   RQ   R   t   lengtht   saltt
   iterationst   key_materialR^   t   evp_mdRt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   derive_pbkdf2_hmacK  s    					c         C` s   t  j |  j  S(   N(   R0   t   _consume_errorsRk   (   RQ   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR   ^  s    c         C` s   | |  j  j k s t  t j r |  j j |  } |  j  j d |  } |  j j | |  } |  j	 | d k  t
 j |  j  j |  |  d  S|  j j |  } |  j	 | |  j  j k  |  j  j |  } |  j j |  t
 | d  Sd  S(   Ns   unsigned char[]i    t   bigi   (   RW   Rx   t   AssertionErrort   sixt   PY3Rk   t   BN_num_bytesR   t	   BN_bn2binRm   t   intt
   from_bytesR[   t	   BN_bn2hexR   t   OPENSSL_free(   RQ   t   bnt   bn_num_bytest   bin_ptrt   bin_lent	   hex_cdatat   hex_str(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt
   _bn_to_inta  s    	 c         C` sC  | d
 k s$ | |  j j k s$ t  | d
 k r? |  j j } n  t j r | j t | j   d d  d  } |  j	 j
 | t |  |  } |  j | |  j j k  | St |  j d  j d  j d  p 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   Lt   0xR   t   0s	   BIGNUM **i    N(   RO   RW   Rx   R   R   R   t   to_bytesR   t
   bit_lengthRk   t	   BN_bin2bnRZ   Rm   t   hext   rstript   lstripR   R   t	   BN_hex2bn(   RQ   t   numR   t   binaryt   bn_ptrt   hex_numRt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt
   _int_to_bnt  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   (   R5   t   _verify_rsa_parametersRk   t   RSA_newRm   RW   Rx   t   gct   RSA_freeR   t   BN_freet   RSA_generate_key_ext   _rsa_cdata_to_evp_pkeyR)   (   RQ   t   public_exponentt   key_sizet	   rsa_cdataR   Rt   t   evp_pkey(    (    sP   /usr/lib/python2.7/dist-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   (    (   RQ   R   R   (    (    sP   /usr/lib/python2.7/dist-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   (   R5   t   _check_private_key_componentst   pt   qt   dt   dmp1t   dmq1t   iqmpt   public_numbersR|   t   nRk   R   Rm   RW   Rx   R   R   R   t   RSA_set0_factorst   RSA_set0_keyt   RSA_set0_crt_paramst   RSA_blinding_onR   R)   (   RQ   t   numbersR   R   R   R   R   R   R   R|   R   Rt   R   (    (    sP   /usr/lib/python2.7/dist-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   (   R5   t   _check_public_key_componentsR|   R   Rk   R   Rm   RW   Rx   R   R   R   R   R   R*   (   RQ   R   R   R|   R   Rt   R   (    (    sP   /usr/lib/python2.7/dist-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_newRm   RW   Rx   R   t   EVP_PKEY_free(   RQ   R   (    (    sP   /usr/lib/python2.7/dist-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_RSARm   (   RQ   R   R   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR     s    c         C` sk   |  j  j d |  } |  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.
        s   char[](
   RW   R   Rk   t   BIO_new_mem_bufRZ   Rm   Rx   RI   R   t   BIO_free(   RQ   t   datat   data_char_pRJ   (    (    sP   /usr/lib/python2.7/dist-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_memRm   RW   Rx   t   BIO_newR   R   (   RQ   t
   bio_methodRJ   (    (    sP   /usr/lib/python2.7/dist-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    (   RW   R   Rk   t   BIO_get_mem_dataRm   Rx   R[   (   RQ   RJ   R^   t   buf_lent   bio_data(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _read_mem_bio  s    c         C` sl  |  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 d k r\| |  j  j k r\|  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t |  | |  St d   d S(   sd   
        Return the appropriate type of PrivateKey given an evp_pkey cdata
        pointer.
        i   s   Unsupported key type.N(   Rk   t   EVP_PKEY_idt   EVP_PKEY_RSAt   EVP_PKEY_get1_RSARm   RW   Rx   R   R   R)   t   EVP_PKEY_DSAt   EVP_PKEY_get1_DSAt   DSA_freeR   t   Cryptography_HAS_ECt   EVP_PKEY_ECt   EVP_PKEY_get1_EC_KEYt   EC_KEY_freeR   R   (   RQ   R   t   key_typeR   t	   dsa_cdatat   ec_cdata(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _evp_pkey_to_private_key	  s$    c         C` sl  |  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 d k r\| |  j  j k r\|  j  j |  } |  j | |  j j k  |  j j | |  j  j  } t |  | |  St d   d S(   sc   
        Return the appropriate type of PublicKey given an evp_pkey cdata
        pointer.
        i   s   Unsupported key type.N(   Rk   R
  R  R  Rm   RW   Rx   R   R   R*   R  R  R  R   R  R  R  R  R   R   (   RQ   R   R  R   R  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _evp_pkey_to_public_key$  s$    c         C` s   t  d |  } t | f S(   s  
        Generate a pem_password_cb function pointer that copied the password to
        OpenSSL as required and returns the number of bytes copied.

        typedef int pem_password_cb(char *buf, int size,
                                    int rwflag, void *userdata);

        Useful for decrypting PKCS8 files and so on.

        Returns a tuple of (cdata function pointer, userdata).
        RM   (   RL   Rd   (   RQ   RM   t   userdata(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRd   ?  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_MDR   R1   t   SHA1t   SHA224t   SHA256t   SHA384t   SHA512(   RQ   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _oaep_hash_supportedS  s    c         C` s-   |  j  j r |  j |  St | t j  Sd  S(   N(   Rk   t   Cryptography_HAS_MGF1_MDR   R   R1   R  (   RQ   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _pss_mgf1_hash_supporteda  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  St
 Sd  S(   N(   R   R8   R   R9   t   _mgfR6   R"  t
   _algorithmR7   R   R   (   RQ   t   padding(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   rsa_padding_supportedg  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_newRm   RW   Rx   R   R  t   DSA_generate_parameters_exR   (   RQ   R   t   ctxRt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dsa_parameterst  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_cdataRm   RW   Rx   R   R  t   DSA_generate_keyt   _dsa_cdata_to_evp_pkeyR   (   RQ   t
   parametersR)  R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dsa_private_key  s    c         C` s   |  j  |  } |  j |  S(   N(   R*  R0  (   RQ   R   R/  (    (    sP   /usr/lib/python2.7/dist-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_pqgRm   t   DSA_set0_key(   RQ   R  R   R   t   gt   pub_keyt   priv_keyRt   (    (    sP   /usr/lib/python2.7/dist-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(   R3   t   _check_dsa_private_numbersR   t   parameter_numbersRk   R'  Rm   RW   Rx   R   R  R   R   R   R4  t   yt   xR7  R.  R   (
   RQ   R   R9  R  R   R   R4  R5  R6  R   (    (    sP   /usr/lib/python2.7/dist-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(   R3   t   _check_dsa_parametersR9  Rk   R'  Rm   RW   Rx   R   R  R   R   R   R4  R:  R7  R.  R   (	   RQ   R   R  R   R   R4  R5  R6  R   (    (    sP   /usr/lib/python2.7/dist-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   (   R3   R=  Rk   R'  Rm   RW   Rx   R   R  R   R   R   R4  R2  R   (   RQ   R   R  R   R   R4  Rt   (    (    sP   /usr/lib/python2.7/dist-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_DSARm   (   RQ   R  R   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR.    s    c         C` s   |  j  |  S(   N(   R   (   RQ   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   dsa_hash_supported  s    c         C` s   t  S(   N(   R   (   RQ   R   R   R4  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   dsa_parameters_supported  s    c         C` s/   |  j  j d k o. |  j | t d | j   S(   Ni   t    (   Rk   t   Cryptography_HAS_CMACR   RB   t
   block_size(   RQ   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   cmac_algorithm_supported  s    c         C` s   t  |  |  S(   N(   R   (   RQ   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_cmac_ctx  s    c   
      C` s  t  | t j  s! t d   n  |  j j rl t  | t  rK t d   n  t  | t  rl t d   ql n  |  j j	 | j
 j d   } |  j | |  j j k  |  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 | |  j j  } |  j d | j  d t! d | d	 |  j j" d
 t#  |  j j$ | |  } |  j | d k  |  j j% | | j |  } | d k r|  j&   }	 |  j |	 d d |  j j' k  |  j |	 d d |  j j( k  t) d   n  t* |  |  S(   Ns.   Algorithm must be a registered hash algorithm.sa   Certificate signing requests aren't implemented for DSA keys on OpenSSL versions less than 1.0.1.s`   Certificate signing requests aren't implemented for EC keys on OpenSSL versions less than 1.0.1.R   i   t
   extensionst   handlerst   x509_objt   add_funcR   i    i   s   Digest too big for RSA key(+   R   R1   t   HashAlgorithmRY   Rk   t"   CRYPTOGRAPHY_OPENSSL_LESS_THAN_101R   t   NotImplementedErrorR   R   RU   R   Rm   RW   Rx   t   X509_REQ_newR   t   X509_REQ_freet   X509_REQ_set_versionR   t   Versiont   v1t   valuet   X509_REQ_set_subject_nameR%   t   _subject_namet
   public_keyt   X509_REQ_set_pubkeyt	   _evp_pkeyt   sk_X509_EXTENSION_new_nullt   sk_X509_EXTENSION_freet   _create_x509_extensionst   _extensionsR"   t   sk_X509_EXTENSION_insertR   t   X509_REQ_add_extensionst   X509_REQ_signR   t   ERR_LIB_RSAt    RSA_R_DIGEST_TOO_BIG_FOR_RSA_KEYR\   R-   (
   RQ   t   buildert   private_keyR   R   t   x509_reqRt   RW  t   sk_extensiont   errors(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_csr  sZ    							!c   	      C` sR  t  | t j  s! t d   n  t  | t j  sB t d   n  |  j j r t  | t  rl t	 d   n  t  | t
  r t	 d   q n  |  j j | j j d   } |  j | |  j j k  |  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" |  t# j$ | j% j&     } | |  j j k r
|  j'   n  |  j j! |  j j( |  t# j$ | j) j&     } | |  j j k r\|  j'   n  |  j* d | j+ d t, d	 | d
 |  j j- d t.  |  j j/ | t |  | j0   } |  j | d k  |  j j1 | | j |  } | d k rE|  j2   } |  j | d d |  j j3 k  |  j | d d |  j j4 k  t5 d   n  t6 |  |  S(   Ns   Builder type mismatch.s.   Algorithm must be a registered hash algorithm.s[   Certificate signatures aren't implemented for DSA keys on OpenSSL versions less than 1.0.1.sZ   Certificate signatures aren't implemented for EC keys on OpenSSL versions less than 1.0.1.R   i   RH  RI  RJ  RK  R   i    i   s   Digest too big for RSA key(7   R   R   t   CertificateBuilderRY   R1   RL  Rk   RM  R   RN  R   R   RU   R   Rm   RW   Rx   t   X509_newR   t   backendt	   X509_freet   X509_set_versiont   _versionRT  t   X509_set_subject_nameR%   RV  t   X509_set_pubkeyt   _public_keyRY  R#   t   _serial_numbert   X509_set_serialNumbert   ASN1_TIME_sett   X509_get_notBeforet   calendart   timegmt   _not_valid_beforet	   timetuplet   _raise_time_set_errort   X509_get_notAftert   _not_valid_afterR\  R]  R"   t   X509_add_extR   t   X509_set_issuer_namet   _issuer_namet	   X509_signR   Ra  Rb  R\   R+   (	   RQ   Rc  Rd  R   R   t	   x509_certRt   t   serial_numberRg  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_certificate-  sn    									!c         C` s^   |  j    } |  j | d d |  j j k  |  j | d d |  j j k  t d   d  S(   Ni    i   i   sV   Invalid time. This error can occur if you set a time too far in the future on Windows.(   R   Rm   Rk   t   ERR_LIB_ASN1t   ASN1_R_ERROR_GETTING_TIMER\   (   RQ   Rg  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRz    s    !c         C` s  t  | t j  s! t d   n  t  | t j  sB t d   n  |  j j r t  | t  rl t	 d   n  t  | t
  r t	 d   q n  |  j j | j j d   } |  j | |  j j k  |  j j   } |  j j | t j j  } |  j j | d  } |  j | d k  |  j j | t |  | j   } |  j | d k  |  j j |  j j t j | j j     } |  j | |  j j k  |  j j | |  j j  } |  j j | |  } |  j | d k  |  j j |  j j t j | j  j     } |  j | |  j j k  |  j j | |  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 d |  j j. k  |  j | d d |  j j/ k  t0 d   n  t1 |  |  S(   Ns   Builder type mismatch.s.   Algorithm must be a registered hash algorithm.sS   CRL signatures aren't implemented for DSA keys on OpenSSL versions less than 1.0.1.sR   CRL signatures aren't implemented for EC keys on OpenSSL versions less than 1.0.1.R   i   RH  RI  RJ  RK  R   i    i   s   Digest too big for RSA key(2   R   R   t    CertificateRevocationListBuilderRY   R1   RL  Rk   RM  R   RN  R   R   RU   R   Rm   RW   Rx   t   X509_CRL_newR   Rk  t   X509_CRL_freet   X509_CRL_set_versiont   X509_CRL_set_issuer_nameR%   R  Rt  Rv  Rw  t   _last_updateRy  t   ASN1_TIME_freet   X509_CRL_set_lastUpdatet   _next_updatet   X509_CRL_set_nextUpdateR\  R]  R!   t   X509_CRL_add_extR   t   _revoked_certificatest   Cryptography_X509_REVOKED_dupt   _x509_revokedt   X509_CRL_add0_revokedt   X509_CRL_signRY  R   Ra  Rb  R\   R,   (   RQ   Rc  Rd  R   R   t   x509_crlRt   t   last_updatet   next_updatet   revoked_certt   revokedRg  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_crl  sl    			$	$				!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_extensionRm   RW   Rx   R   Rk   t   X509_EXTENSION_free(
   RQ   RH  RI  RJ  RK  R   t   it	   extensiont   x509_extensionRt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR\    s    	c         C` s.  t  | j t j  r| t |  | j j  } t |  | j j t | j j   } |  j	 j
 |  j j | | j rr d n d |  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(   Ni   i    s   Extension not supported: {0}R   (   R   RT  R   t   UnrecognizedExtensionR&   t   oidt   dotted_stringR$   RZ   Rk   t   X509_EXTENSION_create_by_OBJRW   Rx   t   criticalR   RN  R]   t   OBJ_txt2nidR   Rk  Rm   t	   NID_undeft   X509V3_EXT_i2d(   RQ   RI  R  t   objRT  R   t
   ext_structt   nid(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    s(    !				c         C` sh  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 t j | j j     } |  j | |  j j k  |  j j	 | |  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   RH  RI  RJ  RK  R   (   R   R   t   RevokedCertificateBuilderRY   Rk   t   X509_REVOKED_newRm   RW   Rx   R   t   X509_REVOKED_freeR#   Rr  t   X509_REVOKED_set_serialNumberRt  Rv  Rw  t   _revocation_dateRy  R  t   X509_REVOKED_set_revocationDateR\  R]  R    t   X509_REVOKED_add_extR   R.   RO   (   RQ   Rc  t   x509_revokedR  Rt   t   rev_date(    (    sP   /usr/lib/python2.7/dist-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  (   RQ   R   RM   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_private_key8  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_PUBKEYRJ   RW   Rx   R   R   R  R   t	   BIO_resetRm   t   PEM_read_bio_RSAPublicKeyR   R   R*   t   _handle_key_loading_error(   RQ   R   t   mem_bioR   Rt   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_public_key@  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(   RQ   R   RM   R  R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_private_keyY  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_bioRJ   RW   Rx   R   R   RO   RY   R   (   RQ   R  RM   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR  l  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_bioRJ   RW   Rx   R   R   R  R   R  Rm   t   d2i_RSAPublicKey_bioR   R   R*   R  (   RQ   R   R  R   Rt   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_public_keyz  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(   Ns   Unable to load certificate(   R  Rk   t   PEM_read_bio_X509RJ   RW   Rx   R   R\   R   Rl  R+   (   RQ   R   R  R   (    (    sP   /usr/lib/python2.7/dist-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_bioRJ   RW   Rx   R   R\   R   Rl  R+   (   RQ   R   R  R   (    (    sP   /usr/lib/python2.7/dist-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(   Ns   Unable to load CRL(   R  Rk   t   PEM_read_bio_X509_CRLRJ   RW   Rx   R   R\   R   R  R,   (   RQ   R   R  R  (    (    sP   /usr/lib/python2.7/dist-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_bioRJ   RW   Rx   R   R\   R   R  R,   (   RQ   R   R  R  (    (    sP   /usr/lib/python2.7/dist-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(   Ns   Unable to load request(   R  Rk   t   PEM_read_bio_X509_REQRJ   RW   Rx   R   R\   R   RP  R-   (   RQ   R   R  Re  (    (    sP   /usr/lib/python2.7/dist-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_bioRJ   RW   Rx   R   R\   R   RP  R-   (   RQ   R   R  Re  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_x509_csr  s    
c         C` s#  |  j  |  } |  j |  \ } } |  j j |  } | | j |  j j | |  }	 |	 |  j j k r | j d  k	 r |  j   }
 |  j	 |
  | j  q |  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(   Ni    s4   Password was given but private key is not encrypted.i   (   R  Rd   RW   t
   new_handleRJ   Rx   RP   RO   R   Rm   R  R   Rk   R   RN   RY   R   (   RQ   t   openssl_read_funct   convert_funcR   RM   R  t   password_cbR  Ra   R   Rg  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    s*    		c         ` s[    j    } | s! t d   n6| d d   j j   j j   j j f   j j   j j   j j f f k r t d   n | d d   j j	   j j
   j j f   j j   j j   j j f f k r t d t j   nr t   f d   | D  rt d t j   nA | d d   j j   j j	   j j f k sKt  t d   d  S(   Ns   Could not unserialize key data.i    i   s    Bad decrypt. Incorrect password?s0   PEM data is encrypted with an unsupported cipherc         3` s:   |  ]0 } | d    j  j   j  j   j  j f k Vq d S(   i   N(   Rk   t   ERR_LIB_EVPt   EVP_F_EVP_PKCS82PKEYt'   EVP_R_UNSUPPORTED_PRIVATE_KEY_ALGORITHM(   t   .0t   error(   RQ   (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pys	   <genexpr>  s   s!   Unsupported public key algorithm.(   R   R\   Rk   R  t   EVP_F_EVP_DECRYPTFINAL_EXt   EVP_R_BAD_DECRYPTt   ERR_LIB_PKCS12t   PKCS12_F_PKCS12_PBE_CRYPTt!   PKCS12_R_PKCS12_CIPHERFINAL_ERRORt   ERR_LIB_PEMt   PEM_F_PEM_GET_EVP_CIPHER_INFOt   PEM_R_UNSUPPORTED_ENCRYPTIONt   EVP_F_EVP_PBE_CIPHERINITt   EVP_R_UNKNOWN_PBE_ALGORITHMR   R   t   UNSUPPORTED_CIPHERt   anyt    UNSUPPORTED_PUBLIC_KEY_ALGORITHMR  R   (   RQ   Rg  (    (   RQ   sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    s@    										c         C` s   |  j  j d k r t Sy |  j |  } Wn t k
 rH |  j  j } n X|  j  j |  } | |  j j k r |  j	   } |  j
 | |  j  j k p | d d |  j  j |  j  j |  j  j f k  t S|  j
 | |  j  j k  |  j  j |  t Sd  S(   Ni   i    (   Rk   R  R   t   _elliptic_curve_to_nidR   R  t   EC_GROUP_new_by_curve_nameRW   Rx   R   Rm   t
   ERR_LIB_ECt   EC_F_EC_GROUP_NEW_BY_CURVE_NAMEt   EC_R_UNKNOWN_GROUPt   EC_GROUP_freeR   (   RQ   t   curvet	   curve_nidR)  Rg  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   elliptic_curve_supported0  s&    		c         C` s9   |  j  j d k r t St | t j  s, t S|  j |  S(   Ni   (   Rk   R  R   R   R4   t   ECDSAR  (   RQ   t   signature_algorithmR  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt,   elliptic_curve_signature_algorithm_supportedK  s
    c         C` s   |  j  |  r |  j |  } |  j j |  } |  j | |  j j k  |  j j | |  j j  } |  j j	 |  } |  j | d k  |  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 {0}.N(   R  R  Rk   t   EC_KEY_new_by_curve_nameRm   RW   Rx   R   R  t   EC_KEY_generate_keyt   EC_KEY_check_keyt   _ec_cdata_to_evp_pkeyR   R   R]   RU   R   t   UNSUPPORTED_ELLIPTIC_CURVE(   RQ   R  R  R  Rt   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt#   generate_elliptic_curve_private_keyW  s    c         C` s   | j  } |  j | j  } |  j j |  } |  j | |  j j k  |  j j | |  j j	  } |  j
 | | j | j  } |  j j | |  j | j   } |  j | d k  |  j |  } t |  | |  S(   Ni   (   R   R  R  Rk   R  Rm   RW   Rx   R   R  t)   _ec_key_set_public_key_affine_coordinatesR;  R:  t   EC_KEY_set_private_keyR   t   private_valueR  R   (   RQ   R   t   publicR  R  Rt   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt#   load_elliptic_curve_private_numbersr  s    		c         C` s   |  j  | j  } |  j j |  } |  j | |  j j k  |  j j | |  j j  } |  j	 | | j
 | j  } |  j |  } t |  | |  S(   N(   R  R  Rk   R  Rm   RW   Rx   R   R  R  R;  R:  R  R   (   RQ   R   R  R  R   (    (    sP   /usr/lib/python2.7/dist-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 |  \ } } } |  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 | d k  |  j |  } t |  | |  S(   Ni   (   R  Rk   R  Rm   RW   Rx   R   R  t%   _ec_key_determine_group_get_set_funcst   EC_POINT_newt   EC_POINT_freeR   R   t   _tmp_bn_ctxt   EC_POINT_mult
   BN_CTX_gett   EC_KEY_set_public_keyR  R  R   (   RQ   R  R  R  R  t   set_funct   get_funct   groupt   pointRT  t   bn_ctxRt   t   bn_xt   bn_yR   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt!   derive_elliptic_curve_private_key  s2    	c         C` s1   |  j  |  o0 |  j j d k o0 t | t j  S(   Ni   (   R  Rk   t   Cryptography_HAS_ECDHR   R4   t   ECDH(   RQ   R   R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt+   elliptic_curve_exchange_algorithm_supported  s    c         C` s8   |  j    } |  j j | |  } |  j | d k  | S(   Ni   (   R   Rk   t   EVP_PKEY_set1_EC_KEYRm   (   RQ   R  R   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    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%   {0} is not a supported elliptic curve(
   t   getRU   Rk   t
   OBJ_sn2nidR   R  R   R]   R   R  (   RQ   R  t   curve_aliasest
   curve_nameR  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    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_newRm   RW   Rx   R   t   BN_CTX_freet   BN_CTX_startt
   BN_CTX_end(   RQ   R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    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
 } |  j j } n |  j j } |  j j } | r| s"t  | | | f S(   sy   
        Given an EC_KEY determine the group and what methods are required to
        get/set point coordinates.
        s   characteristic-two-field(   Rm   RW   Rx   Rk   R  R  t   EC_KEY_get0_groupt   EC_GROUP_method_oft   EC_METHOD_get_field_typet   Cryptography_HAS_EC2Mt$   EC_POINT_set_affine_coordinates_GF2mt$   EC_POINT_get_affine_coordinates_GF2mt#   EC_POINT_set_affine_coordinates_GFpt#   EC_POINT_get_affine_coordinates_GFpR   (   RQ   R)  t   nid_two_fieldR
  t   methodR  R  R	  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    s     c      
   C` s  | d k  s | d k  r' t  d   n  |  j |  \ } } } |  j j |  } |  j | |  j j k  |  j j | |  j j  } |  j	 |  } |  j	 |  }	 |  j
   }
 |  j j |
  } |  j j |
  } | | | | |	 |
  } | d k r|  j   t  d   n  | | | | | |
  } |  j | d k  |  j j | |  } | d k rx|  j   t  d   n  |  j j |	 |  } | d k r|  j   t  d   n  Wd QX|  j j | |  } |  j | d k  |  j j |  } | d k r|  j   t  d   n  | S(	   s   
        This is a port of EC_KEY_set_public_key_affine_coordinates that was
        added in 1.0.1.

        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   EC point not on curves   Invalid EC Key X point.s   Invalid EC Key Y point.Ns   Invalid EC key.(   R\   R  Rk   R  Rm   RW   Rx   R   R  R   R  R  R   t   BN_cmpR  R  (   RQ   R)  R;  R:  R  R	  R
  R  R  R  R  t   check_xt   check_yRt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    sB    	



c         C` s  t  | t j  s! t d   n  t  | t j  sB t d   n  t  | t j  ro d } d } |  j j } nc t  | t j  r |  j	 j
 d  } | j } t |  } | d k r t d   q n t d   |  j	 j |  }	 | t j j k r| t j j k r|  j	 j }
 | } qJ| t j j k s5t  |	 |  j	 j k rV|  j	 j }
 n] |	 |  j	 j k rw|  j	 j }
 n< |  j	 j d	 k st  |	 |  j	 j k st  |  j	 j }
 | } n | t j j k r>| t j j k rt  | t j  st d
   n  |  j |	 |  S| t j j k s)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 enumsB   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 typei   sD   Encryption is not supported for DER encoded traditional OpenSSL keyss/   encoding must be an item from the Encoding enum("   R   R2   t   PrivateFormatRY   t   KeySerializationEncryptiont   NoEncryptionRW   Rx   t   BestAvailableEncryptionRk   t   EVP_get_cipherbynameRM   RZ   R\   R
  t   Encodingt   PEMt   PKCS8t   PEM_write_bio_PKCS8PrivateKeyt   TraditionalOpenSSLR   R  t   PEM_write_bio_RSAPrivateKeyR  t   PEM_write_bio_DSAPrivateKeyR  R  t   PEM_write_bio_ECPrivateKeyt   DERt"   _private_key_bytes_traditional_dert   i2d_PKCS8PrivateKey_bioR  Rm   R	  (   RQ   t   encodingR]   t   encryption_algorithmR   t   cdataRM   t   passlenR   R  t	   write_bioR   RJ   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _private_key_bytes;  sr    							c         C` s   | |  j  j k r! |  j  j } nX |  j  j d k rT | |  j  j k rT |  j  j } n% |  j | |  j  j k  |  j  j } |  j	   } | | |  } |  j | d k  |  j
 |  S(   Ni   (   Rk   R  t   i2d_RSAPrivateKey_bioR  R  t   i2d_ECPrivateKey_bioRm   R  t   i2d_DSAPrivateKey_bioR  R	  (   RQ   R  R@  RB  RJ   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR<    s    c   	      C` s  t  | t j  s! t d   n  | t j j k sE | t j j k r | t j j k	 si | t j j k	 rx t d   n  |  j |  S| t j j k r | t j j	 k r |  j
 j } n$ | t j j k s t  |  j
 j } | } n | t j j k ri|  j
 j |  |  j
 j k st  | t j j	 k r<|  j
 j } n$ | t j j k sTt  |  j
 j } | } n t d   |  j   } | | |  } |  j | d k  |  j |  S(   Ns/   encoding must be an item from the Encoding enums1   OpenSSH format must be used with OpenSSH encodings1   format must be an item from the PublicFormat enumi   (   R   R2   R3  RY   t   PublicFormatt   OpenSSHR\   t   _openssh_public_key_bytest   SubjectPublicKeyInfoR4  Rk   t   PEM_write_bio_PUBKEYR;  R   t   i2d_PUBKEY_biot   PKCS1R
  R  t   PEM_write_bio_RSAPublicKeyt   i2d_RSAPublicKey_bioR  Rm   R	  (	   RQ   R>  R]   R   R   R@  RB  RJ   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _public_key_bytes  s8    	$		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  s t  | j   } y5 i d t j 6d t j 6d t j 6t | j  } Wn t k
 rQt d   n Xd	 | d
 t j t j d	 |  t j |  t j | j     Sd  S(   Ns   ssh-rsa s   ssh-rsas   ssh-dss s   ssh-dsst   nistp256t   nistp384t   nistp521sZ   Only SECP256R1, SECP384R1, and SECP521R1 curves are supported by the SSH public key formats   ecdsa-sha2-t    (   R   R5   t   RSAPublicKeyR   t   base64t	   b64encodeR2   t   _ssh_write_stringt   _ssh_write_mpintR|   R   R3   t   DSAPublicKeyR9  R   R   R4  R:  R4   t   EllipticCurvePublicKeyR   t	   SECP256R1t	   SECP384R1t	   SECP521R1R   R  R   R\   t   encode_point(   RQ   R   R   R9  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRI    s2    			<


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_newRm   RW   Rx   R   t   DH_freet   DH_generate_parameters_exR   (   RQ   t	   generatorR   t   dh_param_cdataRt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dh_parameters  s    	c         C` s{   |  j  j | j  } |  j | |  j j k  |  j j | |  j  j  } |  j  j |  } |  j | d k  t	 |  |  S(   Ni   (
   Rk   t   DHparams_dupt	   _dh_cdataRm   RW   Rx   R   Ra  t   DH_generate_keyR   (   RQ   R/  t   dh_key_cdataRt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dh_private_key  s    c         C` s   |  j  |  j | |   S(   N(   Rj  Re  (   RQ   Rc  R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt&   generate_dh_private_key_and_parameters  s    c   
      C` sb  | 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 | d k  |  j j | | |  } |  j | d k  |  j j d d  }	 |  j j | |	  } |  j | d k  |	 d d k rUt d   n  t |  |  S(   Ni   s   int[]i    s.   DH private numbers did not pass safety checks.(   R   R9  Rk   R`  Rm   RW   Rx   R   Ra  R   R   R4  R:  R;  t   DH_set0_pqgt   DH_set0_keyR   t   DH_checkR\   R   (
   RQ   R   R9  t   dh_cdataR   R4  R5  R6  Rt   t   codes(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_dh_private_numbers  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 | d k  |  j  j | | |  j j  } |  j | d k  t |  |  S(   Ni   (   Rk   R`  Rm   RW   Rx   R   Ra  R9  R   R   R4  R:  Rl  Rm  R   (   RQ   R   Ro  R9  R   R4  R5  Rt   (    (    sP   /usr/lib/python2.7/dist-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  j
 | | |  j j |  } |  j | d k  t |  |  S(   Ni   (   Rk   R`  Rm   RW   Rx   R   Ra  R   R   R4  Rl  R   (   RQ   R   Ro  R   R4  Rt   (    (    sP   /usr/lib/python2.7/dist-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 |  } |  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`  Rm   RW   Rx   R   Ra  R   Rl  R   Rn  (   RQ   R   R4  Ro  Rt   Rp  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   dh_parameters_supportedL  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(   RQ   (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   <lambda>c  s    (	   R%   RW   R   Rk   t   i2d_X509_NAMERm   Rx   R   R[   (   RQ   RU   t	   x509_namet   ppRt   (    (   RQ   sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   x509_name_bytes]  s    	c   	      C` su   |  j  j d |  } |  j j | t |  | t |  | | | |  j | | 
 } |  j | d k  |  j  j |  S(   Ns   unsigned char[]i   (   RW   R   Rk   t   EVP_PBE_scryptRZ   Rs   Rm   R[   (	   RQ   R   R   R   R   t   rR   R^   Rt   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   derive_scrypth  s    	!N(f   RS   RT   t   __doc__RU   RR   Rm   R}   t
   contextlibR   R   Rp   R   R   R   R   R   R   R   R   R   R   Ro   R   R   R   R   R   R   RO   R   R   R   R   R   R   R   R  R  R	  R  R  Rd   R   R"  R&  R*  R0  R1  R7  R<  R>  R?  R.  RA  RB  RF  RG  Rh  R  Rz  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  RC  R<  RP  RI  Re  Rj  Rk  Rq  Rr  Rs  Rt  Rz  R}  (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRe   o   s   				
					
							3											"																										L	^		X										
		
		
	"	;						'					8	R		,	&		
						R   c           B` s   e  Z d    Z d   Z RS(   c         C` s   | |  _  d  S(   N(   t   _fmt(   RQ   t   fmt(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRR   s  s    c         C` s:   |  j  j d | d |  j   } | j j | j d   S(   NR   R   R   (   R  R]   t   lowerRk   R2  R   (   RQ   Rk  R   R   t   cipher_name(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   __call__v  s    !(   RS   RT   RR   R  (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR   r  s   	(t   t
   __future__R    R   R   RV  Rv  t   collectionsR  R   Rq   R   R   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.openssl.ciphersR   R   t)   cryptography.hazmat.backends.openssl.cmacR   t'   cryptography.hazmat.backends.openssl.dhR   R   R   t(   cryptography.hazmat.backends.openssl.dsaR   R   R   t'   cryptography.hazmat.backends.openssl.ecR   R   t0   cryptography.hazmat.backends.openssl.encode_asn1R    R!   R"   R#   R$   R%   R&   t+   cryptography.hazmat.backends.openssl.hashesR'   t)   cryptography.hazmat.backends.openssl.hmacR(   t(   cryptography.hazmat.backends.openssl.rsaR)   R*   t)   cryptography.hazmat.backends.openssl.x509R+   R,   R-   R.   t%   cryptography.hazmat.bindings._opensslR/   RW   t$   cryptography.hazmat.bindings.opensslR0   t   cryptography.hazmat.primitivesR1   R2   t)   cryptography.hazmat.primitives.asymmetricR3   R4   R5   t1   cryptography.hazmat.primitives.asymmetric.paddingR6   R7   R8   R9   t1   cryptography.hazmat.primitives.ciphers.algorithmsR:   R;   R<   R=   R>   R?   R@   RA   t,   cryptography.hazmat.primitives.ciphers.modesRB   RC   RD   RE   RF   RG   RH   t
   namedtupleRI   t   objectRL   t   ffi_callbackRd   t   register_interfacet   register_interface_ifRh   Rj   t   Cryptography_HAS_SCRYPTRe   R   Rk  (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   <module>   sn   X4"":4":      	