o
    ÞÜgT  ã                   @   s˜   d dl Z d dlZd dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZ d dlmZ d dlmZ edd	ƒ\ZZd
d„ edd	ƒD ƒ\ZZG dd„ dƒZdS )é    N)ÚUnsupportedAlgorithm)Úconstant_timeÚserialization)ÚX25519PrivateKeyÚX25519PublicKey)ÚMessage©Úbyte_chr)ÚSSHExceptioné   é    c                 C   s   g | ]}t |ƒ‘qS © r   )Ú.0Úcr   r   úQ/var/www/html/api-tag/env/lib/python3.10/site-packages/paramiko/kex_curve25519.pyÚ
<listcomp>   s    r   c                   @   sN   e Zd ZejZdd„ Zedd„ ƒZdd„ Z	dd„ Z
d	d
„ Zdd„ Zdd„ ZdS )ÚKexCurve25519c                 C   s   || _ d | _d S ©N)Ú	transportÚkey)Úselfr   r   r   r   Ú__init__   s   
zKexCurve25519.__init__c                 C   s$   zt  ¡  W dS  ty   Y dS w )NFT)r   Úgenerater   )Úclsr   r   r   Úis_available   s   
ýÿzKexCurve25519.is_availablec                 C   s$   | j  |¡}t |d¡rtdƒ‚|S )Ns                                    z.peer's curve25519 public value has wrong order)r   Úexchanger   Úbytes_eqr
   )r   Úpeer_keyÚsecretr   r   r   Ú_perform_exchange$   s   ÿzKexCurve25519._perform_exchangec                 C   sn   t  ¡ | _| jjr| j t¡ d S tƒ }| t	¡ | 
| j ¡  tjjtjj¡¡ | j |¡ | j t¡ d S r   )r   r   r   r   Úserver_modeÚ_expect_packetÚ_MSG_KEXECDH_INITr   Úadd_byteÚc_MSG_KEXECDH_INITÚ
add_stringÚ
public_keyÚpublic_bytesr   ÚEncodingÚRawÚPublicFormatÚ_send_messageÚ_MSG_KEXECDH_REPLY)r   Úmr   r   r   Ú	start_kex,   s   


ÿÿzKexCurve25519.start_kexc                 C   sB   | j jr|tkr|  |¡S | j js|tkr|  |¡S td |¡ƒ‚)Nz.KexCurve25519 asked to handle packet type {:d})r   r    r"   Ú_parse_kexecdh_initr,   Ú_parse_kexecdh_replyr
   Úformat)r   Úptyper-   r   r   r   Ú
parse_next<   s   

ÿzKexCurve25519.parse_nextc           
      C   s   |  ¡ }t |¡}|  |¡}tt |¡dƒ}tƒ }| | j	j
| j	j| j	j| j	j¡ | j	 ¡  ¡ }| j ¡  tjjtjj¡}| |¡ | |¡ | |¡ | |¡ |  | ¡ ¡ ¡ }| j	 ||¡ | j	 ¡  || j	j¡}	tƒ }| t¡ | |¡ | |¡ | |	¡ | j	  |¡ | j	 !¡  d S ©Né   )"Ú
get_stringr   Úfrom_public_bytesr   ÚintÚbinasciiÚhexlifyr   Úaddr   Úremote_versionÚlocal_versionÚremote_kex_initÚlocal_kex_initÚget_server_keyÚasbytesr   r&   r'   r   r(   r)   r*   r%   Ú	add_mpintÚ	hash_algoÚdigestÚ_set_K_HÚsign_ssh_dataÚhost_key_typer#   Úc_MSG_KEXECDH_REPLYr+   Ú_activate_outbound)
r   r-   Úpeer_key_bytesr   ÚKÚhmÚserver_key_bytesÚexchange_key_bytesÚHÚsigr   r   r   r/   E   s>   

ü
ÿ




ÿ



z!KexCurve25519._parse_kexecdh_initc                 C   sØ   |  ¡ }|  ¡ }| ¡ }t |¡}|  |¡}tt |¡dƒ}tƒ }| 	| j
j| j
j| j
j| j
j¡ | |¡ | | j ¡  tjjtjj¡¡ | |¡ | |¡ | j
 ||  | ¡ ¡ ¡ ¡ | j
 ||¡ | j
 ¡  d S r4   )r6   Ú
get_binaryr   r7   r   r8   r9   r:   r   r;   r   r=   r<   r?   r>   r%   r   r&   r'   r   r(   r)   r*   rB   rE   rC   rA   rD   Ú_verify_keyrI   )r   r-   Úpeer_host_key_bytesrJ   rP   r   rK   rL   r   r   r   r0   h   s0   

ü

ÿÿ

z"KexCurve25519._parse_kexecdh_replyN)Ú__name__Ú
__module__Ú__qualname__ÚhashlibÚsha256rC   r   Úclassmethodr   r   r.   r3   r/   r0   r   r   r   r   r      s    
	#r   )r9   rW   Úcryptography.exceptionsr   Úcryptography.hazmat.primitivesr   r   Ú0cryptography.hazmat.primitives.asymmetric.x25519r   r   Úparamiko.messager   Úparamiko.commonr	   Úparamiko.ssh_exceptionr
   Úranger"   r,   r$   rH   r   r   r   r   r   Ú<module>   s    