o
    e'                     @   sn  d dl Z d dlZd dlZd dlmZ d dlmZ ejd  dk r:d dlZg Z	e
 D ]\ZZZeejkr8e	e q)n	d dlmZ ejZ	eefZG dd deZz]dejvr_ejjd	kr_ed
d dlmZ e ZejZ e!e"dZ#e"dj$j%Z&dd Z'dd Z(e(Z)e(Z*e(Z+dd Z,d8ddZ-dd Z.dd Z/dd Z0G dd deZ1dd Z2d Z3W nt ey    d dl4Z4d d!l4m5Z5m6Z6m7Z7m(Z(m)Z)m,Z,m-Z-m+Z+m*Z* d d"l8m9Z9 d d#l4m:Z& dZ g Z;d$d% Z+d&d Z'd'd Z.d(d Z/e4j<Z=d Z>e4j?j@ZAe4j?jBZCe4jDZEe4Fe=ZGG d)d* d*e4jHZId+d Z0G d,d- d-eZJd.d Z2d/Z3Y nw G d0d1 d1eZKd2d3 ZLd4d5 ZMd6d7 ZNdS )9    N)byte_string)pycryptodome_filename   )	machineryc                   @   s(   e Zd Zejdd Zejdd ZdS )_VoidPointerc                 C      dS )z&Return the memory location we point toN selfr   r   :/usr/lib/python3/dist-packages/Cryptodome/Util/_raw_api.pyget:      z_VoidPointer.getc                 C   r   )z$Return a raw pointer to this pointerNr   r	   r   r   r   
address_of?   r   z_VoidPointer.address_ofN)__name__
__module____qualname__abcabstractmethodr   r   r   r   r   r   r   9   s
    
r   __pypy__   z0CFFI with optimize=2 fails due to pycparser bug.)FFIzconst uint8_t*z
uint8_t[1]c                 C   s<   t tdrtdst| tj}nt| }t| |S )zLoad a shared library and return a handle to it.

        @name,  either an absolute path or the name of a library
                in the system search path.

        @cdecl, the C function declarations.
        RTLD_DEEPBINDPYCRYPTODOME_DISABLE_DEEPBIND)hasattrffiosgetenvdlopenr   cdef)namecdecllibr   r   r   load_libW   s
   	

r"   c                 C      | S )z)Convert a Python integer to unsigned longr   xr   r   r   c_ulongg      r&   c                 C   r#   )z"Convert a Python integer to size_tr   r$   r   r   r   c_size_to   r'   r(   c                 C   sT   t | trtt| d |}td|}| |dd< |S |r"tdtd| }|S )z7Allocate the given amount of bytes (initially set to 0)   z	uint8_t[]Nz Size must be specified once only)
isinstancebytesmaxlenr   new
ValueError)init_or_sizesizeresultr   r   r   create_string_buffers   s   
r3   c                 C   s
   t | S )z.Convert a C string into a Python byte sequence)r   stringc_stringr   r   r   get_c_string   s   
r7   c                 C   s   t | dd S )z.Convert a C buffer into a Python byte sequenceN)r   bufferbufr   r   r   get_raw_buffer   s   r;   c                 C   sB   t | trttt| S t| st | tr| S tdt	|  Nz)Object type %s cannot be passed to C code)
r*   _buffer_typer   castuint8_t_typefrom_bufferr   _Array	TypeErrortype)datar   r   r   c_uint8_ptr   s
   
rE   c                   @   (   e Zd ZdZdd Zdd Zdd ZdS )	VoidPointer_cffi'Model a newly allocated pointer to voidc                 C   s   t d| _d S )Nz	void *[1])r   r.   _ppr	   r   r   r   __init__   s   zVoidPointer_cffi.__init__c                 C   s
   | j d S )Nr   rI   r	   r   r   r   r         
zVoidPointer_cffi.getc                 C      | j S NrK   r	   r   r   r   r         zVoidPointer_cffi.address_ofNr   r   r   __doc__rJ   r   r   r   r   r   r   rG      
    rG   c                   C      t  S rN   )rG   r   r   r   r   VoidPointer   rO   rT   cffi)	CDLLc_void_pbyrefr&   c_ulonglongr(   r3   c_ubytec_uint)find_library)Arrayc                 C   s*   d|   krdk st   t  t| S )Nr      )OverflowErrorctypesrZ   )cr   r   r   rZ      s
   
