o
    ç÷¡gl  ã                   @   s¤   d Z ddlZddl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d
d„ edd	ƒD ƒ\ZZe	dƒed  Zed ZG dd„ dƒZdS )z�
Standard SSH key exchange ("kex" if you wanna sound cool).  Diffie-Hellman of
1024 bit key halves, using a known "p" prime and "g" generator.
é    N)Úsha1)Úutil)Úmax_byteÚ	zero_byteÚbyte_chrÚ	byte_mask)ÚMessage)ÚSSHExceptioné   é    c                 C   s   g | ]}t |ƒ‘qS © )r   )Ú.0Úcr   r   ú>/usr/local/lib/python3.10/dist-packages/paramiko/kex_group1.pyÚ
<listcomp>"   s    r   é   é   é   c                   @   sL   e Zd ZdZdZdZeZdd„ Zdd„ Z	dd	„ Z
d
d„ Zdd„ Zdd„ ZdS )Ú	KexGroup1lE   ÿÿÿÿ8Ê{3If?ñE yéZô3¢Vý58nÛoP·eõ?a-ûÓtBLèûy3W[�<‘p¨6m5ÂÝPøß&aÌF!Í33*¾w& ãAR‘M;L}. c|&A“@”h\Š&&#-D¨v‡dÿÿÿÿ é   zdiffie-hellman-group1-sha1c                 C   s   || _ d| _d| _d| _d S )Nr   )Ú	transportÚxÚeÚf)Úselfr   r   r   r   Ú__init__1   s   
zKexGroup1.__init__c                 C   s€   |   ¡  | jjrt| j| j| jƒ| _| j t	¡ d S t| j| j| jƒ| _
tƒ }| t¡ | | j
¡ | j |¡ | j t¡ d S )N)Ú_generate_xr   Úserver_modeÚpowÚGr   ÚPr   Ú_expect_packetÚ_MSG_KEXDH_INITr   r   Úadd_byteÚc_MSG_KEXDH_INITÚ	add_mpintÚ_send_messageÚ_MSG_KEXDH_REPLY)r   Úmr   r   r   Ú	start_kex7   s   
zKexGroup1.start_kexc                 C   sF   | j jr|tkr|  |¡S | j js|tkr|  |¡S d}t| |¡ƒ‚)Nz*KexGroup1 asked to handle packet type {:d})r   r   r"   Ú_parse_kexdh_initr'   Ú_parse_kexdh_replyr	   Úformat)r   Úptyper(   Úmsgr   r   r   Ú
parse_nextF   s   

zKexGroup1.parse_nextc                 C   sZ   	 t  d¡}t|d dƒ|dd …  }|d d… tkr$|d d… tkr$nqt |¡| _d S )Né   é€   r   r   r   )ÚosÚurandomr   Úb7fffffffffffffffÚb0000000000000000r   Úinflate_longr   )r   Úx_bytesr   r   r   r   P   s   
ùzKexGroup1._generate_xc                 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¡ | | j¡ | |¡ | j
 ||  | ¡ ¡ ¡ ¡ | j
 ||¡ | j
 ¡  d S )Nr0   zServer kex "f" is out of range)Ú
get_stringÚ	get_mpintr   r    r	   Ú
get_binaryr   r   r   Úaddr   Úlocal_versionÚremote_versionÚlocal_kex_initÚremote_kex_initÚ
add_stringr%   r   Ú_set_K_HÚ	hash_algoÚasbytesÚdigestÚ_verify_keyÚ_activate_outbound)r   r(   Úhost_keyÚsigÚKÚhmr   r   r   r+   a   s(   
ü

zKexGroup1._parse_kexdh_replyc                 C   s  |  ¡ | _| jdk s| j| jd krtdƒ‚t| j| j| jƒ}| j ¡  ¡ }t	ƒ }| 
| jj| jj| jj| jj¡ | |¡ | | j¡ | | j¡ | |¡ |  | ¡ ¡ ¡ }| j ||¡ | j ¡  || jj¡}t	ƒ }| t¡ | |¡ | | j¡ | |¡ | j |¡ | j ¡  d S )Nr0   zClient kex "e" is out of range)r9   r   r    r	   r   r   r   Úget_server_keyrC   r   r;   r=   r<   r?   r>   r@   r%   r   rB   rD   rA   Úsign_ssh_dataÚhost_key_typer#   Úc_MSG_KEXDH_REPLYr&   rF   )r   r(   rI   ÚkeyrJ   ÚHrH   r   r   r   r*   z   s8   
ü


ÿ


zKexGroup1._parse_kexdh_initN)Ú__name__Ú
__module__Ú__qualname__r    r   Únamer   rB   r   r)   r/   r   r+   r*   r   r   r   r   r   (   s    
r   )Ú__doc__r2   Úhashlibr   Úparamikor   Úparamiko.commonr   r   r   r   Úparamiko.messager   Úparamiko.ssh_exceptionr	   Úranger"   r'   r$   rN   r4   r5   r   r   r   r   r   Ú<module>   s   