ó
‰KÖVc           @` sX  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	 m
 Z
 d  d l m Z m Z d  d l m Z e j d d d d	 d
 g ƒ Z d „  Z d „  Z d „  Z e d d d d d ƒd „  ƒ Z e d d d ƒd „  ƒ Z d „  Z d e f d „  ƒ  YZ e j ƒ  e j j ƒ  d k  rTe j d e ƒ n  d S(   i    (   t   absolute_importt   divisiont   print_functionN(   t   InternalError(   t   ffit   lib(   t   CONDITIONAL_NAMESt   _OpenSSLErrort   codeR   t   funct   reasonc         C` s|   g  } xo t  rw |  j ƒ  } | d k r+ Pn  |  j | ƒ } |  j | ƒ } |  j | ƒ } | j t | | | | ƒ ƒ q	 W| S(   Ni    (   t   Truet   ERR_get_errort   ERR_GET_LIBt   ERR_GET_FUNCt   ERR_GET_REASONt   appendR   (   R   t   errorsR   t   err_libt   err_funct
   err_reason(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   _consume_errors   s    	 c         C` s1   | s- t  |  ƒ } t d j | ƒ | ƒ ‚ n  d  S(   Ns   Unknown OpenSSL error. Please file an issue at https://github.com/pyca/cryptography/issues with information on how to reproduce this. ({0!r})(   R   R   t   format(   R   t   okR   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   _openssl_assert$   s    c         ` s   ‡  ‡ ‡ f d †  } | S(   s€   Callback dispatcher

    The ffi_callback() dispatcher keeps callbacks compatible between dynamic
    and static callbacks.
    c         ` sP   t  j r4 t j d ˆ ˆ   |  ƒ t t  ˆ ƒ } n t j ˆ ˆ   |  ƒ } | S(   Nt   name(   R   t   Cryptography_STATIC_CALLBACKSR   t
   def_externt   getattrt   callback(   R	   R   (   t   kwargsR   t	   signature(    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   wrapper5   s
    	(    (   R   R   R   R    (    (   R   R   R   sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   ffi_callback/   s    
s   int (*)(unsigned char *, int)R   t   Cryptography_rand_bytest   erroriÿÿÿÿc         C` s2   t  j d |  ƒ } t j | ƒ } | | d | +d S(   Ns   char *i    i   (   R   t   castt   ost   urandom(   t   buft   sizet   signedt   result(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   _osrandom_rand_bytesB   s    s   int (*)(void)t   Cryptography_rand_statusc           C` s   d S(   Ni   (    (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   _osrandom_rand_statusL   s    c         C` sš   t  j d ƒ } t ƒ  } x< | j ƒ  D]. \ } } t |  | ƒ s% | t | ƒ O} q% q% Wx< t |  ƒ D]. } | | k rd t | | t |  | ƒ ƒ qd qd W| S(   NR   (   t   typest
   ModuleTypet   sett   itemsR   t   dirt   setattr(   R   t   conditional_namest   conditional_libt   excluded_namest	   conditiont   namest   attr(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   build_conditional_libraryQ   s    	 t   Bindingc        	   B` sÔ   e  Z d  Z d Z e Z e Z d Z d Z	 e
 j ƒ  Z e
 j ƒ  Z e j d d ƒ Z e j d d ƒ Z e j d e d e d e d e ƒ ƒ Z d „  Z e d	 „  ƒ Z e d
 „  ƒ Z e d „  ƒ Z e d „  ƒ Z RS(   s   
    OpenSSL API wrapper.
    s   const char[]t   osrandomt   osrandom_engines   RAND_METHOD *t   bytest
   pseudorandt   statusc         C` s   |  j  ƒ  d  S(   N(   t   _ensure_ffi_initialized(   t   self(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   __init__t   s    c         C` s[  t  |  j |  j j ƒ  d k ƒ |  j j ƒ  } t  |  j | |  j j k ƒ zá |  j j | |  j ƒ } t  |  j | d k ƒ |  j j | |  j	 ƒ } t  |  j | d k ƒ |  j j
 | |  j ƒ } t  |  j | d k ƒ |  j j | ƒ } | d k r*t |  j ƒ } t  |  j | d j |  j j k ƒ n  Wd  |  j j | ƒ } t  |  j | d k ƒ Xd  S(   Ni    i   (   R   R   t   ERR_peek_errort
   ENGINE_newR   t   NULLt   ENGINE_set_idt   _osrandom_engine_idt   ENGINE_set_namet   _osrandom_engine_namet   ENGINE_set_RANDt   _osrandom_methodt
   ENGINE_addR   R
   t   ENGINE_R_CONFLICTING_ENGINE_IDt   ENGINE_free(   t   clst   engineR*   R   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   _register_osrandom_enginew   s$    !c         C` sl   |  j  ] |  j sb t t t ƒ |  _ t |  _ |  j j ƒ  |  j j ƒ  |  j j ƒ  |  j	 ƒ  n  Wd  QXd  S(   N(
   t
   _init_lockt   _lib_loadedR:   R   R   R   t   SSL_library_initt   OpenSSL_add_all_algorithmst   SSL_load_error_stringsRR   (   RP   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyRA      s    
		c         C` sÁ   |  j  ² |  j ƒ  |  j sD t d d d ƒ} | |  j ƒ |  _ n  t d ƒ |  j j ƒ  |  j j	 k rm d  S|  j j
 ƒ  } g  t | ƒ D] } t j ƒ  ^ q‰ |  _ |  j j |  j ƒ Wd  QXd  S(   Ns!   void(int, int, const char *, int)R   t   Cryptography_locking_cbt   _ssl(   t   _lock_init_lockRA   t   _lock_cb_handleR!   t   _lock_cbt
   __import__R   t   CRYPTO_get_locking_callbackR   RF   t   CRYPTO_num_lockst   ranget	   threadingt   Lockt   _lockst   CRYPTO_set_locking_callback(   RP   R    t	   num_lockst   n(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   init_static_locksž   s    

		
(c         C` si   |  j  | } | |  j j @r* | j ƒ  n; | |  j j @rG | j ƒ  n t d j | | | | ƒ ƒ ‚ d  S(   Ns4   Unknown lock mode {0}: lock={1}, file={2}, line={3}.(   Rc   R   t   CRYPTO_LOCKt   acquiret   CRYPTO_UNLOCKt   releaset   RuntimeErrorR   (   RP   t   modeRf   t   filet   linet   lock(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyR\   ¸   s    N(   t   __name__t
   __module__t   __doc__t   NoneR   R   t   FalseRT   Rc   R[   Ra   Rb   RS   RZ   t   newRH   RJ   t   dictR+   R-   RL   RC   t   classmethodRR   RA   Rg   R\   (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyR;   _   s(   	i  s§   OpenSSL versions less than 1.0.1 are no longer supported by the OpenSSL project, please upgrade. A future version of cryptography will drop support for these versions.(   t
   __future__R    R   R   t   collectionsR%   Ra   R.   t   warningst   cryptography.exceptionsR   t%   cryptography.hazmat.bindings._opensslR   R   t1   cryptography.hazmat.bindings.openssl._conditionalR   t
   namedtupleR   R   R   R!   R+   R-   R:   t   objectR;   Rg   t   SSLeayt   warnt   DeprecationWarning(    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   <module>   s0   						n
