a
    !f'                     @   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 rtd dlZg Z	e
 D ]\ZZZeejkrRe	e qRnd dlmZ ejZ	eefZG dd deZzdejvrejjd	kre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 n 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0 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   s   dS )z&Return the memory location we point toN selfr   r   Y/var/www/html/python-backend/venv/lib/python3.9/site-packages/Cryptodome/Util/_raw_api.pyget:   s    z_VoidPointer.getc                 C   s   dS )z$Return a raw pointer to this pointerNr   r   r   r   r
   
address_of?   s    z_VoidPointer.address_ofN)__name__
__module____qualname__abcabstractmethodr   r   r   r   r   r
   r   9   s   
r   Z__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_DEEPBINDZPYCRYPTODOME_DISABLE_DEEPBIND)hasattrffiosgetenvZdlopenr   Zcdef)namecdecllibr   r   r
   load_libW   s
    	

r   c                 C   s   | S )z)Convert a Python integer to unsigned longr   xr   r   r
   c_ulongg   s    r   c                 C   s   | S )z"Convert a Python integer to size_tr   r   r   r   r
   c_size_to   s    r    c                 C   sR   t | tr6tt| d |}td|}| |dd< n|rBt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)Zinit_or_sizesizeresultr   r   r
   create_string_buffers   s    
r*   c                 C   s
   t | S )z.Convert a C string into a Python byte sequence)r   stringZc_stringr   r   r
   get_c_string   s    r-   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    r1   c                 C   sF   t | trttt| S t| s.t | tr2| S tdt	|  d S Nz)Object type %s cannot be passed to C code)
r"   _buffer_typer   castuint8_t_typeZfrom_bufferr   _Array	TypeErrortype)datar   r   r
   c_uint8_ptr   s
    
r:   c                   @   s(   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   r=   r   r   r   r
   r      s    zVoidPointer_cffi.getc                 C   s   | j S Nr?   r   r   r   r
   r      s    zVoidPointer_cffi.address_ofNr   r   r   __doc__r>   r   r   r   r   r   r
   r;      s   r;   c                   C   s   t  S r@   )r;   r   r   r   r
   VoidPointer   s    rC   cffi)	CDLLc_void_pbyrefr   c_ulonglongr    r*   c_ubytec_uint)find_library)Arrayc                 C   s&   d|   krdk sn t  t| S )Nr      )OverflowErrorctypesrI   )cr   r   r
   rI      s    rI   c                 C   s^   t sdd l}| t d d < t \}}d| vrV|dsVt| }|d u rRtd|  |} t| S )Nr   .ZWinzCannot load library '%s')cached_architectureplatformarchitecture
startswithrK   OSErrorrE   )r   r   rS   bitslinkage	full_namer   r   r
   r      s    c                 C   s   | j S r@   )valuer,   r   r   r
   r-      s    c                 C   s   | j S r@   )rawr/   r   r   r
   r1      s    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rxe
dded f dS )
_Py_bufferr0   objr%   itemsizereadonlyndimformatshapestrides
suboffsetsZinternalr   r   Z
smalltableN)r   r   r   rF   rO   	py_object
_c_ssize_tc_intc_char_p
_c_ssize_pZ_fields_sysversion_infoinsertr   r   r   r
   r\      s   r\   c              	   C   s   t | st| tr| S t| trvt| }t }t|t|t z&t	j
|j }||jW tt| S tt| 0 ntdt|  d S r2   )r   r"   r6   r3   
_py_objectr\   _PyObject_GetBufferrG   _PyBUF_SIMPLErO   rI   r%   Zfrom_addressr0   _PyBuffer_Releaser7   r8   )r9   r]   r0   Zbuffer_typer   r   r
   r:      s    
c                   @   s(   e Zd ZdZdd Zdd Zdd ZdS )	VoidPointer_ctypesr<   c                 C   s   t  | _d S r@   )rF   _pr   r   r   r
   r>      s    zVoidPointer_ctypes.__init__c                 C   s   | j S r@   )rs   r   r   r   r
   r      s    zVoidPointer_ctypes.getc                 C   s
   t | jS r@   )rG   rs   r   r   r   r
   r      s    zVoidPointer_ctypes.address_ofNrA   r   r   r   r
   rr      s   rr   c                   C   s   t  S r@   )rr   r   r   r   r
   rC     s    rO   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 r@   )_raw_pointer_destructor)r	   Zraw_pointerZ
destructorr   r   r
   r>     s    zSmartPointer.__init__c                 C   s   | j S r@   ru   r   r   r   r
   r     s    zSmartPointer.getc                 C   s   | j d  }| _ |S r@   rw   )r	   rpr   r   r
   release  s    zSmartPointer.releasec                 C   s8   z | j d ur| | j  d | _ W n ty2   Y n0 d S r@   )ru   rv   AttributeErrorr   r   r   r
   __del__  s    

zSmartPointer.__del__N)r   r   r   rB   r>   r   ry   r{   r   r   r   r
   rt     s
   rt   c           
      C   s   |  d}|dd |d  }}g }tD ]}z@|| }t||}tj|s^|d|  W q(t||W   S  ty }	 z"|d|t	|	f  W Y d}	~	q(d}	~	0 0 q(td| d
|f dS )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.
    rQ   Nre   zNot found '%s'zCannot load '%s': %sz"Cannot load native module '%s': %sz, )splitextension_suffixesr   r   pathisfileappendr   rV   strjoin)
r   r   r|   Z	dir_compsbasenameZattemptsextfilenamerY   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 r@   )r"   r   r   r_   r   r   r   r
   is_writeable_buffer=  s    
r   )N)Or   r   rk   ZCryptodome.Util.py3compatr   ZCryptodome.Util._file_systemr   rl   impr}   Zget_suffixesr   modtypC_EXTENSIONr   	importlibr   EXTENSION_SUFFIXESr   r   r3   objectr   builtin_module_namesflagsoptimizeImportErrorrD   r   r   ZNULLZnull_pointerZtypeofr&   r5   	__class__	__bases__r6   r   r   rH   rJ   rI   r    r*   r-   r1   r:   r;   rC   backendrO   rE   rF   rG   Zctypes.utilrK   rL   rR   Z	c_ssize_trg   rp   Z	pythonapiZPyObject_GetBufferro   ZPyBuffer_Releaserq   rf   rn   ZPOINTERrj   Z	Structurer\   rr   rt   r   r   r   r   r   r   r
   <module>   sz   

	,

