U
    ;gF/                     @   s`  d Z ddlmZmZmZm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mZmZ dd	d
dddddddddddddddddddddd d!d"gZe d#krdd$lmZ i Ze Zd%d Zd&d' Zd(d
 Zd)d Zdfd*d"Zd+d Zd,d Zd-d Zdgd.dZd/d Zd0d Zd1d Z d2d	 Z!d3d Z"d4d Z#d5d Z$dhd6dZ%did7dZ&d8d Z'd9d Z(d:d! Z)d;d Z*d<d Z+d=d  Z,d>d Z-d?d Z.d#Z/nddl0Z0dd@l0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 ee3e07e0j8f Z9dAdAdAdAdBZ:e5e6e3e07e3e2e4e0j;e0j<dCZ=ejdDkrhddEl0m>Z> e:?dAdAdAdAdF e=?e0j8e3e6e3e6e>j@e>jAe07e0j8e07e07e0j8dG	 dHdI ZBdJd ZdKd
 ZdLd ZdjdMd"ZdNd ZdOd ZdPd ZdkdQdZdRd ZdSd ZdTd Z dUd	 Z!dVd Z"dWd Z#dXd Z$dldYdZ%dmdZdZ&d[d Z'd\d Z(d]d! Z)d^d Z*d_d Z+d`d  Z,dad Z-dbd Z.dcZ/ddd ZCG ded deDZEdS )nzK
Exceptions and compatibility shims for consistently using ctypes and cffi
    )unicode_literalsdivisionabsolute_importprint_functionN)find_library   )ffi)str_clsbyte_cls	int_typesbytes_to_listarray_from_pointer	array_setbuffer_from_bytesbuffer_from_unicodebuffer_pointer
byte_arraybyte_string_from_bufferbytes_from_buffercallbackcastdereferrnoFFIEngineErrorget_libraryis_nullnativenewnullpointer_setrefregister_ffisizeofstructstruct_bytesstruct_from_bufferunwrapwrite_to_buffercffi)FFIc                 C   s   |t | < d S N)_ffi_registrylibraryffi_obj r/   1/tmp/pip-unpacked-wheel-x1gypflw/oscrypto/_ffi.pyr!   8   s    c                 C   s   | t krt |  S tS r*   )r+   r   )r-   r/   r/   r0   _get_ffi;   s    r1   c                 C   s"   t jdkrtd| S td| S )Nwin32zunsigned char[]zchar[])sysplatformr   r   Zinitializerr/   r/   r0   r   @   s    
c                 C   s   t d| S )Nz
wchar_t []r   r   r5   r/   r/   r0   r   E   s    c                 C   s   || ||t | < d S r*   )lenbufferdataoffsetr/   r/   r0   r'   H   s    c                 C   s   t d| gS )Nzchar *[]r6   r9   r/   r/   r0   r   K   s    c                 C   s   t | }|||S r*   )r1   r   )r-   type_valuer.   r/   r/   r0   r   N   s    c                 C   s   t | }||S r*   )r1   r"   )r-   r>   r.   r/   r/   r0   r"   R   s    c                 C   s.   |d k	rt | |d d  S t | d d  S r*   r   r9   r9   maxlenr/   r/   r0   r   V   s    c                 C   s
   t | S r*   )r   stringr<   r/   r/   r0   r   [   s    c                 C   s   | S r*   r/   byte_stringr/   r/   r0   r   ^   s    c                 C   s   || d< d S Nr   r/   Zpointer_r>   r/   r/   r0   r   a   s    c                 C   s   t |D ]\}}|| |< qd S r*   	enumeratearrayr>   indexvalr/   r/   r0   r   d   s    c                   C   s   t jS r*   )r   NULLr/   r/   r/   r0   r   h   s    c                 C   sH   | d krdS | t jkrdS t t | dkr2dS | d t jkrDdS dS )NTvoid *Fr   )r   rM   getctypetypeofpointr/   r/   r0   r   k   s    
