U
    Øcc¦  ã                   @   sÈ   d Z ddlmZmZmZ ddlmZ ddlmZm	Z	 ddl
mZ ddl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G dd„ deƒZG dd„ deƒZdS )zQ
Ephemeral Elliptic Curve Diffie-Hellman (ECDH) key exchange
RFC 5656, Section 4
é    )Úsha256Úsha384Úsha512)ÚMessage)Úbyte_chrÚlong)ÚSSHException)Údefault_backend)Úec)Úserialization)Úhexlifyé   é    c                 C   s   g | ]}t |ƒ‘qS © )r   )Ú.0Úcr   r   ú:/tmp/pip-unpacked-wheel-rglolp_m/paramiko/kex_ecdh_nist.pyÚ
<listcomp>   s     r   c                   @   sL   e Zd ZdZeZe ¡ Zdd„ Z	dd„ Z
dd„ Zdd	„ Zd
d„ Zdd„ ZdS )ÚKexNistp256zecdh-sha2-nistp256c                 C   s    || _ tdƒ| _d | _d | _d S )Nr   )Ú	transportr   ÚPÚQ_CÚQ_S)Úselfr   r   r   r   Ú__init__   s    
zKexNistp256.__init__c                 C   sh   |   ¡  | jjr | j t¡ d S tƒ }| t¡ | | j	 
tjjtjj¡¡ | j |¡ | j t¡ d S ©N)Ú_generate_key_pairr   Úserver_modeZ_expect_packetÚ_MSG_KEXECDH_INITr   Úadd_byteÚc_MSG_KEXECDH_INITÚ
add_stringr   Úpublic_bytesr   ÚEncodingÚX962ÚPublicFormatÚUncompressedPointÚ_send_messageÚ_MSG_KEXECDH_REPLY)r   Úmr   r   r   Ú	start_kex    s    
þÿzKexNistp256.start_kexc                 C   sF   | j jr|tkr|  |¡S | j js4|tkr4|  |¡S td |¡ƒ‚d S )Nz(KexECDH asked to handle packet type {:d})r   r   r   Ú_parse_kexecdh_initr(   Ú_parse_kexecdh_replyr   Úformat)r   Úptyper)   r   r   r   Ú
parse_next1   s    

ÿzKexNistp256.parse_nextc                 C   s:   t  | jtƒ ¡| _| jjr*| j ¡ | _d S | j ¡ | _	d S r   )
r
   Zgenerate_private_keyÚcurver	   r   r   r   Z
public_keyr   r   )r   r   r   r   r   :   s
    zKexNistp256._generate_key_pairc                 C   s>  |  ¡ }tj | j|¡| _| j ¡  ¡ }| j	 
t ¡ | j¡}tt|ƒdƒ}tƒ }| | jj| jj| jj| jj¡ | |¡ | |¡ | | j tjjtjj¡¡ | t|ƒ¡ |  | ¡ ¡ ¡ }| j ||¡ | j ¡   || jj!¡}tƒ }| "t#¡ | |¡ | | j tjjtjj¡¡ | |¡ | j $|¡ | j %¡  d S ©Né   )&Ú
get_stringr
   ÚEllipticCurvePublicKeyÚfrom_encoded_pointr0   r   r   Zget_server_keyÚasbytesr   ÚexchangeÚECDHr   r   r   ÚaddÚremote_versionÚlocal_versionÚremote_kex_initÚlocal_kex_initr!   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)   Z	Q_C_bytesÚK_SÚKÚhmÚHÚsigr   r   r   r+   A   sT     ÿü

þÿ
 ÿ

þÿ
zKexNistp256._parse_kexecdh_initc                 C   sä   |  ¡ }|  ¡ }tj | j|¡| _| ¡ }| j t 	¡ | j¡}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   r
   r4   r5   r0   r   Z
get_binaryr   r7   r8   r   r   r   r9   r   r;   r:   r=   r<   r!   r   r"   r   r#   r$   r%   r&   r>   rA   r?   r6   r@   Z_verify_keyrC   )r   r)   rD   Z	Q_S_bytesrH   rE   rF   r   r   r   r,   n   s8     ÿü
þÿ

z KexNistp256._parse_kexecdh_replyN)Ú__name__Ú
__module__Ú__qualname__Únamer   r?   r
   Z	SECP256R1r0   r   r*   r/   r   r+   r,   r   r   r   r   r      s   	-r   c                   @   s   e Zd ZdZeZe ¡ ZdS )ÚKexNistp384zecdh-sha2-nistp384N)	rI   rJ   rK   rL   r   r?   r
   Z	SECP384R1r0   r   r   r   r   rM   Ž   s   rM   c                   @   s   e Zd ZdZeZe ¡ ZdS )ÚKexNistp521zecdh-sha2-nistp521N)	rI   rJ   rK   rL   r   r?   r
   Z	SECP521R1r0   r   r   r   r   rN   ”   s   rN   N)Ú__doc__Úhashlibr   r   r   Zparamiko.messager   Zparamiko.py3compatr   r   Zparamiko.ssh_exceptionr   Zcryptography.hazmat.backendsr	   Z)cryptography.hazmat.primitives.asymmetricr
   Zcryptography.hazmat.primitivesr   Úbinasciir   Úranger   r(   r    rB   r   rM   rN   r   r   r   r   Ú<module>   s   {