a
    Ç `¸  ã                   @   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	m
Z
 d dlmZmZ d dlmZ e dg d¢¡ZG d	d
„ d
eƒZdd„ Zdd„ Zdd„ Zddd„Zdd„ ZG dd„ deƒZdd„ Zeejƒ e ¡  dS )é    )Úabsolute_importÚdivisionÚprint_functionN)Úutils)ÚInternalError)ÚffiÚlib)ÚCONDITIONAL_NAMESÚ_OpenSSLErrorWithText)Úcoder   ÚfuncÚreasonZreason_textc                   @   sD   e Zd Zdd„ Zdd„ Ze d¡Ze d¡Ze d¡Z	e d¡Z
d	S )
Ú_OpenSSLErrorc                 C   s   || _ || _|| _|| _d S ©N)Ú_codeÚ_libÚ_funcÚ_reason)Úselfr   r   r   r   © r   úN/usr/lib/python3/dist-packages/cryptography/hazmat/bindings/openssl/binding.pyÚ__init__   s    z_OpenSSLError.__init__c                 C   s   || j ko|| jkS r   )r   r   )r   r   r   r   r   r   Ú_lib_reason_match   s    z_OpenSSLError._lib_reason_matchr   r   r   r   N)Ú__name__Ú
__module__Ú__qualname__r   r   r   Zread_only_propertyr   r   r   r   r   r   r   r   r      s   


r   c                 C   sN   g }|   ¡ }|dkrqJ|  |¡}|  |¡}|  |¡}| t||||ƒ¡ q|S )Nr   )ZERR_get_errorZERR_GET_LIBZERR_GET_FUNCZERR_GET_REASONÚappendr   )r   Úerrorsr   Zerr_libZerr_funcZ
err_reasonr   r   r   Ú_consume_errors&   s    


r   c              	   C   sZ   g }| D ]L}t  dd¡}t |j|t|ƒ¡ t  |¡}| t|j|j|j	|j
|ƒ¡ q|S )Nzchar[]é   )r   Únewr   ZERR_error_string_nr   ÚlenÚstringr   r
   r   r   )r   Úerrors_with_textÚerrZbufZerr_text_reasonr   r   r   Ú_errors_with_text6   s    
ÿÿr%   c                 C   s   t t| ƒƒS r   )r%   r   )r   r   r   r   Ú_consume_errors_with_textF   s    r&   c                 C   s0   |s,|d u rt | ƒ}t|ƒ}td |¡|ƒ‚d S )Nai  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%   r   Úformat)r   Úokr   r#   r   r   r   Ú_openssl_assertJ   s    úør)   c                 C   sj   t  d¡}| |_tƒ }| ¡ D ]\}}t| |ƒs| |ƒ ¡ qt| ƒD ]}||vrFt||t| |ƒƒ qF|S )Nr   )	ÚtypesÚ
ModuleTypeZ_original_libÚsetÚitemsÚgetattrÚupdateÚdirÚsetattr)r   Zconditional_namesZconditional_libZexcluded_namesZ	conditionZnames_cbÚattrr   r   r   Úbuild_conditional_library\   s    

r3   c                   @   sP   e Zd ZdZdZeZdZe ¡ Z	dd„ Z
edd„ ƒZedd	„ ƒZed
d„ ƒZdS )ÚBindingz
    OpenSSL API wrapper.
    NFc                 C   s   |   ¡  d S r   ©Ú_ensure_ffi_initialized)r   r   r   r   r   u   s    zBinding.__init__c                 C   s0   | j  ¡  | j jr,| j  ¡ }t| j |dv ƒ d S )N)é   é   )r   ZERR_clear_errorZ"CRYPTOGRAPHY_NEEDS_OSRANDOM_ENGINEZ Cryptography_add_osrandom_enginer)   )ÚclsÚresultr   r   r   Ú_register_osrandom_enginex   s    

z!Binding._register_osrandom_enginec                 C   s^   | j D | js<tttƒ| _d| _| j ¡  | j ¡  |  ¡  W d   ƒ n1 sP0    Y  d S )NT)Ú
_init_lockÚ_lib_loadedr3   r   r	   ZSSL_library_initZOpenSSL_add_all_algorithmsr;   ©r9   r   r   r   r6   „   s    

zBinding._ensure_ffi_initializedc                 C   s   |   ¡  d S r   r5   r>   r   r   r   Úinit_static_locks   s    zBinding.init_static_locks)r   r   r   Ú__doc__r   r   r=   Ú	threadingZLockr<   r   Úclassmethodr;   r6   r?   r   r   r   r   r4   k   s   

r4   c                 C   s.   t  tj¡}|  d¡|kr*td | |¡ƒ‚d S )NÚasciia  The version of cryptography does not match the loaded shared object. This can happen if you have multiple copies of cryptography installed in your Python path. Please try creating a new virtual environment to resolve this issue. Loaded python version: {}, shared object version: {})r   r"   r   ZCRYPTOGRAPHY_PACKAGE_VERSIONÚencodeÚImportErrorr'   )ÚversionZso_package_versionr   r   r   Ú_verify_package_version•   s    ûÿrG   )N)Z
__future__r   r   r   ÚcollectionsrA   r*   Zcryptographyr   Zcryptography.exceptionsr   Z%cryptography.hazmat.bindings._opensslr   r   Z1cryptography.hazmat.bindings.openssl._conditionalr	   Ú
namedtupler
   Úobjectr   r   r%   r&   r)   r3   r4   rG   Ú__version__r?   r   r   r   r   Ú<module>   s*   ÿ
*