c                   C   s   t jS r*   )r   r   r/   r/   r/   r0   r   v   s    c                 C   sJ   t | }g }|d k	r|| |tddgkr:||dS |j|f| S )NZBCRYPT_KEY_HANDLEZBCRYPT_ALG_HANDLEr   )r1   appendsetr   r   )r-   r=   r>   r.   paramsr/   r/   r0   r   y   s    
c                 C   s   | | S r*   r/   r>   r;   r/   r/   r0   r       s    c                 C   s4   | t krt|S | tkr,t|d d  S | |S r*   )r	   r   rB   r
   r9   r=   r>   r/   r/   r0   r      s
    
c                 C   s   | d S rE   r/   rQ   r/   r/   r0   r      s    c                 C   s   | d S rE   r/   rQ   r/   r/   r0   r&      s    c                 C   s   t | }|d| S )N%s *)r1   r   )r-   namer.   r/   r/   r0   r#      s    c                 C   s   t | d d  S r*   r?   Zstruct_r/   r/   r0   r$      s    c                 C   sR   t | }|d| }|d }t| |}||}|||d d  |d d < |S )NrX   r   )r1   r   r"   r9   )r-   rY   r9   r.   Znew_struct_pointerZ
new_structZstruct_sizeZstruct_bufferr/   r/   r0   r%      s    

c                 C   s   t | }|d||f |}||}|dkr2g S g }ddddddd}||k}	td|D ]$}
||
 }|	rt||}|| qZ|S )Nz%s[%s]r   T)LPSTRLPCSTRLPWSTRLPCWSTRchar *	wchar_t *)r1   r   r"   rangerB   rS   )r-   rY   rR   sizer.   rJ   total_bytesoutputstring_typesZstring_typeir>   r/   r/   r0   r      s(    

c                 C   s   t | }|||S r*   )r1   r   )r-   Zsignature_namefuncr.   r/   r/   r0   r      s    )pointerc_intc_char_pc_uintc_void_p	c_wchar_pT)rN   r`   r_   char **)rN   r`   r_   rn   intzunsigned intZsize_tZuint32_tr2   )wintypes)r[   r]   r\   r^   )	ZBYTEr[   r]   r\   r^   ULONGDWORDr_   rn   c                 C   s   |dd  dk}|r |d d }|dd  dko6|t k}|rH|d d }|ddk}|r||dd |d }|d	krd
}nt|}|d|d }|tkrt| }n
t| |}|rt|}|||fS )Nz **z *[r   ] Tr   )_pointer_typesfindro   	_type_mapgetattrctypesPOINTER)r-   r=   Zis_double_pointer
is_pointeris_arrayr/   r/   r0   
_type_info   s&    


r   c                 C   s   d S r*   r/   r,   r/   r/   r0   r!     s    c                 C   s
   t | S r*   )r}   create_string_bufferr5   r/   r/   r0   r     s    c                 C   s
   t | S r*   )r}   create_unicode_bufferr5   r/   r/   r0   r     s    c                 C   sP   t | ttjr(t| |t| d S |dkr8|| _n| jd| | | _d S rE   )
isinstancer}   r~   c_bytememmover7   r>   rawr8   r/   r/   r0   r'     s    c                 C   s   t t| tS r*   )rh   r}   r   rj   r<   r/   r/   r0   r     s    c                 C   s8   t | |\}}}|r t|}n|r,|| }t||S r*   )r   r}   r~   r   )r-   r=   r>   r   r   r/   r/   r0   r     s    c                 C   s
   t |S r*   )r}   r"   )r-   r>   r/   r/   r0   r"   (  s    c                 C   s2   t | trt| |S |d k	r,| jd| S | jS rE   )r   _pointer_int_typesr}   	string_atr   r@   r/   r/   r0   r   +  s
    
