U
    ςdP(                     @   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   M/var/www/html/myproject/myenv/lib/python3.8/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 }|rB|t || j	 d| _
n.|t || j || j	 || j | j | | j t d S )NT)r   Z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   Z_test_old_stylemr   r   r   	start_kexE   s"     

zKexGex.start_kexc                 C   st   |t kr| |S |tkr$| |S |tkr6| |S |tkrH| |S |tkrZ| 	|S d}t
|| j|d S )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@ sL|dK }|dL }q2t|}t|d ||dd   }t|d}|dkrL||k rLqqL|| _	d S )N      r         )
r   r   Zdeflate_longr   lenosurandomr   Zinflate_longr   )r   r   ZqnormZqhbyteZ
byte_countZqmaskZx_bytesr   r   r   r   _generate_xl   s    

zKexGex._generate_xc                 C   s   |  }|  }|  }|| jkr(| j}|| jk r8| j}||krD|}||k rP|}|| _|| _|| _| j }|d k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   r4   get_modulusr   r   r	   r"   c_MSG_KEXDH_GEX_GROUP	add_mpintr)   r   r/   )r   r+   ZminbitsZpreferredbitsZmaxbitspackr   r   r   r-   ~   s@    


  
zKexGex._parse_kexdh_gex_requestc                 C   s   |  | _| j| jkr| j| _| j| jk r2| j| _| j }|d krLtd| jtd	| j |
| j| j| j\| _| _t }|t || j || j | j| | jt d| _d S )NrA   zPicking p (~ {} bits)T)rB   r%   r(   r'   r   rC   r
   rD   r   r4   rE   r   r   r	   r"   rF   rG   r)   r   r/   r   )r   r+   rH   r   r   r   r3      s0    

 
  
z#KexGex._parse_kexdh_gex_request_oldc                 C   s   |  | _|  | _t| j}|dk s0|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
   r4   r   rD   r   r@   powr   r   r	   r"   c_MSG_KEXDH_GEX_INITrG   r)   r   r1   )r   r+   Zbitlenr   r   r   r.      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s|| j || j | js|| j || j || j || j || j || | |  }| j	|| | j	
 || j	j}t }|t || || j || | j	 | | j	!  d S )Nr9   zClient kex "e" is out of range)"rI   r   r   r
   r@   rK   r   r   r   r   Zget_server_keyasbytesr	   addremote_versionlocal_versionremote_kex_initlocal_kex_initr   r$   r'   r%   r(   rG   	hash_algodigest_set_K_HZsign_ssh_dataZhost_key_typer"   c_MSG_KEXDH_GEX_REPLYZ
add_stringr)   _activate_outbound)r   r+   KkeyhmHsigr   r   r   r0      sL    


 


zKexGex._parse_kexdh_gex_initc                 C   s  |  }| | _|  }| jdk s4| j| jd kr<tdt| j| j| j}t }|| j	j
| j	j| j	j| j	j| | js|| j || j | js|| j || j || j || j || j || | j	|| |   | j	|| | j	  d S )Nr9   zServer kex "f" is out of range)Z
get_stringrI   r   r   r
   rK   r   r	   rN   r   rP   rO   rR   rQ   r   r$   r'   r%   r(   rG   r   r   rU   rS   rM   rT   Z_verify_keyrW   )r   r+   Zhost_keyr\   rX   rZ   r   r   r   r2      s6    

zKexGex._parse_kexdh_gex_replyN)F)__name__
__module____qualname__r5   r'   r(   r%   r   rS   r   r,   r8   r@   r-   r3   r.   r0   r2   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)r]   r^   r_   r5   r   rS   r   r   r   r   r`     s   r`   )__doc__r>   hashlibr   r   Zparamikor   Zparamiko.commonr   r   r   r   Zparamiko.messager	   Zparamiko.ssh_exceptionr
   ranger!   r*   r/   r1   r    r#   rF   rL   rV   r&   r   r`   r   r   r   r   <module>   s.   		 l