o
    h                     @   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   X/var/www/html/optinet_system/venv/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    {