
    mgh                        U d Z ddlZddlmZ ddlmZmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ erdd	lmZ ee   Zeee	e
d
   eef   f   Zg Zeed<   g Zeed<   i Zeed<   g Zeed<   g Zeed<   i Zeed<    G d d
e      Zdede
e   dede	deddfdZ dede
e   dede	deddfdZ!dee   fdZ"dee   fdZ#dee   dee   dedee   fdZ$d d!dedefd"Z%y)#zSSH key exchange handlers    N)md5)TYPE_CHECKINGDictListSequenceTupleType   )	SSHLogger)HashType)SSHPacketHandler)SSHConnectionKex	_kex_algs_default_kex_algs_kex_handlers_gss_kex_algs_default_gss_kex_algs_gss_kex_handlersc                   v    e Zd ZdZdedddefdZdd	Zd
ededdfdZ	e
defd       ZdedededededefdZy)r   z&Parent class for key exchange handlersalgconnr   hash_algc                 P    || _         || _        |j                  | _        || _        y )N)	algorithm_connlogger_logger	_hash_alg)selfr   r   r   s       ,lib/python3.12/site-packages/asyncssh/kex.py__init__zKex.__init__5   s"    
{{!    returnNc                     t         )zStart key exchange)NotImplementedErrorr    s    r!   startz	Kex.start=   s
     "!r#   pkttypeargsc                 D     | j                   j                  |g|d| i y)zSend a kex packethandlerN)r   send_packet)r    r)   r*   s      r!   r-   zKex.send_packetB   s"     	

w<<t<r#   c                     | j                   S )z(A logger associated with this connection)r   r'   s    r!   r   z
Kex.loggerG   s     ||r#   khx
session_idkeylenc                    d}t        |      |k  rl| j                         }|j                  |       |j                  |       |j                  |r|n||z          ||j                         z  }t        |      |k  rl|d| S )z(Compute keys from output of key exchanger#   N)lenr   updatedigest)r    r/   r0   r1   r2   r3   keyhash_objs           r!   compute_keyzKex.compute_keyM   sz     #h~~'HOOAOOAOO3CA
N;8??$$C #h 7F|r#   )r$   N)__name__
__module____qualname____doc__bytesr   r"   r(   intr-   propertyr   r   r:    r#   r!   r   r   2   s    0"E " "H ""
=3 =u = =
 	  
U u   %/27<r#   r   r,   r   r*   defaultr$   c                 t    t         j                  |        |rt        j                  |        |||ft        | <   y)z!Register a key exchange algorithmN)r   appendr   r   r   r,   r   r*   rC   s        r!   register_kex_algrG   \   s4     S  %!8T2M#r#   c                 t    t         j                  |        |rt        j                  |        |||ft        | <   y)z(Register a GSSAPI key exchange algorithmN)r   rE   r   r   rF   s        r!   register_gss_kex_algrI   h   s5     $$S)%x6cr#   c                      t         t        z   S )z(Return supported key exchange algorithms)r   r   rB   r#   r!   get_kex_algsrK   t   s     9$$r#   c                      t         t        z   S )z&Return default key exchange algorithms)r   r   rB   r#   r!   get_default_kex_algsrM   z   s     !#444r#   kex_algsmechshost_key_availablec                     g }| D ]u  }|j                  d      rN|D ]H  }dt        j                  t        |      j	                               dd z   }|j                  ||z          J b|se|j                  |       w |S )z<Add mechanisms to GSS entries in key exchange algorithm list   gss-   -N)
startswithbinascii
b2a_base64r   r7   rE   )rN   rO   rP   expanded_kex_algsr   mechsuffixs          r!   expand_kex_algsr[      s     &(>>'" 3 3CI4D4D4F G LL!((v6   $$S)  r#   r   r   c                     |j                  d      r#|j                  dd      d   }t        |   \  }}}nt        |   \  }}} ||| |g| S )zReturn a key exchange handler

       The function looks up a key exchange algorithm and returns a
       handler which can perform that type of key exchange.

    rR   rS   r
   r   )rU   rsplitr   r   )r   r   r,   r   r*   s        r!   get_kexr^      s[     ~~gjjq!!$"3C"84"/"443h...r#   )&r>   rV   hashlibr   typingr   r   r   r   r   r	   loggingr   miscr   packetr   
connectionr   r?   _KexAlgListobject
_KexAlgMapr   __annotations__r   r   r   r   r   r   boolrG   rI   rK   rM   r[   r^   rB   r#   r!   <module>rj      su  *     C C   $ ) 5k%tE{Hf<==>
 	;  " + "z { %' { ' " : "'
 'T	3% 	3$s) 	3x 	3 	3+/	348	3	7e 	7d3i 	78 	7$	7/3	78<	7%d5k %5d5k 5huo huo (,15e"// / /# /r#   