c                 C   s   | j S r*   )r>   r<   r/   r/   r0   r   2  s    c                 C   s   t jt|  t|  S r*   )r}   r   r7   r   rC   r/   r/   r0   r   5  s    c                 C   s   || j _d S r*   )contentsr>   rF   r/   r/   r0   r   8  s    c                 C   s   t |D ]\}}|| |< qd S r*   rG   rI   r/   r/   r0   r   ;  s    c                   C   s   d S r*   r/   r/   r/   r/   r0   r   ?  s    c                 C   s
   t |  S r*   )boolrQ   r/   r/   r0   r   B  s    c                   C   s   t  S r*   )r}   	get_errnor/   r/   r/   r0   r   E  s    c                 C   s`   t | |\}}}|r2|dkr*|| }d }n|| }g }|d k	rH|| || }|r\t|}|S )NT)r   rS   rh   )r-   r=   r>   r   r   rU   rd   r/   r/   r0   r   H  s    
c                 C   s0   |dkrt | S t t | | t t jS rE   )r}   byrefr   	addressofr~   r   rV   r/   r/   r0   r    [  s    
c                 C   sd   t || r|S tjdk r.| tkr.t |tr.|S t |tjrZ|jtjkrZt	t
||jS | |jS )N)   )r   r3   version_inforo   r   r}   Array_type_r   r   r   _length_r>   rW   r/   r/   r0   r   `  s    
c                 C   s   | d S rE   r/   rQ   r/   r/   r0   r   i  s    c                 C   s   | j S r*   )r   rQ   r/   r/   r0   r&   l  s    c                 C   s   t t| | S r*   )rh   r|   )r-   rY   r/   r/   r0   r#   o  s    c                 C   s   t | t | jS r*   )r}   r   r"   r   rZ   r/   r/   r0   r$   r  s    c                 C   s4   t | |}| }tt||t| t|S r*   )r|   r}   r   r   r"   rh   )r-   r=   r9   class_r>   r/   r/   r0   r%   u  s    
c                 C   sH   t | |\}}}t|t|}g }td|D ]}|||  q0|S rE   )r   r}   r   r~   ra   rS   )r-   r=   rR   rb   _rJ   rd   rf   r/   r/   r0   r   {  s    c                 C   s   t | ||S r*   )r|   )r-   Zsignature_typerg   r/   r/   r0   r     s    r}   c                 C   sp   t | }tjdkrld| }|dd| }tttt d d}|sX|dkrX|}n|dkrl||krl|}|S )	a  
    Retrieve the C library path with special handling for Mac

    :param name:
        A unicode string of the library to search the system for

    :param dylib_name:
        Mac only - a unicode string of the unversioned dylib name

    :param version:
        Mac only - a unicode string of the dylib version to use. Used on macOS
        10.15+ when the unversioned dylib is found, since unversioned
        OpenSSL/LibreSSL are just placeholders, and a versioned dylib must be
        imported. Used on macOS 10.16+ when find_library() doesn't return a
        result, due to system dylibs not being present on the filesystem any
        longer.

    :return:
        A unicode string of the path to the library
    darwinz/usr/lib/%sz.dylibz	.%s.dylibr   .)
      )r      )	r   r3   r4   replacetuplemapro   mac_versplit)rY   Z
dylib_nameversionr-   ZunversionedZ	versionedr   r/   r/   r0   r     s    
c                   @   s   e Zd ZdZdS )r   z@
    An exception when trying to instantiate ctypes or cffi
    N)__name__
__module____qualname____doc__r/   r/   r/   r0   r     s   )r   )N)N)r   )r   )N)N)r   )Fr   
__future__r   r   r   r   r3   r4   Zctypes.utilr   rx   r   _typesr	   r
   r   r   __all__r(   r)   r+   r!   r1   r   r   r'   r   r   r"   r   r   r   r   r   r   r   r   r   r    r   r   r&   r#   r$   r%   r   r   Zenginer}   rh   ri   rj   rk   rl   rm   r~   r   r   ry   c_size_tc_uint32r{   rp   updaterq   rr   r   r   	Exceptionr   r/   r/   r/   r0   <module>   s  




	 







	&