B
    h(                 @   s  d dl Z d dlZd dlmZ d dlmZ ejd  dk rpd dlZg Zx>e	 D ]\Z
ZZeejkrLee
 qLW nd dlmZ ejZejd  dkrejd dk reZneefZG d	d
 d
eZyejd  dkrejd dk reddejk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)dd Z*d=ddZ+dd Z,dd Z-dd Z.G dd  d eZ/d!d" Z0d#Z1W n
 ek
r   d dl2Z2d d$l2m3Z3m4Z4m5Z5m'Z'm(Z(m*Z*m+Z+m6Z6m)Z) d d%l7m8Z8 d d&l2m9Z% dZg Z:d'd Z&d(d Z,d)d Z-ejd  dkr@ejd d*kr@e*Z;ne2j<Z;d Z=e2j>j?Z@e2j>jAZBe2jCZDe2Ee;ZFG d+d, d,e2jGZHd-d Z.G d.d/ d/eZId0d" Z0d1Z1[2Y nX G d2d3 d3eZJd4d5 ZKejdd d6krd7d8 ZLd9d: ZMnd;d8 ZLd<d: ZMdS )>    N)byte_string)pycryptodome_filename   )	machinery         c               @   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
   QC:\Users\sanjo\AppData\Local\Qlobot\Launcher\ext_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_ofA   s    z_VoidPointer.address_ofN)__name__
__module____qualname__abcabstractmethodr   r   r
   r
   r
   r   r	   ;   s   r	   z'CFFI is only supported with Python 2.7+Z__pypy__z0CFFI with optimize=2 fails due to pycparser bug.)FFIzconst uint8_t*z
uint8_t[1]c             C   s   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.
        )ffiZdlopenZ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_ulongi   s    r   c             C   s   | S )z"Convert a Python integer to size_tr
   )r   r
   r
   r   c_size_tp   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)r   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_buffert   s    
r%   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    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    r+   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
    
r3   c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	VoidPointer_cffiz'Model a newly allocated pointer to voidc             C   s   t d| _d S )Nz	void *[1])r   r!   _pp)r   r
   r
   r   __init__   s    zVoidPointer_cffi.__init__c             C   s
   | j d S )Nr   )r5   )r   r
   r
   r   r      s    zVoidPointer_cffi.getc             C   s   | j S )N)r5   )r   r
   r
   r   r      s    zVoidPointer_cffi.address_ofN)r   r   r   __doc__r6   r   r   r
   r
   r
   r   r4      s   r4   c               C   s   t  S )N)r4   r
   r
   r
   r   VoidPointer   s    r8   cffi)	CDLLc_void_pbyrefr   c_ulonglongr   r%   c_ubytec_uint)find_library)Arrayc             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
startswithr@   OSErrorr:   )r   r   rD   bitslinkageZ	full_namer
   r
   r   r      s    c             C   s   | j S )N)value)r'   r
   r
   r   r(      s    c             C   s   | j S )N)raw)r*   r
   r
   r   r+      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_bufferr*   objr    itemsizereadonlyndimformatshapestrides
suboffsetsZinternalr   r   Z
smalltableN)r   r   r   r;   ctypes	py_object
_c_ssize_tZc_intZc_char_p
_c_ssize_pZ_fields_sysversion_infoinsertr
   r
   r
   r   rM      s   
rM   c          	   C   sz   t | st| tr| S t| trft| }t }t|t|t zt	|j
 }||jS tt| X ntdt|  d S )Nz)Object type %s cannot be passed to C code)r   r   r/   r,   
_py_objectrM   _PyObject_GetBufferr<   _PyBUF_SIMPLEr>   r    Zfrom_addressr*   _PyBuffer_Releaser0   r1   )r2   rN   r*   Zbuffer_typer
   r
   r   r3      s    

c               @   s(   e Zd ZdZdd Zdd Zdd ZdS )	VoidPointer_ctypesz'Model a newly allocated pointer to voidc             C   s   t  | _d S )N)r;   _p)r   r
   r
   r   r6      s    zVoidPointer_ctypes.__init__c             C   s   | j S )N)rc   )r   r
   r
   r   r      s    zVoidPointer_ctypes.getc             C   s
   t | jS )N)r<   rc   )r   r
   r
   r   r      s    zVoidPointer_ctypes.address_ofN)r   r   r   r7   r6   r   r   r
   r
   r
   r   rb      s   rb   c               C   s   t  S )N)rb   r
   r
   r
   r   r8     s    rW   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 )N)_raw_pointer_destructor)r   Zraw_pointerZ
destructorr
   r
   r   r6     s    zSmartPointer.__init__c             C   s   | j S )N)re   )r   r
   r
   r   r     s    zSmartPointer.getc             C   s   | j d  }| _ |S )N)re   )r   Zrpr
   r
   r   release  s    zSmartPointer.releasec             C   s:   y | j d k	r| | j  d | _ W n tk
r4   Y nX d S )N)re   rf   AttributeError)r   r
   r
   r   __del__  s    

zSmartPointer.__del__N)r   r   r   r7   r6   r   rg   ri   r
   r
   r
   r   rd   
  s
   rd   c       	      C   s   |  d}|dd |d  }}g }x^tD ]V}y|| }tt|||S  tk
r~ } z|d|t|f  W dd}~X Y q*X q*W 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.
    rB   NrV   zTrying '%s': %sz"Cannot load native module '%s': %sz, )splitextension_suffixesr   r   rG   appendstrjoin)	r   r   rj   Z	dir_compsbasenameZattemptsextfilenameexpr
   r
   r   load_pycryptodome_raw_lib!  s    	


,rs   )r   rL   c             C   s   t | tttfS )z5Return True if object x supports the buffer interface)r   r   	bytearray
memoryview)r   r
   r
   r   	is_buffer9  s    rv   c             C   s   t | tpt | to| j S )N)r   rt   ru   rP   )r   r
   r
   r   is_writeable_buffer=  s    
rw   c             C   s   t | ttfS )N)r   r   rt   )r   r
   r
   r   rv   C  s    c             C   s
   t | tS )N)r   rt   )r   r
   r
   r   rw   F  s    )N)Nr   r[   ZCrypto.Util.py3compatr   ZCrypto.Util._file_systemr   r\   imprk   Zget_suffixesrp   modtypC_EXTENSIONrl   	importlibr   EXTENSION_SUFFIXESrt   r,   ru   objectr	   ImportErrorbuiltin_module_namesflagsoptimizer9   r   r   NULLZnull_pointerZtypeofr!   r.   	__class__	__bases__r/   r   r   r=   r?   r   r%   r(   r+   r3   r4   r8   ZbackendrW   r:   r;   r<   r>   ctypes.utilr@   rA   rC   rY   Z	c_ssize_tr`   Z	pythonapiZPyObject_GetBufferr_   ZPyBuffer_Releasera   rX   r^   POINTERrZ   Z	StructurerM   rb   rd   rs   rv   rw   r
   r
   r
   r   <module>   s   

	
, 

