U
    Øccg  ã                   @   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mZ d dlmZ edd	ƒ\ZZd
d„ edd	ƒD ƒ\ZZG dd„ deƒZdS )é    N)ÚUnsupportedAlgorithm)Úconstant_timeÚserialization)ÚX25519PrivateKeyÚX25519PublicKey)ÚMessage)Úbyte_chrÚlong)ÚSSHExceptioné   é    c                 C   s   g | ]}t |ƒ‘qS © )r   )Ú.0Úcr   r   ú;/tmp/pip-unpacked-wheel-rglolp_m/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 n tk
r"   Y dS X dS d S )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   Zexchanger   Z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_modeZ_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   sF   | j jr|tkr|  |¡S | j js4|tkr4|  |¡S td |¡ƒ‚d S )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   r	   ÚbinasciiÚhexlifyr   Úaddr   Úremote_versionÚlocal_versionÚremote_kex_initÚlocal_kex_initZget_server_keyÚasbytesr   r#   r$   r   r%   r&   r'   r"   Ú	add_mpintÚ	hash_algoÚdigestÚ_set_K_HZsign_ssh_dataZhost_key_typer    Úc_MSG_KEXECDH_REPLYr(   Ú_activate_outbound)
r   r*   Úpeer_key_bytesr   ÚKÚhmZserver_key_bytesZexchange_key_bytesÚHÚsigr   r   r   r,   E   sB    

ü
 ÿ




 ÿ



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 r1   )r3   Z
get_binaryr   r4   r   r	   r5   r6   r   r7   r   r9   r8   r;   r:   r"   r   r#   r$   r   r%   r&   r'   r=   r@   r>   r<   r?   Z_verify_keyrB   )r   r*   Zpeer_host_key_bytesrC   rG   r   rD   rE   r   r   r   r-   h   s2    

ü

 ÿÿ

z"KexCurve25519._parse_kexecdh_replyN)Ú__name__Ú
__module__Ú__qualname__ÚhashlibÚsha256r>   r   Úclassmethodr   r   r+   r0   r,   r-   r   r   r   r   r      s   
	#r   )r5   rK   Zcryptography.exceptionsr   Zcryptography.hazmat.primitivesr   r   Z0cryptography.hazmat.primitives.asymmetric.x25519r   r   Zparamiko.messager   Zparamiko.py3compatr   r	   Zparamiko.ssh_exceptionr
   Úranger   r)   r!   rA   Úobjectr   r   r   r   r   Ú<module>   s   