U
    gD)                     @   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k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k
r^   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X 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   </tmp/pip-unpacked-wheel-_q8s9isk/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.)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getenv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    r0   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    r4   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_type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   rA   r   r   r   r
   r      s    zVoidPointer_cffi.getc                 C   s   | j S NrC   r   r   r   r
   r      s    zVoidPointer_cffi.address_ofNr   r   r   __doc__rB   r   r   r   r   r   r
   r?      s   r?   c                   C   s   t  S rD   )r?   r   r   r   r
   VoidPointer   s    rG   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ctypesrM   )cr   r   r
   rM      s    rM   c                 C   s^   t sdd l}| t d d < t \}}d| krV|dsVt| }|d krRtd|  |} t| S )Nr   .ZWinzCannot load library '%s')cached_architectureplatformarchitecture
startswithrO   OSErrorrI   )r   r   rW   bitslinkage	full_namer   r   r
   r      s    c                 C   s   | j S rD   )valuer/   r   r   r
   r0      s    c                 C   s   | j S rD   )rawr2   r   r   r
   r4      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_bufferr3   objr(   itemsizereadonlyndimformatshapestrides
suboffsetsZinternalr   r   Z
smalltableN)r   r   r   rJ   rS   	py_object
_c_ssize_tc_intc_char_p
_c_ssize_p_fields_sysversion_infoinsertr   r   r   r
   r`      s   r`   c              	   C   s   t | st| tr| S t| trlt| }t }t|t|t zt
j|j }||jW S t	t| X ntdt|  d S r5   )r   r%   r:   r6   
_py_objectr`   _PyObject_GetBufferrK   _PyBUF_SIMPLE_PyBuffer_ReleaserS   rM   r(   from_addressr3   r;   r<   )r=   ra   r3   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 rD   )rJ   _pr   r   r   r
   rB      s    zVoidPointer_ctypes.__init__c                 C   s   | j S rD   )ry   r   r   r   r
   r     s    zVoidPointer_ctypes.getc                 C   s
   t | jS rD   )rK   ry   r   r   r   r
   r     s    zVoidPointer_ctypes.address_ofNrE   r   r   r   r
   rx      s   rx   c                   C   s   t  S rD   )rx   r   r   r   r
   rG     s    rS   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 rD   )_raw_pointer_destructor)r	   Zraw_pointerZ
destructorr   r   r
   rB     s    zSmartPointer.__init__c                 C   s   | j S rD   r{   r   r   r   r
   r     s    zSmartPointer.getc                 C   s   | j d  }| _ |S rD   r}   )r	   rpr   r   r
   release  s    zSmartPointer.releasec                 C   s:   z | j d k	r| | j  d | _ W n tk
r4   Y nX d S rD   )r{   r|   AttributeErrorr   r   r   r
   __del__  s    

zSmartPointer.__del__N)r   r   r   rF   rB   r   r   r   r   r   r   r
   rz     s
   rz   c           
      C   s   |  d}|dd |d  }}g }tD ]~}z@|| }t||}tj|s^|d|  W q(t||W   S  tk
r }	 z|d|t	|	f  W 5 d}	~	X Y q(X 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.
    rU   Nri   zNot found '%s'zCannot load '%s': %sz"Cannot load native module '%s': %sz, )splitextension_suffixesr   r   pathisfileappendr   rZ   strjoin)
r   r   r   Z	dir_compsbasename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 rD   )r%   r   r   rc   r    r   r   r
   is_writeable_bufferC  s    
r   )N)Pr   r   rp   ZCryptodome.Util.py3compatr   ZCryptodome.Util._file_systemr   rq   impr   Zget_suffixesr   modtypC_EXTENSIONr   	importlibr   EXTENSION_SUFFIXESr   r   r6   objectr   builtin_module_namesflagsoptimizeImportErrorr   rH   r   r   ZNULLZnull_pointerZtypeofr)   r8   	__class__	__bases__r:   r   r"   rL   rN   rM   r#   r-   r0   r4   r>   r?   rG   backendrS   rI   rJ   rK   Zctypes.utilrO   rP   rV   	c_ssize_trk   ru   	pythonapiZPyObject_GetBufferrt   ZPyBuffer_Releaserv   rj   rs   POINTERrn   	Structurer`   rx   rz   r   r   r   r   r   r   r
   <module>   s~   

	,

