o
    ÞÜgP(  ã                   @   s¬   d Z ddlZddlmZmZ ddlmZ ddlmZm	Z	m
Z
mZ ddlmZ ddlmZ edd	ƒ\ZZZZZd
d„ edd	ƒD ƒ\ZZZZZG dd„ dƒZG dd„ deƒZdS )zÒ
Variant on `KexGroup1 <paramiko.kex_group1.KexGroup1>` where the prime "p" and
generator "g" are provided by the server.  A bit more work is required on the
client side, and a **lot** more on the server side.
é    N)Úsha1Úsha256)Úutil)ÚDEBUGÚbyte_chrÚbyte_ordÚ	byte_mask)ÚMessage)ÚSSHExceptioné   é#   c                 C   s   g | ]}t |ƒ‘qS © )r   )Ú.0Úcr   r   úJ/var/www/html/api-tag/env/lib/python3.10/site-packages/paramiko/kex_gex.pyÚ
<listcomp>0   s    r   c                   @   sj   e Zd ZdZdZdZdZeZdd„ Z	ddd	„Z
d
d„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZdS )ÚKexGexz"diffie-hellman-group-exchange-sha1é   é    i   c                 C   s4   || _ d | _d | _d | _d | _d | _d | _d| _d S )NF)Ú	transportÚpÚqÚgÚxÚeÚfÚ	old_style)Úselfr   r   r   r   Ú__init__;   s   
zKexGex.__init__Fc                 C   sŒ   | j jr| j  tt¡ d S tƒ }|r!| t¡ | | j	¡ d| _
n| t¡ | | j¡ | | j	¡ | | j¡ | j  |¡ | j  t¡ d S )NT)r   Úserver_modeÚ_expect_packetÚ_MSG_KEXDH_GEX_REQUESTÚ_MSG_KEXDH_GEX_REQUEST_OLDr	   Úadd_byteÚc_MSG_KEXDH_GEX_REQUEST_OLDÚadd_intÚpreferred_bitsr   Úc_MSG_KEXDH_GEX_REQUESTÚmin_bitsÚmax_bitsÚ_send_messageÚ_MSG_KEXDH_GEX_GROUP)r   Ú_test_old_styleÚmr   r   r   Ú	start_kexE   s    ÿ

zKexGex.start_kexc                 C   sp   |t kr	|  |¡S |tkr|  |¡S |tkr|  |¡S |tkr$|  |¡S |tkr-|  	|¡S d}t
| | j|¡ƒ‚)Nz*KexGex {} asked to handle packet type {:d})r!   Ú_parse_kexdh_gex_requestr+   Ú_parse_kexdh_gex_groupÚ_MSG_KEXDH_GEX_INITÚ_parse_kexdh_gex_initÚ_MSG_KEXDH_GEX_REPLYÚ_parse_kexdh_gex_replyr"   Ú_parse_kexdh_gex_request_oldr
   ÚformatÚname)r   Úptyper-   Úmsgr   r   r   Ú
parse_next\   s   




zKexGex.parse_nextc                 C   s¢   | j d d }t |d¡}t|d ƒ}t|ƒ}d}|d@ s)|dK }|dL }|d@ r	 t |¡}t|d |ƒ|dd …  }t |d¡}|dkrK||k rKnq*|| _	d S )Né   é   r   éÿ   é€   )
r   r   Údeflate_longr   ÚlenÚosÚurandomr   Úinflate_longr   )r   r   ÚqnormÚqhbyteÚ
byte_countÚqmaskÚx_bytesr   r   r   r   Ú_generate_xl   s"   þ
û
zKexGex._generate_xc                 C   sî   |  ¡ }|  ¡ }|  ¡ }|| jkr| j}|| jk r| j}||kr"|}||k r(|}|| _|| _|| _| j ¡ }|d u r>tdƒ‚| j td 	|||¡¡ | 
|||¡\| _| _tƒ }| t¡ | | j¡ | | j¡ | j |¡ | j t¡ d S )Nú-Can't do server-side gex with no modulus packzPicking p ({} <= {} <= {} bits))Úget_intr)   r(   r&   r   Ú_get_modulus_packr
   Ú_logr   r6   Úget_modulusr   r   r	   r#   Úc_MSG_KEXDH_GEX_GROUPÚ	add_mpintr*   r    r1   )r   r-   ÚminbitsÚpreferredbitsÚmaxbitsÚpackr   r   r   r/   ~   s<   


