
KVc           @` 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 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 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) d  d l* m+ Z+ d  d l, m- Z- d  d l. m/ Z/ m0 Z0 d  d l1 m2 Z2 m3 Z3 m4 Z4 m5 Z5 m6 Z6 m7 Z7 m8 Z8 d  d l9 m: Z; d  d l< m= Z= d  d l> m? Z? m@ Z@ d  d lA mB ZB 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 mO ZO mP ZP mQ ZQ mR ZR d  d lS mT ZT mU ZU mV ZV mW ZW mX ZX mY ZY mZ ZZ d  d l[ m\ Z\ m] Z] m^ Z^ e j_ d d d g  Z` d   Za d   Zb d   Zc d   Zd d   Ze d   Zf d    Zg d!   Zh d"   Zi d#   Zj d$   Zk d%   Zl d&   Zm d'   Zn d(   Zo d)   Zp d*   Zq d+   Zr d,   Zs d-   Zt d.   Zu d/   Zv d0   Zw d1   Zx d2   Zy d3   Zz i d4 e j{ j| 6d5 e j{ j} 6d6 e j{ j~ 6d7 e j{ j 6d8 e j{ j 6d9 e j{ j 6d: e j{ j 6d; e j{ j 6Z d<   Z d=   Z d>   Z i et e] j 6ex e] j 6er e] j 6ew e] j 6ew e] j 6ez e] j 6es e] j 6em e] j 6eu e] j 6e e] j 6eg e] j 6eq e] j 6e e] j 6Z i ew e] j 6es e] j 6eu e] j 6ej e] j 6Z i ew e\ j 6ek e\ j 6el e\ j 6Z d? e f d@     YZ e= j dA dB dC dD    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  dE e f dF     Y           Z dG e f dH     YZ e   Z d S(I   i    (   t   absolute_importt   divisiont   print_functionN(   t   contextmanager(   t   utilst   x509(   t   UnsupportedAlgorithmt   _Reasons(   t   CMACBackendt   CipherBackendt   DERSerializationBackendt
   DSABackendt   EllipticCurveBackendt   HMACBackendt   HashBackendt   PBKDF2HMACBackendt   PEMSerializationBackendt
   RSABackendt   X509Backend(   t   _AESCTRCipherContextt   _CipherContext(   t   _CMACContext(   t   _DSAParameterst   _DSAPrivateKeyt   _DSAPublicKey(   t   _EllipticCurvePrivateKeyt   _EllipticCurvePublicKey(   t   _HashContext(   t   _HMACContext(   t   _RSAPrivateKeyt   _RSAPublicKey(   t   _CRL_ENTRY_REASON_ENUM_TO_CODEt   _Certificatet   _CertificateRevocationListt   _CertificateSigningRequestt   _DISTPOINT_TYPE_FULLNAMEt   _DISTPOINT_TYPE_RELATIVENAMEt   _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   OFB(   t   CRLEntryExtensionOIDt   ExtensionOIDt   NameOIDt
   _MemoryBIOt   biot   char_ptrc         C` sb   |  j  |  } |  j j | |  j j  } |  j j | |  j j  } |  j | |  j j k  | S(   s  
    Converts a python integer to an ASN1_INTEGER. The returned ASN1_INTEGER
    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.

    (   t
   _int_to_bnt   _ffit   gct   _libt   BN_freet   BN_to_ASN1_INTEGERt   NULLt   openssl_assert(   t   backendt   xt   i(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_asn1_int?   s
    c         C` s.   t  |  |  } |  j j | |  j j  } | S(   N(   RQ   RG   RH   RI   t   ASN1_INTEGER_free(   RN   RO   RP   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_asn1_int_gcS   s    c         C` s>   |  j  j   } |  j  j | | |  } |  j | d k  | S(   s@   
    Create an ASN1_OCTET_STRING from a Python byte string.
    i   (   RI   t   ASN1_OCTET_STRING_newt   ASN1_OCTET_STRING_setRM   (   RN   t   datat   lengtht   st   res(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_asn1_strY   s    c         C` sV   |  j  j   } |  j  j | | j d  t | j d    } |  j | d k  | S(   s   
    Create an ASN1_UTF8STRING from a Python unicode string.
    This object will be an ASN1_STRING with UTF8 type in OpenSSL and
    can be decoded with ASN1_STRING_to_UTF8.
    t   utf8i   (   RI   t   ASN1_UTF8STRING_newt   ASN1_STRING_sett   encodet   lenRM   (   RN   t   stringRX   RY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_asn1_utf8_strc   s
    	'c         C` s1   t  |  | |  } |  j j | |  j j  } | S(   N(   RZ   RG   RH   RI   t   ASN1_OCTET_STRING_free(   RN   RV   RW   RX   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_asn1_str_gcq   s    c         ` s\     j  j d  } | | |  }   j | d k    j  j |   f d    } | | f S(   Ns   unsigned char **i    c         ` s     j  j |  d  S(   Ni    (   RI   t   OPENSSL_free(   t   pointer(   RN   (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   <lambda>|   s    (   RG   t   newRM   RH   (   RN   t   i2d_funct   valuet   ppt   r(    (   RN   sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_extension_to_derw   s    	c         C` s(   t  |  | j  } t |  |  j j |  S(   N(   RS   t
   skip_certsRl   RI   t   i2d_ASN1_INTEGER(   RN   t   inhibit_any_policyt   asn1int(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_inhibit_any_policy   s    c      	   C` s   |  j  j   } x | D] } | j j d  } t |  | j j  } | j t j k rd |  j  j	 } n |  j  j
 } |  j  j | | | | d d d  } |  j | d k  q W| S(   sP   
    The X509_NAME created will not be gc'd. Use _encode_name_gc if needed.
    R[   ii    i   (   RI   t   X509_NAME_newRi   R^   t   _txt2obj_gct   oidt   dotted_stringRB   t   COUNTRY_NAMEt   MBSTRING_ASCt   MBSTRING_UTF8t   X509_NAME_add_entry_by_OBJRM   (   RN   t
   attributest   subjectt	   attributeRi   t   objt   typeRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_name   s    	c         C` s.   t  |  |  } |  j j | |  j j  } | S(   N(   R   RG   RH   RI   t   X509_NAME_free(   RN   Rz   R{   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_name_gc   s    c         C` s(   t  |  | j  } t |  |  j j |  S(   N(   RS   t
   crl_numberRl   RI   Rn   (   RN   R   Rp   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_crl_number   s    c         C` s   |  j  j   } |  j | |  j j k  |  j j | |  j  j  } |  j  j | t | j	  } |  j | d k  t
 |  |  j  j |  S(   Ni   (   RI   t   ASN1_ENUMERATED_newRM   RG   RL   RH   t   ASN1_ENUMERATED_freet   ASN1_ENUMERATED_setR   t   reasonRl   t   i2d_ASN1_ENUMERATED(   RN   t
   crl_reasont   asn1enumRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_crl_reason   s    	c         C` sw   |  j  j |  j j t j | j j     } |  j | |  j j k  |  j j	 | |  j  j
  } t |  |  j  j |  S(   N(   RI   t   ASN1_GENERALIZEDTIME_setRG   RL   t   calendart   timegmt   invalidity_datet	   timetupleRM   RH   t   ASN1_GENERALIZEDTIME_freeRl   t   i2d_ASN1_GENERALIZEDTIME(   RN   R   t   time(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_invalidity_date   s    	c         C` sp  |  j  j   } |  j | |  j j k  |  j j | |  j  j  } x| D]} |  j  j   } |  j | |  j j k  |  j  j | |  } |  j | d k  t	 |  | j
 j  } | | _ | j rJ |  j  j   } |  j | |  j j k  xX| j D]M} |  j  j   }	 |  j |	 |  j j k  |  j  j | |	  } |  j | d k  t | t j  rt	 |  t j j  |	 _ t |  | j d  t | j d    |	 j _ q t | t j  st  t	 |  t j j  |	 _ |  j  j   }
 |  j |
 |  j j k  |
 |	 j _  | j! r1t" |  | j!  |
 _# n  t$ |  | j%  |
 _& q W| | _' qJ qJ Wt( |  |  j  j) |  S(   Ni   t   ascii(*   RI   t   sk_POLICYINFO_new_nullRM   RG   RL   RH   t   sk_POLICYINFO_freet   POLICYINFO_newt   sk_POLICYINFO_pusht   _txt2objt   policy_identifierRu   t   policyidt   policy_qualifierst   sk_POLICYQUALINFO_new_nullt   POLICYQUALINFO_newt   sk_POLICYQUALINFO_pusht
   isinstancet   sixt	   text_typeR   t   OID_CPS_QUALIFIERt   pqualidRZ   R^   R_   t   dt   cpsurit
   UserNoticet   AssertionErrort   OID_CPS_USER_NOTICEt   USERNOTICE_newt
   usernoticet   explicit_textRa   t   exptextt   _encode_notice_referencet   notice_referencet	   noticereft
   qualifiersRl   t   i2d_CERTIFICATEPOLICIES(   RN   t   certificate_policiest   cpt   policy_infot   piRY   Rt   t   pqist	   qualifiert   pqit   un(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_certificate_policies   sN    		!	c         C` s   | d  k r |  j j S|  j j   } |  j | |  j j k  t |  | j  | _ |  j j   } | | _	 xH | j
 D]= } t |  |  } |  j j | |  } |  j | d k  qu W| Sd  S(   Ni   (   t   NoneRG   RL   RI   t   NOTICEREF_newRM   Ra   t   organizationt   sk_ASN1_INTEGER_new_nullt	   noticenost   notice_numbersRQ   t   sk_ASN1_INTEGER_push(   RN   t   noticet   nrt   notice_stackt   numbert   numRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR      s    
	c         C` sA   | j  d  } |  j j | d  } |  j | |  j j k  | S(   s_   
    Converts a Python string with an ASN.1 object ID in dotted form to a
    ASN1_OBJECT.
    R   i   (   R^   RI   t   OBJ_txt2objRM   RG   RL   (   RN   t   nameR}   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR     s    c         C` s.   t  |  |  } |  j j | |  j j  } | S(   N(   R   RG   RH   RI   t   ASN1_OBJECT_free(   RN   R   R}   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRs     s    c         C` s   d g d f S(   s   
    The OCSP No Check extension is defined as a null ASN.1 value. Rather than
    calling OpenSSL we can return a Python bytestring value in a list.
    s    i   (    (   RN   t   ext(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_ocsp_nocheck  s    c         C` s
  |  j  j } |  j  j   } |  j j | |  j  j  } | | d | j  } |  j | d k  | | d | j  } |  j | d k  | | d | j	  } |  j | d k  | | d | j
  } |  j | d k  | | d | j  } |  j | d k  | | d | j  } |  j | d k  | | d | j  } |  j | d k  | j r| | d | j  } |  j | d k  | | d	 | j  } |  j | d k  nJ | | d d  } |  j | d k  | | d	 d  } |  j | d k  t |  |  j  j |  S(
   Ni    i   i   i   i   i   i   i   i   (   RI   t   ASN1_BIT_STRING_set_bitt   ASN1_BIT_STRING_newRG   RH   t   ASN1_BIT_STRING_freet   digital_signatureRM   t   content_commitmentt   key_enciphermentt   data_enciphermentt   key_agreementt   key_cert_signt   crl_signt   encipher_onlyt   decipher_onlyRl   t   i2d_ASN1_BIT_STRING(   RN   t	   key_usaget   set_bitt   kuRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_key_usage&  s8    	c         C` s   |  j  j   } |  j | |  j j k  |  j j | |  j  j  } | j d  k	 rv t	 |  | j t
 | j   | _ n  | j d  k	 r t |  | j  | _ n  | j d  k	 r t |  | j  | _ n  t |  |  j  j |  S(   N(   RI   t   AUTHORITY_KEYID_newRM   RG   RL   RH   t   AUTHORITY_KEYID_freet   key_identifierR   RZ   R_   t   keyidt   authority_cert_issuert   _encode_general_namest   issuert   authority_cert_serial_numberRQ   t   serialRl   t   i2d_AUTHORITY_KEYID(   RN   t   authority_keyidt   akid(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt    _encode_authority_key_identifierH  s     c         C` s   |  j  j   } |  j j | |  j  j  } | j r9 d n d | _ | j rr | j d  k	 rr t |  | j  | _	 n  t
 |  |  j  j |  S(   Ni   i    (   RI   t   BASIC_CONSTRAINTS_newRG   RH   t   BASIC_CONSTRAINTS_freet   cat   path_lengthR   RQ   t   pathlenRl   t   i2d_BASIC_CONSTRAINTS(   RN   t   basic_constraintst   constraints(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_basic_constraintsb  s    	c         C` s   |  j  j   } |  j | |  j j k  |  j j | |  j  j  } x~ | D]v } |  j  j   } t |  | j	 j
  } t |  | j  } | | _ | | _ |  j  j | |  } |  j | d k  qJ Wt |  |  j  j |  S(   Ni   (   RI   t   sk_ACCESS_DESCRIPTION_new_nullRM   RG   RL   RH   t   sk_ACCESS_DESCRIPTION_freet   ACCESS_DESCRIPTION_newR   t   access_methodRu   t   _encode_general_namet   access_locationt   methodt   locationt   sk_ACCESS_DESCRIPTION_pushRl   t   i2d_AUTHORITY_INFO_ACCESS(   RN   t   authority_info_accesst   aiat   access_descriptiont   adR   t   gnRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt$   _encode_authority_information_accessr  s    			c         C` st   |  j  j   } |  j | |  j j k  xE | D]= } t |  |  } |  j  j | |  } |  j | d k  q/ W| S(   Ni    (   RI   t   GENERAL_NAMES_newRM   RG   RL   R   t   sk_GENERAL_NAME_push(   RN   t   namest   general_namesR   R  RY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR     s    c         C` s@   t  |  |  } |  j j | |  j j  } t |  |  j j |  S(   N(   R   RG   RH   RI   t   GENERAL_NAMES_freeRl   t   i2d_GENERAL_NAMES(   RN   t   sanR  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_alt_name  s
    	c         C` s4   t  |  | j t | j   } t |  |  j j |  S(   N(   Rc   t   digestR_   Rl   RI   t   i2d_ASN1_OCTET_STRING(   RN   t   skit   asn1_str(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_subject_key_identifier  s    c         C` s  t  | t j  r |  j j   } |  j | |  j j k  |  j j | _	 |  j j
   } |  j | |  j j k  | j j d  r d t j | j d  } n t j | j  } |  j j | | t |   } |  j | d k  | | j _ nt  | t j  r|  j j   } |  j | |  j j k  |  j j | _	 |  j j | j j j d  d  } |  j | |  j j k  | | j _ n<t  | t j  r|  j j   } |  j | |  j j k  t |  | j  } |  j j | _	 | | j _ nt  | t j  rm|  j j   } |  j | |  j j k  t |  | j j t | j j   } |  j j | _	 | | j _  nVt  | t j!  r|  j j   } |  j | |  j j k  |  j j"   }	 |  j |	 |  j j k  |  j j | j# j j d  d  }
 |  j |
 |  j j k  |  j j$ d | j  } |  j j$ d  } | | d <|  j j% |  j j | t | j   } | |  j j k r|  j&   t' d	   n  |
 |	 _# | |	 _ |  j j( | _	 |	 | j _) nt  | t j*  r8|  j j   } |  j | |  j j k  t |  | j+ t | j+   } |  j j, | _	 | | j _- n t  | t j.  r|  j j   } |  j | |  j j k  t |  | j+ t | j+   } |  j j/ | _	 | | j _0 n t' d
 j1 |    | S(   Nu   *.s   *.i   i   R   s   unsigned char[]s   unsigned char **i    s   Invalid ASN.1 datas"   {0} is an unknown GeneralName type(2   R   R   t   DNSNameRI   t   GENERAL_NAME_newRM   RG   RL   t   GEN_DNSR~   t   ASN1_IA5STRING_newRi   t
   startswitht   idnaR^   R]   R_   R   t   dNSNamet   RegisteredIDt   GEN_RIDR   Ru   t   registeredIDt   DirectoryNameR   t   GEN_DIRNAMEt   directoryNamet	   IPAddressRZ   t   packedt	   GEN_IPADDt	   iPAddresst	   OtherNamet   OTHERNAME_newt   type_idRg   t   d2i_ASN1_TYPEt   _consume_errorst
   ValueErrort   GEN_OTHERNAMEt	   otherNamet
   RFC822Namet   _encodedt	   GEN_EMAILt
   rfc822Namet   UniformResourceIdentifiert   GEN_URIt   uniformResourceIdentifiert   format(   RN   R   R  t   ia5Ri   RY   R}   t   dir_namet   ipaddrt
   other_nameR%  RV   t   data_ptr_ptrR  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR     s    	!	
	
		c         C` s   |  j  j   } |  j j | |  j  j  } xH | D]@ } t |  | j  } |  j  j | |  } |  j | d k  q1 W|  j j	 d |  } t
 |  |  j  j |  S(   Ni   s   EXTENDED_KEY_USAGE *(   RI   t   sk_ASN1_OBJECT_new_nullRG   RH   t   sk_ASN1_OBJECT_freeR   Ru   t   sk_ASN1_OBJECT_pushRM   t   castRl   t   i2d_EXTENDED_KEY_USAGE(   RN   t   extended_key_usaget   ekuRt   R}   RY   t   eku_ptr(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_extended_key_usage  s    i   i   i   i   i   i   i   i   c         C` s2  |  j  j   } |  j j | |  j  j  } x| D]} |  j  j   } |  j | |  j j k  | j r |  j  j	   } |  j | |  j j k  | | _ xC | j D]5 } |  j  j
 | t | d  } |  j | d k  q Wn  | j r=|  j  j   } |  j | |  j j k  t | _ t |  | j  | j _ | | _ n  | j r|  j  j   } |  j | |  j j k  t | _ t |  | j  }	 |  j  j |	 j  }
 |  j |
 |  j j k  |
 | j _ | | _ n  | j rt |  | j  | _ n  |  j  j | |  } |  j | d k  q1 Wt |  |  j  j |  S(   Ni   (   RI   t   sk_DIST_POINT_new_nullRG   RH   t   sk_DIST_POINT_freet   DIST_POINT_newRM   RL   t   reasonsR   R   t   _CRLREASONFLAGSt	   full_namet   DIST_POINT_NAME_newR#   R~   R   R   t   fullnamet	   distpointt   relative_nameR$   R   t   sk_X509_NAME_ENTRY_dupt   entriest   relativenamet
   crl_issuert	   CRLissuert   sk_DIST_POINT_pushRl   t   i2d_CRL_DIST_POINTS(   RN   t   crl_distribution_pointst   cdpt   pointt   dpt   bitmaskR   RY   t   dpnR   RM  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_crl_distribution_points  sD    								c         C` s   |  j  j   } | |  j j k s' t  |  j j | |  j  j  } t |  | j  } | | _	 t |  | j
  } | | _ t |  |  j  j |  S(   N(   RI   t   NAME_CONSTRAINTS_newRG   RL   R   RH   t   NAME_CONSTRAINTS_freet   _encode_general_subtreet   permitted_subtreest   permittedSubtreest   excluded_subtreest   excludedSubtreesRl   t!   Cryptography_i2d_NAME_CONSTRAINTS(   RN   t   name_constraintst   nct	   permittedt   excluded(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _encode_name_constraintsB  s    		c         C` s   | d  k r |  j j S|  j j   } xV | D]N } |  j j   } t |  |  | _ |  j j | |  } | d k s, t	  q, W| Sd  S(   Ni   (
   R   RG   RL   RI   t   sk_GENERAL_SUBTREE_new_nullt   GENERAL_SUBTREE_newR   t   baset   sk_GENERAL_SUBTREE_pushR   (   RN   t   subtreest   general_subtreesR   t   gsRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR[  T  s    
t   _PasswordUserdatac           B` s   e  Z d    Z RS(   c         C` s   | |  _  d |  _ d  |  _ d  S(   Ni    (   t   passwordt   calledR   t	   exception(   t   selfRn  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   __init__  s    		(   t   __name__t
   __module__Rr  (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRm    s   s   int (char *, int, int, void *)R   t   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(
   RG   t   from_handleRo  Rn  t	   TypeErrorRp  R_   t   bufferR(  R2  (   t   buft   sizet   writingt   userdata_handlet   udt   pw_buf(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _pem_password_cb  s    	t   Backendc           B` s  e  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   Z d   Z dW 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)   Z, d*   Z- d+   Z. d,   Z/ d-   Z0 d.   Z1 d/   Z2 d0   Z3 d1   Z4 d2   Z5 d3   Z6 d4   Z7 d5   Z8 d6   Z9 d7   Z: d8   Z; d9   Z< d:   Z= d;   Z> d<   Z? d=   Z@ d>   ZA d?   ZB d@   ZC dA   ZD dB   ZE dC   ZF dD   ZG dE   ZH dF   ZI dG   ZJ dH   ZK dI   ZL eM dJ    ZN dK   ZO dL   ZP dM   ZQ dN   ZR dO   ZS dP   ZT dQ   ZU dR   ZV dS   ZW dT   ZX dU   ZY dV   ZZ RS(X   s)   
    OpenSSL API binding interfaces.
    t   opensslc         C` ss   t  j   |  _ |  j j |  _ |  j j |  _ |  j j d  } |  j | d k  i  |  _	 |  j
   |  j   d  S(   Nt   utf8onlyi   (   R'   t   Bindingt   _bindingR&   RG   t   libRI   t    ASN1_STRING_set_default_mask_ascRM   t   _cipher_registryt   _register_default_cipherst   activate_osrandom_engine(   Rq  RY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRr    s    	
c         C` s   t  j |  j |  S(   N(   R'   t   _openssl_assertRI   (   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   (   RI   t   ENGINE_get_default_RANDRG   RL   t   ENGINE_unregister_RANDt   RAND_cleanupt   ENGINE_finishRM   (   Rq  t   eRY   (    (    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 j k  |  j j |  } |  j | d k  |  j j	 |  } |  j | d k  |  j j
 |  } |  j | d k  |  j j |  } |  j | d k  |  j j   d  S(   Ni   (   R  RI   t   ENGINE_by_idR  t   _osrandom_engine_idRM   RG   RL   t   ENGINE_initt   ENGINE_set_default_RANDt   ENGINE_freeR  R  (   Rq  R  RY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    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   (   RG   R`   RI   t   SSLeay_versiont   SSLEAY_VERSIONt   decode(   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  j | j j d   } | |  j j k S(   NR   (   RI   t   EVP_get_digestbynameR   R^   RG   RL   (   Rq  R  R  (    (    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   TrueR   R<   R1   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(   R  R~   t   KeyErrorR  RG   RL   (   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}.(   R  R(  R2  (   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  x9 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   qR 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   qUW|  j t t d   t d   |  j t t 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(   R9   R<   R=   R?   R:   R;   R  R1   t   GetCipherByNameR5   R8   R3   R7   t	   itertoolst   productR4   R6   R2   R~   R   R>   (   Rq  R  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR  !  sX    			c         C` s[   t  | t  rA t  | t  rA |  j | |  rA t |  | |  St |  | | t j  Sd  S(   N(   R   R<   R1   R  R   R   t   _ENCRYPT(   Rq  R  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_symmetric_encryption_ctxY  s    c         C` s[   t  | t  rA t  | t  rA |  j | |  rA t |  | |  St |  | | t j  Sd  S(   N(   R   R<   R1   R  R   R   t   _DECRYPT(   Rq  R  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_symmetric_decryption_ctxc  s    c         C` s-   |  j  j r |  j |  St | t j  Sd  S(   N(   RI   t   Cryptography_HAS_PBKDF2_HMACR  R   R(   t   SHA1(   Rq  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   pbkdf2_hmac_supportedm  s    c   	   	   C` s  |  j  j d |  } |  j j r |  j j | j j d   } |  j | |  j  j k  |  j j	 | t
 |  | t
 |  | | | |  } |  j | d k  nj t | t j  s t d t j   n  |  j j | t
 |  | t
 |  | | |  } |  j | d k  |  j  j |  S(   Ns   char[]R   i   s;   This version of OpenSSL only supports PBKDF2HMAC with SHA1.(   RG   Rg   RI   R  R  R   R^   RM   RL   t   PKCS5_PBKDF2_HMACR_   R   R(   R  R   R   t   UNSUPPORTED_HASHt   PKCS5_PBKDF2_HMAC_SHA1Rx  (	   Rq  R  RW   t   saltt
   iterationst   key_materialRy  t   evp_mdRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   derive_pbkdf2_hmacv  s:    									c         C` s   t  j |  j  S(   N(   R'   R'  RI   (   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   (   RG   RL   R   R   t   PY3RI   t   BN_num_bytesRg   t	   BN_bn2binRM   t   intt
   from_bytesRx  t	   BN_bn2hexR`   Rd   (   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_int  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(   R   RG   RL   R   R   R  t   to_bytesR  t
   bit_lengthRI   t	   BN_bin2bnR_   RM   t   hext   rstript   lstripR^   Rg   t	   BN_hex2bn(   Rq  R   R  t   binaryt   bn_ptrt   hex_numRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRF     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   (   R,   t   _verify_rsa_parametersRI   t   RSA_newRM   RG   RL   RH   t   RSA_freeRF   RJ   t   RSA_generate_key_ext   _rsa_cdata_to_evp_pkeyR   (   Rq  t   public_exponentt   key_sizet	   rsa_cdataR  RY   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 j  } |  j | d k  |  j |  } t |  | |  S(   Ni   (   R,   t   _check_private_key_componentst   pt   qR   t   dmp1t   dmq1t   iqmpt   public_numbersR  t   nRI   R  RM   RG   RL   RH   R  RF   t   RSA_blinding_onR  R   (   Rq  t   numbersR  RY   R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_rsa_private_numbers  s0    	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   (   R,   t   _check_public_key_componentsR  R  RI   R  RM   RG   RL   RH   R  RF   R  R  R   (   Rq  R  R  RY   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(   RI   t   EVP_PKEY_newRM   RG   RL   RH   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  RI   t   EVP_PKEY_set1_RSARM   (   Rq  R  R  RY   (    (    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[](
   RG   Rg   RI   t   BIO_new_mem_bufR_   RM   RL   RC   RH   t   BIO_free(   Rq  RV   t   data_char_pRD   (    (    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.
        (   RI   t	   BIO_s_memRM   RG   RL   t   BIO_newRH   R  (   Rq  t
   bio_methodRD   (    (    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    (   RG   Rg   RI   t   BIO_get_mem_dataRM   RL   Rx  (   Rq  RD   Ry  t   buf_lent   bio_data(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _read_mem_bio5  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(   RI   t   Cryptography_EVP_PKEY_idt   EVP_PKEY_RSAt   EVP_PKEY_get1_RSARM   RG   RL   RH   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(   RI   R  R  R  RM   RG   RL   RH   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).
        Rn  (   Rm  R  (   Rq  Rn  t   userdata(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR  v  s    c         C` s-   |  j  j r |  j |  St | t j  Sd  S(   N(   RI   t   Cryptography_HAS_MGF1_MDR  R   R(   R  (   Rq  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _mgf1_hash_supported  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~ t  | j j t	 j
  St Sd  S(   N(   R   R/   R  R0   t   _mgfR-   R  t
   _algorithmR.   R(   R  R  (   Rq  t   padding(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   rsa_padding_supported  s    !!c         C` s   | d	 k r t  d   n  |  j j d k  rH | d k rH 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  sO   Key size must be 1024 because OpenSSL < 1.0.0 doesn't support larger key sizes.i    i   (   i   i   i   (   R(  RI   t   OPENSSL_VERSION_NUMBERt   DSA_newRM   RG   RL   RH   R	  t   DSA_generate_parameters_exR   (   Rq  R  t   ctxRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   generate_dsa_parameters  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 |  |  j |  } t |  | |  S(   N(   RI   R  RM   RG   RL   RH   R	  t   BN_dupt
   _dsa_cdataR  R  t   gt   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  R%  (   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   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 |  } t |  | |  S(   N(   R*   t   _check_dsa_private_numbersR  t   parameter_numbersRI   R  RM   RG   RL   RH   R	  RF   R  R  R!  t   yt   pub_keyRO   t   priv_keyR#  R   (   Rq  R  R(  R  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 |  } t |  | |  S(   N(   R*   t   _check_dsa_parametersR(  RI   R  RM   RG   RL   RH   R	  RF   R  R  R!  R)  R*  R#  R   (   Rq  R  R  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  | _ t |  |  S(   N(   R*   R-  RI   R  RM   RG   RL   RH   R	  RF   R  R  R!  R   (   Rq  R  R  (    (    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  RI   t   EVP_PKEY_set1_DSARM   (   Rq  R  R  RY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR#    s    c         C` s3   |  j  j d k  r" t | t j  S|  j |  Sd  S(   Ni  (   RI   R  R   R(   R  R  (   Rq  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   dsa_hash_supported  s    c         C` sB   |  j  j d k  r: t j |  d k o9 t j |  d k St Sd  S(   Ni  i   i   (   RI   R  R   R  R  (   Rq  R  R  R!  (    (    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    (   RI   t   Cryptography_HAS_CMACR  R9   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 d k rr t  | t  rQ t d   n  t  | t  rr t d   qr 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.i  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_funcRH   i    i   s   Digest too big for RSA key(+   R   R(   t   HashAlgorithmRw  RI   R  R   t   NotImplementedErrorR   R  R   R^   RM   RG   RL   t   X509_REQ_newRH   t   X509_REQ_freet   X509_REQ_set_versionR   t   Versiont   v1Ri   t   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   _extensionst   _EXTENSION_ENCODE_HANDLERSt   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_reqRY   RE  t   sk_extensiont   errors(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_csr  sZ    							!c   	      C` sX  t  | t j  s! t d   n  t  | t j  sB t d   n  |  j j d k r t  | t  rr 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 |  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 j k  |  j j" |  j j( |  t$ j% | j) j'     } |  j | |  j j k  |  j* d | j+ d	 t, d
 | d |  j j- d t.  |  j j/ | t |  t | j0    } |  j | d k  |  j j1 | | j |  } | d k rK|  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.i  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   R8  R9  R:  R;  RH   i    i   s   Digest too big for RSA key(7   R   R   t   CertificateBuilderRw  R(   R<  RI   R  R   R=  R   R  R   R^   RM   RG   RL   t   X509_newRH   RN   t	   X509_freet   X509_set_versiont   _versionRi   t   X509_set_subject_nameR   t   listRD  t   X509_set_pubkeyt   _public_keyRG  RS   t   _serial_numbert   X509_set_serialNumbert   ASN1_TIME_sett   X509_get_notBeforeR   R   t   _not_valid_beforeR   t   X509_get_notAftert   _not_valid_afterRJ  RK  RL  t   X509_add_extR  t   X509_set_issuer_namet   _issuer_namet	   X509_signR'  RP  RQ  R(  R    (	   Rq  RR  RS  R  R  t	   x509_certRY   t   serial_numberRV  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_certificateX  sj    									!c         C` s  t  | t j  s! t d   n  t  | t j  sB t d   n  |  j j d k r t  | t  rr 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 |  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 j0 k  t1 d   n  t2 |  |  S(   Ns   Builder type mismatch.s.   Algorithm must be a registered hash algorithm.i  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   R8  R9  R:  R;  RH   i    i   s   Digest too big for RSA key(3   R   R   t    CertificateRevocationListBuilderRw  R(   R<  RI   R  R   R=  R   R  R   R^   RM   RG   RL   t   X509_CRL_newRH   RN   t   X509_CRL_freet   X509_CRL_set_versiont   X509_CRL_set_issuer_nameR   R^  Rj  Rc  R   R   t   _last_updateR   t   ASN1_TIME_freet   X509_CRL_set_lastUpdatet   _next_updatet   X509_CRL_set_nextUpdateRJ  RK  t   _CRL_EXTENSION_ENCODE_HANDLERSt   X509_CRL_add_extR  t   _revoked_certificatest   Cryptography_X509_REVOKED_dupt   _x509_revokedt   X509_CRL_add0_revokedt   X509_CRL_signRG  R'  RP  RQ  R(  R!   (   Rq  RR  RS  R  R  t   x509_crlRY   t   last_updatet   next_updatet   revoked_certt   revokedRV  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   create_x509_crl  sl    			$	$				!c      	   C` s-  x&t  |  D]\ } } y | | j } Wn) t k
 rU t d j | j    n X| |  | j  \ }	 }
 t |  | j j  } |  j j	 |  j
 j | | j r d n d t |  |	 d |
   } |  j | |  j
 j k  | r |  j
 j | |  j j  } n  | | | |  } |  j | d k  q Wd  S(   Ns   Extension not supported: {0}i   i    (   t	   enumerateRt   R  R=  R2  Ri   Rs   Ru   RI   t   X509_EXTENSION_create_by_OBJRG   RL   t   criticalRc   RM   RH   t   X509_EXTENSION_free(   Rq  R8  R9  R:  R;  RH   RP   t	   extensionR^   Rj   Rk   R}   t   x509_extensionRY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRJ    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 t j | j j     } |  j | |  j j k  |  j d | j d t d | d |  j j d t  t |  d  |  S(   Ns   Builder type mismatch.i   R8  R9  R:  R;  RH   (   R   R   t   RevokedCertificateBuilderRw  RI   t   X509_REVOKED_newRM   RG   RL   RH   t   X509_REVOKED_freeRS   Ra  t   X509_REVOKED_set_serialNumberRc  t   revocationDateR   R   t   _revocation_dateR   RJ  RK  t$   _CRL_ENTRY_EXTENSION_ENCODE_HANDLERSt   X509_REVOKED_add_extR  R%   R   (   Rq  RR  t   x509_revokedRm  RY   (    (    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_keyRI   t   PEM_read_bio_PrivateKeyR  (   Rq  RV   Rn  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_private_keyA  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  RI   t   PEM_read_bio_PUBKEYRD   RG   RL   RH   R  R  R'  t	   BIO_resetRM   t   PEM_read_bio_RSAPublicKeyR  R  R   t   _handle_key_loading_error(   Rq  RV   t   mem_bioR  RY   R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_pem_public_keyI  s     	'
	'c         C` s   |  j  |  } |  j | |  } | sd |  j j | j  } |  j | d k  |  j | |  } n  | rw |  j |  S|  j |  j j	 |  j | |  Sd  S(   Ni   (
   R  t"   _evp_pkey_from_der_traditional_keyRI   R  RD   RM   t$   _evp_pkey_from_der_unencrypted_pkcs8R  R  t   d2i_PKCS8PrivateKey_bio(   Rq  RV   Rn  R  R  RY   (    (    sP   /usr/lib/python2.7/dist-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.(
   RI   t   d2i_PrivateKey_bioRD   RG   RL   RH   R  R   Rw  R'  (   Rq  R  Rn  R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR  ~  s    
c         C` s   |  j  j | j |  j j  } |  j j | |  j  j  } | |  j j k r |  j  j |  } |  j | |  j j k  |  j j | |  j  j	  } | d  k	 r t d   n  | S|  j   d  Sd  S(   Ns4   Password was given but private key is not encrypted.(   RI   t   d2i_PKCS8_PRIV_KEY_INFO_bioRD   RG   RL   RH   t   PKCS8_PRIV_KEY_INFO_freet   EVP_PKCS82PKEYRM   R  R   Rw  R'  (   Rq  R  Rn  t   infoR  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    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  RI   t   d2i_PUBKEY_bioRD   RG   RL   RH   R  R  R'  R  RM   t   d2i_RSAPublicKey_bioR  R  R   R  (   Rq  RV   R  R  RY   R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   load_der_public_key  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  RI   t   PEM_read_bio_X509RD   RG   RL   R'  R(  RH   RZ  R    (   Rq  RV   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  RI   t   d2i_X509_bioRD   RG   RL   R'  R(  RH   RZ  R    (   Rq  RV   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  RI   t   PEM_read_bio_X509_CRLRD   RG   RL   R'  R(  RH   Rq  R!   (   Rq  RV   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  RI   t   d2i_X509_CRL_bioRD   RG   RL   R'  R(  RH   Rq  R!   (   Rq  RV   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  RI   t   PEM_read_bio_X509_REQRD   RG   RL   R'  R(  RH   R?  R"   (   Rq  RV   R  RT  (    (    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  RI   t   d2i_X509_REQ_bioRD   RG   RL   R'  R(  RH   R?  R"   (   Rq  RV   R  RT  (    (    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  R  RG   t
   new_handleRD   RL   Rp  R   R'  RM   R  RH   RI   R  Ro  Rw  R   (   Rq  t   openssl_read_funct   convert_funcRV   Rn  R  t   password_cbR  R|  R  RV  (    (    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(   RI   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(  RI   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_ALGORITHMt   ERR_LIB_ASN1R   (   Rq  RV  (    (   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    (   RI   R
  R  t   _elliptic_curve_to_nidR   t	   NID_undeft   EC_GROUP_new_by_curve_nameRG   RL   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  RV  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   elliptic_curve_supportedT  s&    		c         C` sh   |  j  j d k r t St | t j  s, t S|  j  j d k  r[ | j | j j	 d k  r[ t S|  j
 |  S(   Ni   i߀ i   (   RI   R
  R  R   R+   t   ECDSAR  R  R  t   digest_sizeR  (   Rq  t   signature_algorithmR  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt,   elliptic_curve_signature_algorithm_supportedo  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  RI   t   EC_KEY_new_by_curve_nameRM   RG   RL   RH   R  t   EC_KEY_generate_keyt   EC_KEY_check_keyt   _ec_cdata_to_evp_pkeyR   R   R2  R   R   t   UNSUPPORTED_ELLIPTIC_CURVE(   Rq  R  R  R  RY   R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt#   generate_elliptic_curve_private_key  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  RI   R  RM   RG   RL   RH   R  t)   _ec_key_set_public_key_affine_coordinatesRO   R)  t   EC_KEY_set_private_keyRF   t   private_valueR  R   (   Rq  R  t   publicR  R  RY   R  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt#   load_elliptic_curve_private_numbers  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  RI   R  RM   RG   RL   RH   R  R  RO   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` s1   |  j  |  o0 |  j j d k o0 t | t j  S(   Ni   (   R  RI   t   Cryptography_HAS_ECDHR   R+   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  RI   t   EVP_PKEY_set1_EC_KEYRM   (   Rq  R  R  RY   (    (    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   getR   RI   t
   OBJ_sn2nidR^   R  R   R2  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(	   RI   t
   BN_CTX_newRM   RG   RL   RH   t   BN_CTX_freet   BN_CTX_startt
   BN_CTX_end(   Rq  t   bn_ctx(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _tmp_bn_ctx  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   RG   RL   RI   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_fieldt   groupR   t   nidt   set_funct   get_func(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt%   _ec_key_determine_group_get_set_funcs  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 |
  } | | | | |	 |
  } |  j | d k  | | | | | |
  } |  j | d k  |  j j | |  } | d k rf|  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   Invalid EC Key X point.s   Invalid EC Key Y point.Ns   Invalid EC key.(   R(  R  RI   t   EC_POINT_newRM   RG   RL   RH   t   EC_POINT_freeRF   R  t
   BN_CTX_gett   BN_cmpR'  t   EC_KEY_set_public_keyR  (   Rq  R  RO   R)  R  R  R  RT  t   bn_xt   bn_yR  t   check_xt   check_yRY   (    (    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  | 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   R)   t   PrivateFormatRw  t   KeySerializationEncryptiont   NoEncryptionRG   RL   t   BestAvailableEncryptionRI   t   EVP_get_cipherbynameRn  R_   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   encodingR2  t   encryption_algorithmR  t   cdataRn  t   passlenR  R  t	   write_bioR  RD   RY   (    (    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   (   RI   R  t   i2d_RSAPrivateKey_bioR
  R  t   i2d_ECPrivateKey_bioRM   R  t   i2d_DSAPrivateKey_bioR  R  (   Rq  R  R$  R&  RD   RY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR     s    c   	      C` sL  t  | t j  s! t d   n  | t j j k r | t j j k rT |  j j } n$ | t j j	 k sl 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 enums1   format must be an item from the PublicFormat enumi   (   R   R)   R  Rw  t   PublicFormatt   SubjectPublicKeyInfoR  RI   t   PEM_write_bio_PUBKEYR  R   t   i2d_PUBKEY_biot   PKCS1R  R  t   PEM_write_bio_RSAPublicKeyt   i2d_RSAPublicKey_bioR  RM   R  (	   Rq  R"  R2  R  R$  R&  R  RD   RY   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _public_key_bytes  s.    				c         C` s\   |  j  j | |  j j  } |  j | |  j j k  |  j j | |  j  j  } |  j |  S(   N(   RI   t   ASN1_INTEGER_to_BNRG   RL   RM   RH   RJ   R  (   Rq  t   asn1_intR  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _asn1_integer_to_int  s    c         C` s   |  j  j | j | j  S(   N(   RG   Rx  RV   RW   (   Rq  t   asn1_string(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _asn1_string_to_bytes  s    c         C` s   |  j  |  j d  S(   NR   (   R7  R  (   Rq  R6  (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _asn1_string_to_ascii  s    c         ` s     j  j d  }   j j | |  }   j | d k    j | d   j  j k    j  j |   f d    }   j  j | d |  j d  S(   Ns   unsigned char **i    c         ` s     j  j |  d  S(   Ni    (   RI   Rd   (   Rx  (   Rq  (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRf     s    R[   (	   RG   Rg   RI   t   ASN1_STRING_to_UTF8RM   RL   RH   Rx  R  (   Rq  R6  Ry  RY   (    (   Rq  sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _asn1_string_to_utf8  s    	c         ` s     j  j d  }   j j | |  }   j | d k    j | d   j  j k    j  j |   f d    }   j  j | d |  S(   Ns   unsigned char **i    c         ` s     j  j |  d  S(   Ni    (   RI   Rd   (   Rx  (   Rq  (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyRf     s    (   RG   Rg   RI   t   i2d_ASN1_TYPERM   RL   RH   Rx  (   Rq  t	   asn1_typeRy  RY   (    (   Rq  sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _asn1_to_der  s    	c         C` su   |  j  | |  j j k  |  j j | |  j j  } |  j  | |  j j k  |  j j | |  j j  } |  j |  S(   N(   RM   RG   RL   RI   t   ASN1_TIME_to_generalizedtimeRH   R   t   _parse_asn1_generalized_time(   Rq  t	   asn1_timet   generalized_time(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   _parse_asn1_time  s    		c         C` s1   |  j  |  j j d |   } t j j | d  S(   Ns   ASN1_STRING *s   %Y%m%d%H%M%SZ(   R8  RG   R;  t   datetimet   strptime(   Rq  RA  R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR?    s    N([   Rs  Rt  t   __doc__R   Rr  RM   R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R'  R  R   RF   R  R  R  R  R  R  R  R  R  R  R  R  R  R  R  R%  R&  R,  R.  R/  R#  R1  R2  R6  R7  RW  Rn  R  RJ  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   R2  R5  R7  R8  R:  R=  RB  R?  (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    s   													8	
	
			&																
												L	\	X										
		
		
	"	;										6	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    c         C` s:   |  j  j d | d |  j   } | j j | j d   S(   NR  R  R   (   RF  R2  t   lowerRI   R  R^   (   Rq  RN   R  R  t   cipher_name(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   __call__  s    !(   Rs  Rt  Rr  RJ  (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyR    s   	(   t
   __future__R    R   R   R   t   collectionsRC  R  t
   contextlibR   R  R   t   cryptographyR   R   t   cryptography.exceptionsR   R   t'   cryptography.hazmat.backends.interfacesR   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.dsaR   R   R   t'   cryptography.hazmat.backends.openssl.ecR   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"   R#   R$   R%   t%   cryptography.hazmat.bindings._opensslR&   RG   t$   cryptography.hazmat.bindings.opensslR'   t   cryptography.hazmat.primitivesR(   R)   t)   cryptography.hazmat.primitives.asymmetricR*   R+   R,   t1   cryptography.hazmat.primitives.asymmetric.paddingR-   R.   R/   R0   t1   cryptography.hazmat.primitives.ciphers.algorithmsR1   R2   R3   R4   R5   R6   R7   R8   t,   cryptography.hazmat.primitives.ciphers.modesR9   R:   R;   R<   R=   R>   R?   t   cryptography.x509.oidR@   RA   RB   t
   namedtupleRC   RQ   RS   RZ   Ra   Rc   Rl   Rq   R   R   R   R   R   R   R   R   Rs   R   R   R   R   R  R   R  R  R   R@  t   ReasonFlagst   key_compromiset   ca_compromiset   affiliation_changedt
   supersededt   cessation_of_operationt   certificate_holdt   privilege_withdrawnt   aa_compromiseRE  RX  Re  R[  t   BASIC_CONSTRAINTSt   SUBJECT_KEY_IDENTIFIERt	   KEY_USAGEt   SUBJECT_ALTERNATIVE_NAMEt   ISSUER_ALTERNATIVE_NAMEt   EXTENDED_KEY_USAGEt   AUTHORITY_KEY_IDENTIFIERt   CERTIFICATE_POLICIESt   AUTHORITY_INFORMATION_ACCESSt   CRL_DISTRIBUTION_POINTSt   INHIBIT_ANY_POLICYt   OCSP_NO_CHECKt   NAME_CONSTRAINTSRL  t
   CRL_NUMBERRy  t   CERTIFICATE_ISSUERt
   CRL_REASONt   INVALIDITY_DATER  t   objectRm  t   ffi_callbackR  t   register_interfaceR  R  RN   (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/backends/openssl/backend.pyt   <module>   s   L4":4			
			
							4					"					
		W		-		
















"4      ?	