
    mg*                     x   U d Z ddlmZmZmZmZmZ ddlmZm	Z	m
Z
mZ ddlmZmZmZ ddlmZ eeeeeeef   Zeeeed   ef   f   Zg Zee   ed<   g Zee   ed	<   i Zeed
<    G d d      Z G d de      Z G d de      Z G d de      Z G d de      Z dedee   dededdf
dZ!dee   fdZ"dee   fdZ#	 dFdededefdZ$	 	 dGded ed!eded"ed#edefd$Z%d%e d&d'fd(ed)d'fd*ed+d'fd,ed-d'fd.ed/d'fd0ed1d'fd2ed3dfd4ed5dfd6ed7dfd8ed9dfd:ed;dfd<ed=dfd>ed?dfd@edAdfdBedCdfdDedEdffZ&e&D ]  Z' e!e'  	 y)Hz!Symmetric key encryption handlers    )DictListOptionalTupleType   )BasicCipher	GCMCipherChachaCipherget_cipher_params)MACget_mac_paramsget_mac)UInt64
Encryption	_enc_algs_default_enc_algs_enc_paramsc                       e Zd ZdZe	 	 ddededededededd fd	       Zedede	e
e
ef   fd
       Zde
dedede	eef   fdZde
dede
de	eef   fdZde
dedede
dedee   fdZy)r   z.Parent class for SSH packet encryption objectscipher_namekeyivmac_algmac_keyetmreturnc                     t         )z,Construct a new SSH packet encryption objectNotImplementedErrorclsr   r   r   r   r   r   s          3lib/python3.12/site-packages/asyncssh/encryption.pynewzEncryption.new*   s
    
 "!    c                     t        |      S )=Get parameters of the MAC algorithm used with this encryption)r   r!   r   s     r"   r   zEncryption.get_mac_params1   s     g&&r$   seqheaderpacketc                     t         Encrypt and sign an SSH packetr   selfr(   r)   r*   s       r"   encrypt_packetzEncryption.encrypt_packet7   
     "!r$   first_block