ÿþ
zKexGex._parse_kexdh_gex_requestc                 C   sÈ   |  ¡ | _| j| jkr| j| _| j| jk r| j| _| j ¡ }|d u r&tdƒ‚| j td 	| j¡¡ | 
| j| j| j¡\| _| _tƒ }| t¡ | | j¡ | | j¡ | j |¡ | j t¡ d| _d S )NrJ   zPicking p (~ {} bits)T)rK   r&   r)   r(   r   rL   r
   rM   r   r6   rN   r   r   r	   r#   rO   rP   r*   r    r1   r   )r   r-   rT   r   r   r   r5   ¤   s*   

ÿÿ

z#KexGex._parse_kexdh_gex_request_oldc                 C   s¦   |  ¡ | _|  ¡ | _t | j¡}|dk s|dkrtd |¡ƒ‚| j t	d |¡¡ |  
¡  t| j| j| jƒ| _tƒ }| t¡ | | j¡ | j |¡ | j t¡ d S )Nr   r   z<Server-generated gex p (don't ask) is out of range ({} bits)zGot server p ({} bits))Ú	get_mpintr   r   r   Ú
bit_lengthr
   r6   r   rM   r   rI   Úpowr   r   r	   r#   Úc_MSG_KEXDH_GEX_INITrP   r*   r    r3   )r   r-   Úbitlenr   r   r   r0   ¿   s    

þ
zKexGex._parse_kexdh_gex_groupc                 C   sz  |  ¡ | _| jdk s| j| jd krtdƒ‚|  ¡  t| j| j| jƒ| _t| j| j| jƒ}| j	 
¡  ¡ }tƒ }| | j	j| j	j| j	j| j	j|¡ | jsQ| | j¡ | | j¡ | js`| | j¡ | | j¡ | | j¡ | | j¡ | | j¡ | |¡ |  | ¡ ¡ ¡ }| j	 ||¡ | j	 
¡  || j	j¡}tƒ }| t¡ | |¡ | | j¡ | |¡ | j	  |¡ | j	 !¡  d S )Nr;   zClient kex "e" is out of range)"rU   r   r   r
   rI   rW   r   r   r   r   Úget_server_keyÚasbytesr	   ÚaddÚremote_versionÚlocal_versionÚremote_kex_initÚlocal_kex_initr   r%   r(   r&   r)   rP   Ú	hash_algoÚdigestÚ_set_K_HÚsign_ssh_dataÚhost_key_typer#   Úc_MSG_KEXDH_GEX_REPLYÚ
add_stringr*   Ú_activate_outbound)r   r-   ÚKÚkeyÚhmÚHÚsigr   r   r   r2   Ó   sJ   
û

ÿ


zKexGex._parse_kexdh_gex_initc                 C   s  |  ¡ }| ¡ | _|  ¡ }| jdk s| j| jd krtdƒ‚t| j| j| jƒ}tƒ }| | j	j
| j	j| j	j| j	j|¡ | jsD| | j¡ | | j¡ | jsS| | j¡ | | j¡ | | j¡ | | j¡ | | j¡ | |¡ | j	 ||  | ¡ ¡ ¡ ¡ | j	 ||¡ | j	 ¡  d S )Nr;   zServer kex "f" is out of range)Ú
get_stringrU   r   r   r
   rW   r   r	   r\   r   r^   r]   r`   r_   r   r%   r(   r&   r)   rP   r   r   rc   ra   r[   rb   Ú_verify_keyrh   )r   r-   Úhost_keyrm   ri   rk   r   r   r   r4   þ   s6   
û
zKexGex._parse_kexdh_gex_replyN)F)Ú__name__Ú
__module__Ú__qualname__r7   r(   r)   r&   r   ra   r   r.   r:   rI   r/   r5   r0   r2   r4   r   r   r   r   r   3   s    

&+r   c                   @   s   e Zd ZdZeZdS )ÚKexGexSHA256z$diffie-hellman-group-exchange-sha256N)rq   rr   rs   r7   r   ra   r   r   r   r   rt     s    rt   )Ú__doc__rA   Úhashlibr   r   Úparamikor   Úparamiko.commonr   r   r   r   Úparamiko.messager	   Úparamiko.ssh_exceptionr
   Úranger"   r+   r1   r3   r!   r$   rO   rX   rf   r'   r   rt   r   r   r   r   Ú<module>   s0   	ú	ú l