U
    VQh°  ã                
   @   sø   d Z ddlZddlZddlZddlZzddlZW n ek
rD   Y nX ddlZddlZe 	e
¡Zdd„ Zz
eƒ ZW n8 ek
rª Z ze deeƒe¡ dZW 5 dZ[X Y nX esºdZdZn:e d¡Ze d¡ZdZG dd	„ d	ejƒZd
d„ Zdd„ ZdS )zM
Helper module around the system's libssl library if available for IGE mode.
é    Nc                  C   s\  t j d¡} tjdkr|t ¡ \}}}| d¡^}}}t|ƒdksXt|ƒdkr|t|ƒdkr|t j d¡pzt j d¡pzt j d¡} | sˆtd	ƒ‚zt j	 
| ¡}W n tk
r¬   Y nX |S zt jjj}W n( tk
rè   tj d
¡dddg}Y nX |D ]\}	tj |	¡rît |	¡D ]@\}
}}| |krtj tj |
| ¡¡} t j	 
| ¡    S qqîtd|  ƒ‚d S )NÚsslÚdarwinÚ.é
   é   z	libssl.46z	libssl.44z	libssl.42zno library called "ssl" foundz~/libz/usr/local/libz/libz/usr/libz1no absolute path for "%s" and cannot load by name)ÚctypesÚutilÚfind_libraryÚsysÚplatformÚmac_verÚsplitÚintÚOSErrorÚcdllÚLoadLibraryZmacholibZdyldZDEFAULT_LIBRARY_FALLBACKÚAttributeErrorÚosÚpathÚ
expanduserÚisdirÚwalkÚrealpathÚjoin)ÚlibÚreleaseZ_version_infoZ_machineÚverÚmajorÚ_ZlibsslÚpathsr   ÚrootÚfiles© r"   ú:/tmp/pip-build-6059463i/telethon/telethon/crypto/libssl.pyÚ_find_ssl_lib   s@    
$
ÿ
ý
ü

r$   z#Failed to load SSL library: %s (%s)é   r   c                   @   s0   e Zd ZdZdejded   fdejfgZdS )ÚAES_KEYz$Helper class representing an AES keyZrd_keyé   r%   ÚroundsN)	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Úc_uint32Ú	AES_MAXNRÚc_uintÚ_fields_r"   r"   r"   r#   r&   [   s   þr&   c              	   C   s´   t ƒ }t dt|ƒ ¡}tjt|ƒ |Ž }tjt|ƒ |Ž }t t| ƒ¡}tjt| ƒ | Ž }tjt| ƒ ƒ }t ||t |¡¡ t 	t |¡t |¡|t |¡t |¡t
¡ t|ƒS ©Né   )r&   r   Úc_intÚlenÚc_ubyteÚc_size_tÚ_libsslZAES_set_decrypt_keyÚbyrefÚAES_ige_encryptÚAES_DECRYPTÚbytes)Zcipher_textÚkeyÚivÚaes_keyÚkey_lenÚin_lenÚin_ptrÚout_ptrr"   r"   r#   Údecrypt_igeb   s"    ú	rC   c              	   C   s´   t ƒ }t dt|ƒ ¡}tjt|ƒ |Ž }tjt|ƒ |Ž }t t| ƒ¡}tjt| ƒ | Ž }tjt| ƒ ƒ }t ||t |¡¡ t 	t |¡t |¡|t |¡t |¡t
¡ t|ƒS r1   )r&   r   r3   r4   r5   r6   r7   ZAES_set_encrypt_keyr8   r9   ÚAES_ENCRYPTr;   )Z
plain_textr<   r=   r>   r?   r@   rA   rB   r"   r"   r#   Úencrypt_igex   s"    ú	rE   )r,   r   Úctypes.utilr   r
   Zctypes.macholib.dyldÚImportErrorÚloggingr   Ú	getLoggerr)   Z__log__r$   r7   r   ÚeÚinfoÚtyperC   rE   r3   rD   r:   r.   Ú	Structurer&   r"   r"   r"   r#   Ú<module>   s4   
8