header_lenc                     t         )Decrypt an SSH packet headerr   r/   r(   r2   r3   s       r"   decrypt_headerzEncryption.decrypt_header=   r1   r$   firstrestmacc                     t         )1Verify the signature of and decrypt an SSH packetr   r/   r(   r8   r9   r3   r:   s         r"   decrypt_packetzEncryption.decrypt_packetC   r1   r$   Nr$   r$   F)__name__
__module____qualname____doc__classmethodstrbytesboolr#   r   intr   r0   r7   r   r>    r$   r"   r   r   '   s   8KN.3"c " "5 "5 ""'+"8D" " 'U 'uS#t^/D ' '
"# "u "$").ue|)<""# "E "#&"+0+>""# "e "5 "#&"-2"7?"r$   c                       e Zd ZdZdedefdZe	 	 ddede	de	de	d	e	d
e
dd fd       Zdede	de	dee	e	f   fdZdede	dedee	e	f   fdZdede	de	dede	dee	   fdZy)BasicEncryptionzShim for basic encryptioncipherr:   c                      || _         || _        y N)_cipher_mac)r/   rL   r:   s      r"   __init__zBasicEncryption.__init__M   s    	r$   r   r   r   r   r   r   r   c                 b    t        |||      }t        ||      }|rt        ||      S  | ||      S )z>Construct a new SSH packet encryption object for basic ciphers)r	   r   ETMEncryption)	r!   r   r   r   r   r   r   rL   r:   s	            r"   r#   zBasicEncryption.newQ   s;    
 [#r2gw' --vs##r$   r(   r)   r*   c                     ||z   }| j                   r| j                   j                  ||      nd}| j                  j                  |      |fS )r-   r$   )rP   signrO   encrypt)r/   r(   r)   r*   r:   s        r"   r0   zBasicEncryption.encrypt_packet^   sC     &-1YYdiinnS&)C||##F+S00r$   r2   r3   c                 F    | j                   j                  |      }||d| fS r5   N)rO   decryptr6   s       r"   r7   zBasicEncryption.decrypt_headerg   s*     ll**;7K444r$   r8   r9   c                     || j                   j                  |      z   }| j                  j                  |||      r||d S yr<   N)rO   rY   rP   verifyr/   r(   r8   r9   r3   r:   r*   s          r"   r>   zBasicEncryption.decrypt_packeto   sC     --d3399C-*+&&r$   Nr?   )r@   rA   rB   rC   r	   r   rQ   rD   rE   rF   rG   r#   rH   r   r0   r7   r   r>   rI   r$   r"   rK   rK   J   s    #{   KN.3
$c 
$ 
$5 
$5 
$
$'+
$8I
$ 
$1# 1u 1$1).ue|)<15# 5E 5#&5+0+>5	# 	e 	5 	#&	-2	7?	r$   rK   c                   z    e Zd ZdZdedededeeef   fdZdedededeeef   fd	Zded
edededede	e   fdZ
y)rS   z$Shim for encrypt-then-mac encryptionr(   r)   r*   r   c                 z    || j                   j                  |      z   }|| j                  j                  ||      fS r,   )rO   rV   rP   rU   r.   s       r"   r0   zETMEncryption.encrypt_packet~   s7     $,,..v66tyy~~c6222r$   r2   r3   c                     ||d| fS rX   rI   r6   s       r"   r7   zETMEncryption.decrypt_header        K444r$   r8   r9   r:   c                     ||z   }| j                   j                  |||      r| j                  j                  ||d       S yr[   )rP   r\   rO   rY   r]   s          r"   r>   zETMEncryption.decrypt_packet   sB     99C-<<''z{(;<<r$   N)r@   rA   rB   rC   rH   rF   r   r0   r7   r   r>   rI   r$   r"   rS   rS   {   s    .3# 3u 3$3).ue|)<35# 5E 5#&5+0+>5	# 	e 	5 	#&	-2	7?	r$   rS   c                       e Zd ZdZdefdZe	 	 ddededededed	e	d
d fd       Z
eded
eeee	f   fd       Zdededed
eeef   fdZdededed
eeef   fdZdededededed
ee   fdZy)GCMEncryptionzShim for GCM encryptionrL   c                     || _         y rN   rO   r/   rL   s     r"   rQ   zGCMEncryption.__init__   	    r$   r   r   r   r   r   r   r   c                 (     | t        |||            S )z<Construct a new SSH packet encryption object for GCM ciphers)r
   r    s          r"   r#   zGCMEncryption.new   s    
 9[#r233r$   c                      yr&   )r      TrI   r'   s     r"   r   zGCMEncryption.get_mac_params        r$   r(   r)   r*   c                 :    | j                   j                  ||      S r,   )rO   encrypt_and_signr.   s       r"   r0   zGCMEncryption.encrypt_packet   s     ||,,VV<<r$   r2   r3   c                     ||d| fS rX   rI   r6   s       r"   r7   zGCMEncryption.decrypt_header   ra   r$   r8   r9   r:   c                 N    | j                   j                  |d| ||d |z   |      S r[   )rO   verify_and_decryptr=   s         r"   r>   zGCMEncryption.decrypt_packet   s7     ||..u[j/A/4Z[/AD/H#O 	Or$   Nr?   )r@   rA   rB   rC   r
   rQ   rD   rE   rF   rG   r#   r   rH   r   r0   r7   r   r>   rI   r$   r"   rd   rd      s!   !y  KN.34c 4 45 45 44'+48G4 4 U uS#t^/D  
=# =u =$=).ue|)<=5# 5E 5#&5+0+>5O# Oe O5 O#&O-2O7?Or$   rd   c                       e Zd ZdZdefdZe	 	 ddededededed	e	d
d fd       Z
eded
eeee	f   fd       Zdededed
eeef   fdZdededed
eeef   fdZdededededed
ee   fdZy)ChachaEncryptionz%Shim for chacha20-poly1305 encryptionrL   c                     || _         y rN   rf   rg   s     r"   rQ   zChachaEncryption.__init__   rh   r$   r   r   r   r   r   r   r   c                 $     | t        |            S )z?Construct a new SSH packet encryption object for Chacha ciphers)r   r    s          r"   r#   zChachaEncryption.new   s    
 <$%%r$   c                      yrk   rI   r'   s     r"   r   zChachaEncryption.get_mac_params   rm   r$   r(   r)   r*   c                 N    | j                   j                  ||t        |            S r,   )rO   ro   r   r.   s       r"   r0   zChachaEncryption.encrypt_packet   s!     ||,,VVVC[IIr$   r2   r3   c                 V    || j                   j                  |d| t        |            fS rX   )rO   r7   r   r6   s       r"   r7   zChachaEncryption.decrypt_header   s3     ++K,D,23K9: 	:r$   r8   r9   r:   c                 b    | j                   j                  |d| ||d |z   t        |      |      S r[   )rO   rr   r   r=   s         r"   r>   zChachaEncryption.decrypt_packet   s>     ||..u[j/A/4Z[/AD/H/5c{CA 	Ar$   Nr?   )r@   rA   rB   rC   r   rQ   rD   rE   rF   rG   r#   r   rH   r   r0   r7   r   r>   rI   r$   r"   rt   rt      s&   /|  KN.3&c & &5 &5 &&'+&8J& & U uS#t^/D  
