o
    Þý°jD)  ã                   @   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 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zkdejvr_ejjd	kr_ed
ƒ‚ejdkrme jdkrme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 nt 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@jCZDe5jEZFe5 Ge>¡ZHG d,d-„ d-e5jIƒZJd.d„ Z1G d/d0„ d0eƒZKd1d"„ Z3d2Z4Y nw 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   ó   dS )z&Return the memory location we point toN© ©Úselfr   r   ú‹/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-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.)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 )zÔLoad 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_lib]   s
   	

r$   c                 C   ó   | S )z)Convert a Python integer to unsigned longr   ©Úxr   r   r   Úc_ulongm   ó   r(   c                 C   r%   )z"Convert a Python integer to size_tr   r&   r   r   r   Úc_size_tu   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_buffery   s   
ýr5   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   
r9   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
   
rG   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   r0   Ú_ppr	   r   r   r   Ú__init__š   s   zVoidPointer_cffi.__init__c                 C   s
   | j d S )Nr   ©rK   r	   r   r   r   r   �   ó   
zVoidPointer_cffi.getc                 C   ó   | j S ©NrM   r	   r   r   r   r       ó   zVoidPointer_cffi.address_ofN©r   r   r   Ú__doc__rL   r   r   r   r   r   r   rI   —   ó
    rI   c                   C   ó   t ƒ S rP   )rI   r   r   r   r   ÚVoidPointer£   rQ   rV   Úcffi)	ÚCDLLÚc_void_pÚbyrefr(   Úc_ulonglongr*   r5   Úc_ubyteÚc_uint)Úfind_library)ÚArrayc                 C   s*   d|   krdk st ƒ ‚ t ƒ ‚t | ¡S )Nr   é   )ÚOverflowErrorÚctypesr\   )Úcr   r   r   r\   ³   s
   ÿ
r\   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^   ÚOSErrorrX   )r!   r"   rg   ÚbitsÚlinkageÚ	full_namer   r   r   r$   ¸   s   c                 C   rO   rP   )Úvaluer7   r   r   r   r9   Æ   rQ   c                 C   rO   rP   )Úrawr;   r   r   r   r=   É   rQ   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   rY   rb   Ú	py_objectÚ
_c_ssize_tÚc_intÚc_char_pÚ
_c_ssize_pÚ_fields_ÚsysÚversion_infoÚinsertr   r   r   r   rp   Ø   s     õÿrp   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,   rC   r?   Ú
_py_objectrp   Ú_PyObject_GetBufferrZ   Ú_PyBUF_SIMPLErb   r\   r/   Úfrom_addressr<   Ú_PyBuffer_ReleaserD   rE   )rF   rq   r<   Úbuffer_typer   r   r   rG   ë   s   
c                   @   rH   )	ÚVoidPointer_ctypesrJ   c                 C   s   t ƒ | _d S rP   )rY   Ú_pr	   r   r   r   rL   ÿ   s   zVoidPointer_ctypes.__init__c                 C   rO   rP   )rŒ   r	   r   r   r   r     rQ   zVoidPointer_ctypes.getc                 C   s
   t | jƒS rP   )rZ   rŒ   r	   r   r   r   r     rN   zVoidPointer_ctypes.address_ofNrR   r   r   r   r   r‹   ü   rT   r‹   c                   C   rU   rP   )r‹   r   r   r   r   rV     rQ   rb   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 rP   )Ú_raw_pointerÚ_destructor)r
   Úraw_pointerÚ
destructorr   r   r   rL     s   
zSmartPointer.__init__c                 C   rO   rP   ©rŽ   r	   r   r   r   r     rQ   zSmartPointer.getc                 C   s   | j d }| _ |S rP   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 rP   )rŽ   r�   ÚAttributeErrorr	   r   r   r   Ú__del__  s   
þÿzSmartPointer.__del__N)r   r   r   rS   rL   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 ƒ‚)zÝLoad 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.
    rd   Nrz   zNot found '%s'zCannot load '%s': %sz"Cannot load native module '%s': %sz, )ÚsplitÚextension_suffixesr   r   ÚpathÚisfileÚappendr$   rj   ÚstrÚjoin)
r!   r"   r—   Ú	dir_compsÚbasenameÚattemptsÚextÚfilenamerm   Ú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 rP   )r,   r¥   r¦   rs   r&   r   r   r   Úis_writeable_bufferC  s   
ÿr¨   rP   )Pr   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ÚImportErrorr!   rW   r   r   ÚNULLÚnull_pointerÚtypeofr0   rA   Ú	__class__Ú	__bases__rC   r$   r(   r[   r]   r\   r*   r5   r9   r=   rG   rI   rV   Úbackendrb   rX   rY   rZ   Úctypes.utilr^   r_   rf   Ú	c_ssize_tr}   r‡   Ú	pythonapiÚPyObject_GetBufferr†   ÚPyBuffer_Releaser‰   r|   r…   ÚPOINTERr€   Ú	Structurerp   r‹   r�   r¤   r§   r¨   r   r   r   r   Ú<module>   s†   

€þ
	,
�f