o
    ÞÜg”  ã                   @   sÄ   d Z ddlmZ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 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©Úbyte_chr)ÚMessage)ÚSSHException)Údefault_backend)Úec)Úserialization)Úhexlifyé   é    c                 C   s   g | ]}t |ƒ‘qS © r   )Ú.0Úcr   r   úP/var/www/html/api-tag/env/lib/python3.10/site-packages/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   || _ d| _d | _d | _d S )Nr   )Ú	transportÚ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_modeÚ_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   sB   | j jr|tkr|  |¡S | j js|tkr|  |¡S td |¡ƒ‚)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
   Úgenerate_private_keyÚcurver	   r   r   r   Ú
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_pointr2   r   r   Úget_server_keyÚasbytesr   ÚexchangeÚECDHÚintr   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_HÚsign_ssh_dataÚhost_key_typer    Úc_MSG_KEXECDH_REPLYr(   Ú_activate_outbound)r   r*   Ú	Q_C_bytesÚK_SÚKÚhmÚHÚsigr   r   r   r,   A   sP   ÿü

þÿ
ÿ

þÿ
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 r4   )"r6   r
   r7   r8   r2   r   Ú
get_binaryr   r;   r<   r=   r   r   r>   r   r@   r?   rB   rA   r"   r   r#   r   r$   r%   r&   r'   rC   rF   rD   r:   rE   Ú_verify_keyrJ   )r   r*   rL   Ú	Q_S_bytesrP   rM   rN   r   r   r   r-   n   s6   ÿü
þÿ

z KexNistp256._parse_kexecdh_replyN)Ú__name__Ú
__module__Ú__qualname__Únamer   rD   r
   Ú	SECP256R1r2   r   r+   r0   r   r,   r-   r   r   r   r   r      s    	-r   c                   @   ó   e Zd ZdZeZe ¡ ZdS )ÚKexNistp384zecdh-sha2-nistp384N)	rT   rU   rV   rW   r   rD   r
   Ú	SECP384R1r2   r   r   r   r   rZ   Ž   ó    rZ   c                   @   rY   )ÚKexNistp521zecdh-sha2-nistp521N)	rT   rU   rV   rW   r   rD   r
   Ú	SECP521R1r2   r   r   r   r   r]   ”   r\   r]   N)Ú__doc__Úhashlibr   r   r   Úparamiko.commonr   Úparamiko.messager   Úparamiko.ssh_exceptionr   Úcryptography.hazmat.backendsr	   Ú)cryptography.hazmat.primitives.asymmetricr
   Úcryptography.hazmat.primitivesr   Úbinasciir   Úranger   r)   r!   rI   r   rZ   r]   r   r   r   r   Ú<module>   s    {