J# Ju J$J).ue|)<J:# :E :#&:+0+>:A# Ae A5 A#&A-2A7?Ar$   rt   enc_alg
encryptionr   defaultr   Nc                     	 t        |       t        j                  |        |rt        j                  |        ||ft        | <   y# t
        $ r Y yw xY w)z Register an encryption algorithmN)r   r   appendr   r   KeyError)r{   r|   r   r}   s       r"   register_encryption_algr      sS    
9+& 	!$$W- *K8G  s   A 	AAc                      t         S )z&Return supported encryption algorithms)r   rI   r$   r"   get_encryption_algsr      s
     r$   c                      t         S )z$Return default encryption algorithms)r   rI   r$   r"   get_default_encryption_algsr      s
     r$   r   c                 r    t         |    \  }}t        |      \  }}}|j                  |      \  }}}	||||||	fS )z1Get parameters of an encryption and MAC algorithm)r   r   r   )
r{   r   r|   r   enc_keysize
enc_ivsizeenc_blocksizemac_keysizemac_hashsizer   s
             r"   get_encryption_paramsr     sS     *'2J->{-K*K]%/%>%>w%G"Ks]s, ,r$   Fr   r   r   r   c                 F    t         |    \  }}|j                  ||||||      S )z:Return an object which can encrypt and decrypt SSH packets)r   r#   )r{   r   r   r   r   r   r|   r   s           r"   get_encryptionr     s,     *'2J>>+sB#FFr$   s   chacha20-poly1305@openssh.comzchacha20-poly1305Ts   aes256-gcm@openssh.comz
aes256-gcms   aes128-gcm@openssh.comz
aes128-gcms
   aes256-ctrz
aes256-ctrs
   aes192-ctrz
aes192-ctrs
   aes128-ctrz
aes128-ctrs
   aes256-cbcz
aes256-cbcs
   aes192-cbcz
aes192-cbcs
   aes128-cbcz
aes128-cbcs   3des-cbczdes3-cbcs   blowfish-cbczblowfish-cbcs   cast128-cbczcast128-cbcs   seed-cbc@ssh.comzseed-cbcs
   arcfour256
arcfour256s
   arcfour128
arcfour128s   arcfourarcfour)r$   r?   )(rC   typingr   r   r   r   r   cryptor	   r
   r   r   r:   r   r   r   r*   r   rH   rG   
_EncParamsrF   rE   _EncParamsMapr   __annotations__r   r   r   rK   rS   rd   rt   r   r   r   r   r   _enc_alg_list_enc_alg_argsrI   r$   r"   <module>r      s  * ( 4 4 K K - -  3S#sD01
UE$|"4c"9::; 	4; !# 4; #]  "  "F.j .bO 8$OJ $ON'Az 'AT9U 9Z8H 9),97;9@D9"T%[ T%[  ,/	,5 	,#(	,3=	, LO5:GE G G5 G5 G!G.2G?IG &'7$ }$ }$ $ $ $ %!%!%!%!%!%!%!%!%!%!?!F #M]+ #r$   