a
    !f8)                     @   s  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
ejdkre 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-d;ddZ.dd Z/dd Z0dd Z1G dd  d eZ2d!d" Z3d#Z4W n ey\   d dl5Z5d d$l5m6Z6m7Z7m8Z8m)Z)m*Z*m-Z-m.Z.m,Z,m+Z+ d d%l9m:Z: d d&l5m;Z' dZ!g Z<d'd( Z,d)d Z(d*d Z/d+d Z0e5j=Z>d Z?e5j@jAZBe5j@jCZDe5jEZFe5Ge>ZHG d,d- d-e5jIZJd.d Z1G d/d0 d0eZKd1d" Z3d2Z4Y n0 G d3d4 d4eZLd5d6 ZMd7d8 ZNd9d: ZOdS )<    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   U/var/www/html/python-backend/venv/lib/python3.9/site-packages/Crypto/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.)r      ntz2CFFI is not compatible with Python 3.12 on Windows)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_lib]   s
    	

r   c                 C   s   | S )z)Convert a Python integer to unsigned longr   xr   r   r
   c_ulongm   s    r!   c                 C   s   | S )z"Convert a Python integer to size_tr   r   r   r   r
   c_size_tu   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_buffery   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    r3   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 NrA   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 rB   )r=   r   r   r   r
   VoidPointer   s    rE   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ctypesrK   )cr   r   r
   rK      s    rK   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
startswithrM   OSErrorrG   )r   r   rU   bitslinkage	full_namer   r   r
   r      s    c                 C   s   | j S rB   )valuer.   r   r   r
   r/      s    c                 C   s   | j S rB   )rawr1   r   r   r
   r3      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_bufferr2   objr'   itemsizereadonlyndimformatshapestrides
suboffsetsZinternalr   r   Z
smalltableN)r   r   r   rH   rQ   	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 r4   )r   r$   r8   r5   
_py_objectr^   _PyObject_GetBufferrI   _PyBUF_SIMPLErQ   rK   r'   Zfrom_addressr2   _PyBuffer_Releaser9   r:   )r;   r_   r2   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 rB   )rH   _pr   r   r   r
   r@      s    zVoidPointer_ctypes.__init__c                 C   s   | j S rB   )ru   r   r   r   r
   r     s    zVoidPointer_ctypes.getc                 C   s
   t | jS rB   )rI   ru   r   r   r   r
   r     s    zVoidPointer_ctypes.address_ofNrC   r   r   r   r
   rt      s   rt   c                   C   s   t  S rB   )rt   r   r   r   r
   rE     s    rQ   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 rB   )_raw_pointer_destructor)r	   Zraw_pointerZ
destructorr   r   r
   r@     s    zSmartPointer.__init__c                 C   s   | j S rB   rw   r   r   r   r
   r     s    zSmartPointer.getc                 C   s   | j d  }| _ |S rB   ry   )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 rB   )rw   rx   AttributeErrorr   r   r   r
   __del__  s    

zSmartPointer.__del__N)r   r   r   rD   r@   r   r{   r}   r   r   r   r
   rv     s
   rv   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 Crypto.Cipher._raw_cbc.

    @cdecl, the C function declarations.
    rS   Nrg   zNot found '%s'zCannot load '%s': %sz"Cannot load native module '%s': %sz, )splitextension_suffixesr   r   pathisfileappendr   rX   strjoin)
r   r   r~   Z	dir_compsbasenameZattemptsextfilenamer[   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_buffer>  s    r   c                 C   s   t | tpt | to| j S rB   )r$   r   r   ra   r   r   r   r
   is_writeable_bufferC  s    
r   )N)Pr   r   rm   ZCrypto.Util.py3compatr   ZCrypto.Util._file_systemr   rn   impr   Zget_suffixesr   modtypC_EXTENSIONr   	importlibr   EXTENSION_SUFFIXESr   r   r5   objectr   builtin_module_namesflagsoptimizeImportErrorr   rF   r   r   ZNULLZnull_pointerZtypeofr(   r7   	__class__	__bases__r8   r   r!   rJ   rL   rK   r"   r,   r/   r3   r<   r=   rE   backendrQ   rG   rH   rI   Zctypes.utilrM   rN   rT   Z	c_ssize_tri   rr   Z	pythonapiZPyObject_GetBufferrq   ZPyBuffer_Releasers   rh   rp   ZPOINTERrl   Z	Structurer^   rt   rv   r   r   r   r   r   r   r
   <module>   s~   

	,

