σ
Υ{PXc           @` s1  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 e j d d d d	 d
 d g  Z d   Z d   Z d   Z d   Z d e f d     YZ d   Z e j   e e j j    d S(   i    (   t   absolute_importt   divisiont   print_functionN(   t   InternalError(   t   ffit   lib(   t   CONDITIONAL_NAMESt   _OpenSSLErrort   codeR   t   funct   reasont   _OpenSSLErrorWithTextt   reason_textc         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` s   | s t  |   } g  } xZ | D]R } t j |  j | j t j   } | j t | j | j | j	 | j
 |   q Wt d j |  |   n  d  S(   Nsi  Unknown OpenSSL error. This error is commonly encountered when another library is not cleaning up the OpenSSL error stack. If you are using cryptography with another library that uses OpenSSL try disabling it before reporting a bug. Otherwise please file an issue at https://github.com/pyca/cryptography/issues with information on how to reproduce this. ({0!r})(   R   R   t   stringt   ERR_error_stringR   t   NULLR   R   R   R	   R
   R   t   format(   R   t   okR   t   errors_with_textt   errt   err_text_reason(    (    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   wrapperH   s
    	(    (   R'   R!   R&   R(   (    (   R&   R!   R'   sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   ffi_callbackB   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_libraryU   s    	 t   Bindingc           B` sn   e  Z d  Z d Z e Z e Z e j	   Z
 e j	   Z d   Z e d    Z e d    Z e d    Z RS(   s   
    OpenSSL API wrapper.
    c         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__m   s    c         C` sf   t  |  j |  j j   d k  |  j j |  _ |  j j |  _ |  j j   } t  |  j | d k  d  S(   Ni    i   i   (   i   i   (   R    R   t   ERR_peek_errort   Cryptography_osrandom_engine_idt   _osrandom_engine_idt!   Cryptography_osrandom_engine_namet   _osrandom_engine_namet    Cryptography_add_osrandom_engine(   t   clst   result(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   _register_osrandom_enginep   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_loadedR6   R   R   R   t   SSL_library_initt   OpenSSL_add_all_algorithmst   SSL_load_error_stringsRC   (   RA   (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyR8   x   s    
		c         C` si   |  j  Z |  j   t d  |  j j   |  j j k r= d  St j   } t |  j | d k  Wd  QXd  S(   Nt   _ssli   (	   t   _lock_init_lockR8   t
   __import__R   t   CRYPTO_get_locking_callbackR   R   t   _setup_ssl_threadsR    (   RA   t   res(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   init_static_locks   s    


N(   t   __name__t
   __module__t   __doc__t   NoneR   R   t   FalseRE   t	   threadingt   LockRD   RJ   R:   t   classmethodRC   R8   RO   (    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyR7   c   s   	c         C` sD   |  d k  r@ t  j j d  r1 t j d t  q@ t d   n  d  S(   Ni  t   CRYPTOGRAPHY_ALLOW_OPENSSL_100s   OpenSSL version 1.0.0 is no longer supported by the OpenSSL project, please upgrade. The next version of cryptography will completely remove support for it.s   You are linking against OpenSSL 1.0.0, which is no longer support by the OpenSSL project. You need to upgrade to a newer version of OpenSSL.(   t   ost   environt   gett   warningst   warnt   DeprecationWarningt   RuntimeError(   t   version(    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   _verify_openssl_version   s    
(   t
   __future__R    R   R   t   collectionsRY   RU   R*   R\   t   cryptography.exceptionsR   t%   cryptography.hazmat.bindings._opensslR   R   t1   cryptography.hazmat.bindings.openssl._conditionalR   t
   namedtupleR   R   R   R    R)   R6   t   objectR7   Ra   RO   t   SSLeay(    (    (    sP   /usr/lib/python2.7/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyt   <module>   s(   					4	