rZ   c                 C   s^   t sdd l}| t d d < t \}}d| vr+|ds+t| }|d u r)td|  |} t| S )Nr   .WinzCannot load library '%s')cached_architectureplatformarchitecture
startswithr\   OSErrorrV   )r   r    re   bitslinkage	full_namer   r   r   r"      s   c                 C   rM   rN   )valuer5   r   r   r   r7      rO   c                 C   rM   rN   )rawr9   r   r   r   r;      rO   c                   @   s   e Zd Zdefdejfdefdefdejfdejfdejfde	fd	e	fd
e	fdefgZ
ejd dkr>e
dded f dS dS )
_Py_bufferr:   objr-   itemsizereadonlyndimformatshapestrides
suboffsetsinternalr   r   
smalltableN)r   r   r   rW   r`   	py_object
_c_ssize_tc_intc_char_p
_c_ssize_p_fields_sysversion_infoinsertr   r   r   r   rn      s     rn   c              	   C   s   t | s	t| tr| S t| tr:t| }t }t|t|t zt	j
|j }||jW tt| S tt| w tdt|  r<   )r   r*   rA   r=   
_py_objectrn   _PyObject_GetBufferrX   _PyBUF_SIMPLEr`   rZ   r-   from_addressr:   _PyBuffer_ReleaserB   rC   )rD   ro   r:   buffer_typer   r   r   rE      s   
c                   @   rF   )	VoidPointer_ctypesrH   c                 C   s   t  | _d S rN   )rW   _pr	   r   r   r   rJ      s   zVoidPointer_ctypes.__init__c                 C   rM   rN   )r   r	   r   r   r   r      rO   zVoidPointer_ctypes.getc                 C   s
   t | jS rN   )rX   r   r	   r   r   r   r      rL   zVoidPointer_ctypes.address_ofNrP   r   r   r   r   r      rR   r   c                   C   rS   rN   )r   r   r   r   r   rT     rO   r`   c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )SmartPointerz+Class to hold a non-managed piece of memoryc                 C   s   || _ || _d S rN   )_raw_pointer_destructor)r
   raw_pointer
destructorr   r   r   rJ     s   
zSmartPointer.__init__c                 C   rM   rN   r   r	   r   r   r   r     rO   zSmartPointer.getc                 C   s   | j d }| _ |S rN   r   )r
   rpr   r   r   release  s   zSmartPointer.releasec                 C   s>   z| j d ur| | j  d | _ W d S W d S  ty   Y d S w rN   )r   r   AttributeErrorr	   r   r   r   __del__  s   
zSmartPointer.__del__N)r   r   r   rQ   rJ   r   r   r   r   r   r   r   r     s    r   c           
      C   s   |  d}|dd |d }}g }tD ]?}z || }t||}tj|s/|d|  W qt||W   S  tyS }	 z|d|t	|	f  W Y d}	~	qd}	~	ww td| d
|f )zLoad a shared library and return a handle to it.

    @name,  the name of the library expressed as a PyCryptodome module,
            for instance Cryptodome.Cipher._raw_cbc.

    @cdecl, the C function declarations.
    rb   Nrx   zNot found '%s'zCannot load '%s': %sz"Cannot load native module '%s': %sz, )splitextension_suffixesr   r   pathisfileappendr"   rh   strjoin)
r   r    r   	dir_compsbasenameattemptsextfilenamerk   expr   r   r   load_pycryptodome_raw_lib  s    
	
"r   c                 C   s   t | tttfS )z5Return True if object x supports the buffer interface)r*   r+   	bytearray
memoryviewr$   r   r   r   	is_buffer8  s   r   c                 C   s   t | tpt | to| j S rN   )r*   r   r   rq   r$   r   r   r   is_writeable_buffer=  s   
r   rN   )Or   r   r   Cryptodome.Util.py3compatr   Cryptodome.Util._file_systemr   r   impr   get_suffixesr   modtypC_EXTENSIONr   	importlibr   EXTENSION_SUFFIXESr   r   r=   objectr   builtin_module_namesflagsoptimizeImportErrorrU   r   r   NULLnull_pointertypeofr.   r?   	__class__	__bases__rA   r"   r&   rY   r[   rZ   r(   r3   r7   r;   rE   rG   rT   backendr`   rV   rW   rX   ctypes.utilr\   r]   rd   	c_ssize_tr{   r   	pythonapiPyObject_GetBufferr   PyBuffer_Releaser   rz   r   POINTERr~   	Structurern   r   r   r   r   r   r   r   r   r   <module>   s   


	,
f