
    Ii^                         S r SSKrSSKrSSKrSSKrSSKrSSKrSSKJr  SSK	J
r
  SSKJrJrJrJrJrJrJr  SSKJr  SSKJrJr  SSKJr  S	 r " S
 S\5      rS r " S S5      rg)z
Packet handling
    N)HMAC)util)linefeed_bytecr_byte_value	MSG_NAMESDEBUG	xffffffff	zero_bytebyte_ord)u)SSHExceptionProxyCommandFailure)Messagec                 6    [        XU5      R                  5       $ N)r   digest)keymessagedigest_classs      5/venv/lib/python3.13/site-packages/paramiko/packet.pycompute_hmacr   .   s    l+2244    c                       \ rS rSrSrSrg)NeedRekeyException2   z)
Exception indicating a rekey is needed.
 N)__name__
__module____qualname____firstlineno____doc____static_attributes__r   r   r   r   r   2   s     	r   r   c                     S n[        U R                  5      [        L a(  [        U R                  5      S:  a  U R                  S   nU$ Nr   )typeargstuplelen)eargs     r   	first_argr+   :   s7    
CAFF|uQVVqffQiJr   c                   >   \ rS rSrSr\" SS5      r\" SS5      r\" SS5      r\" SS5      r	S r
\S 5       rS rS rS	 r    S&S jr   S'S jrS rS rS rS rS rS rS rS rS rS rS rS rS rS(S jrS r S r!S r"S r#S r$S  r%S! r&S" r'S# r(S$ r)S%r*g
))
PacketizerA   z1
Implementation of the base SSH packet protocol.
      c                    Xl         S U l        SU l        SU l        SU l        SU l        [        5       U l        SU l        SU l	        SU l
        SU l        SU l        SU l        SU l        SU l        SU l        SU l        SU l        S U l        S U l        SU l        S U l        S U l        [        5       U l        [        5       U l        S U l        S U l        SU l        SU l        SU l        SU l        SU l         SU l!        S U l"        S U l#        [H        RJ                  " 5       U l&        SU l'        [P        RP                  " 5       U l)        S U l*        S U l+        SU l,        SU l-        g )NFr      )._Packetizer__socket_Packetizer__logger_Packetizer__closed_Packetizer__dump_packets_Packetizer__need_rekey_Packetizer__init_countbytes_Packetizer__remainder_initial_kex_done_Packetizer__sent_bytes_Packetizer__sent_packets_Packetizer__received_bytes_Packetizer__received_packets$_Packetizer__received_bytes_overflow&_Packetizer__received_packets_overflow_Packetizer__block_size_out_Packetizer__block_size_in_Packetizer__mac_size_out_Packetizer__mac_size_in_Packetizer__block_engine_out_Packetizer__block_engine_in_Packetizer__sdctr_out_Packetizer__mac_engine_out_Packetizer__mac_engine_in_Packetizer__mac_key_out_Packetizer__mac_key_in _Packetizer__compress_engine_out_Packetizer__compress_engine_in _Packetizer__sequence_number_out_Packetizer__sequence_number_in_Packetizer__etm_out_Packetizer__etm_in_Packetizer__aead_out_Packetizer__aead_in_Packetizer__iv_out_Packetizer__iv_in	threadingRLock_Packetizer__write_lock_Packetizer__keepalive_intervaltime_Packetizer__keepalive_last_Packetizer__keepalive_callback_Packetizer__timer_Packetizer__handshake_complete_Packetizer__timer_expired)selfsockets     r   __init__Packetizer.__init__Q   sc   #! 7!&  !"#)*&+,( !" "&!%  $#"W!G%)"$(!%&"$%!   &OO- %&! $		$(!$)!$r   c                     U R                   $ r   )r5   ra   s    r   closedPacketizer.closed   s    }}r   c                     SU l         g r$   )rO   rf   s    r   reset_seqno_outPacketizer.reset_seqno_out   s
    %&"r   c                     SU l         g r$   )rP   rf   s    r   reset_seqno_inPacketizer.reset_seqno_in   s
    $%!r   c                     Xl         g)z/
Set the Python log object to use for logging.
N)r4   )ra   logs     r   set_logPacketizer.set_log   s	     r   Nc
                     Xl         X`l        X l        X0l        X@l        XPl        SU l        SU l        Xpl        Xl	        Xl
        U =R                  S-  sl        U R                  S:X  a  SU l        SU l        gg)zL
Switch outbound data cipher.
:param etm: Set encrypt-then-mac from OpenSSH
r         FN)rF   rH   rB   rI   rD   rK   r<   r=   rQ   rS   rU   r8   r7   )
ra   block_engine
block_size
mac_enginemac_sizemac_keysdctretmaeadiv_outs
             r   set_outbound_cipherPacketizer.set_outbound_cipher   s}      #/  * *&$ 	Q! !D %D "r   c	                    Xl         X l        X0l        X@l        XPl        SU l        SU l        SU l        SU l        X`l	        Xpl
        Xl        U =R                  S-  sl        U R                  S:X  a  SU l        SU l        gg)zK
Switch inbound data cipher.
:param etm: Set encrypt-then-mac from OpenSSH
r   r/   ru   FN)rG   rC   rJ   rE   rL   r>   r?   r@   rA   rR   rT   rV   r8   r7   )	ra   rv   rw   rx   ry   rz   r|   r}   iv_ins	            r   set_inbound_cipherPacketizer.set_inbound_cipher   s     ".))%# !"#)*&+,( 	Q! !D %D "r   c                     Xl         g r   )rM   ra   
compressors     r   set_outbound_compressor"Packetizer.set_outbound_compressor   s    %/"r   c                     Xl         g r   )rN   r   s     r   set_inbound_compressor!Packetizer.set_inbound_compressor   s    $.!r   c                 F    SU l         U R                  R                  5         g NT)r5   r3   closerf   s    r   r   Packetizer.close   s    r   c                     Xl         g r   r6   )ra   hexdumps     r   set_hexdumpPacketizer.set_hexdump   s    %r   c                     U R                   $ r   r   rf   s    r   get_hexdumpPacketizer.get_hexdump       """r   c                     U R                   $ r   )rE   rf   s    r   get_mac_size_inPacketizer.get_mac_size_in   s    !!!r   c                     U R                   $ r   )rD   rf   s    r   get_mac_size_outPacketizer.get_mac_size_out   r   r   c                     U R                   $ )z
Returns ``True`` if a new set of keys needs to be negotiated.  This
will be triggered during a packet read or write, so it should be
checked after every read or write, or at least after every few.
r7   rf   s    r   
need_rekeyPacketizer.need_rekey   s        r   c                 P    Xl         X l        [        R                  " 5       U l        g)z
Turn on/off the callback keepalive.  If ``interval`` seconds pass with
no data read from or written to the socket, the callback will be
executed and the timer will be reset.
N)rZ   r]   r[   r\   )ra   intervalcallbacks      r   set_keepalivePacketizer.set_keepalive   s     %-!$,! $		r   c                     SU l         g r   )r`   rf   s    r   
read_timerPacketizer.read_timer  s
    #r   c                     U R                   (       dJ  [        R                  " [        U5      U R                  5      U l         U R                   R                  5         gg)z
Tells `Packetizer` that the handshake process started.
Starts a book keeping timer that can signal a timeout in the
handshake process.

:param float timeout: amount of seconds to wait before timing out
N)r^   rW   Timerfloatr   start)ra   timeouts     r   start_handshakePacketizer.start_handshake  s:     ||$??5>4??KDLLL  r   c                 b    U R                   (       d  gU R                  (       a  gU R                  $ )a"  
Checks if the handshake has timed out.

If `start_handshake` wasn't called before the call to this function,
the return value will always be `False`. If the handshake completed
before a timeout was reached, the return value will be `False`

:return: handshake time out status, as a `bool`
F)r^   r_   r`   rf   s    r   handshake_timed_outPacketizer.handshake_timed_out  s&     ||$$###r   c                 x    U R                   (       a)  U R                   R                  5         SU l        SU l        gg)z6
Tells `Packetizer` that the handshake has completed.
FTN)r^   cancelr`   r_   rf   s    r   complete_handshakePacketizer.complete_handshake#  s0     <<LL!#(D (,D% r   c                 J   [        5       n[        U R                  5      S:  a1  U R                  SU nU R                  US U l        U[        U5      -  nUS:  a  SnU R                  5       (       a
  [	        5       e U R
                  R                  U5      n[        U5      S:X  a
  [	        5       eX5-  nU[        U5      -  nU(       a\  U R                  (       a
  [	        5       eU(       a*  [        U5      S:X  a  U R                  (       a
  [        5       eU R!                  5         US:  a  M  U$ ! [        R                   a    Sn N[        R                   aG  n[        U5      nU[        R                  :X  a  Sn SnANU R                  (       a
  [	        5       ee SnAff = f)z
Read as close to N bytes as possible, blocking as long as necessary.

:param int n: number of bytes to read
:return: the data read, as a `str`

:raises:
    ``EOFError`` -- if the socket was closed before all the bytes could
    be read
r   NFT)r9   r(   r:   r   EOFErrorr3   recvrb   r   errorr+   errnoEAGAINr5   r7   r   _check_keepalive)ra   ncheck_rekeyoutgot_timeoutxr)   r*   s           r   read_allPacketizer.read_all,  sX    gt 1$""2A&C#//3DSMA!eK''))j MM&&q)q6Q;"*$SV =="*$CHMt7H7H,..%%'9 !e: 
' >> #"<< 
  l%,,&"&K]]"*$
s%   =AD0 0F"F"!FFF"c                 P   [         R                   " 5       U l        Sn[        U5      S:  a  Sn U R                  R	                  U5      nU(       a  SnU R                  (       a  SnOWS:X  a  US:  a  SnUS-  nUS:  a
  [        5       eU[        U5      :X  a   g XS  n[        U5      S:  a  M  g ! [
        R                   a    Sn N[
        R                   a2  n[        U5      nU[        R                  :X  a  Sn S nANSn S nANS nAf[         a    e [         a    Sn Nf = f)Nr   FT
   rt   )r[   r\   r(   r3   sendrb   r   r   r+   r   r   r   	Exceptionr5   r   )ra   r   #iteration_with_zero_as_return_valueretry_writer   r)   r*   s          r   	write_allPacketizer.write_all\  s    $		./+#hlKMM&&s+ ==A6ABF A3q831uj CH} b'CE #hlF 	? >> #"<< l%,,&"&KA&  s)   B1 1D%	D%!D	D		D%$D%c                    U R                   n[        U;  a  X R                  U5      -  n[        U;  a  M  UR                  [        5      nX#S-   S U l         USU n[	        U5      S:  a  US   [
        :X  a  USS n[        U5      $ )zq
Read a line from the socket.  We assume no data is pending after the
line, so it's okay to attempt large reads.
rt   Nr   r   )r:   r   _read_timeoutindexr(   r   r   )ra   r   bufr   s       r   readlinePacketizer.readline  s    
 3&%%g..C 3&IIm$1uw<"1gHqLs2w-7cr(Cvr   c                 z    USS  n[         R                  US5      nUS-   nUR                  SS5      nUSS U-   nU$ )N   bigrt   r2   r   )int
from_bytesto_bytes)ra   iviv_counter_b
iv_counterinc_iv_counterinc_iv_counter_bnew_ivs          r   _inc_iv_counterPacketizer._inc_iv_counter  sQ     !"v^^L%8
#a)221e<Aa++r   c                 Z   UR                  5       n[        US   5      nU[        ;   a
  [        U   nOSR                  U5      n[	        U5      nU R
                  R                  5          U R                  b  U R                  U5      nU R                  U5      nU R                  (       aP  U R                  [        SR                  X45      5        U R                  [        [        R                  " US5      5        U R                  b  U R                  (       a%  USS U R                  R!                  USS 5      -   nOU R"                  (       aT  USS U R                  R%                  U R&                  USS USS 5      -   nU R)                  U R&                  5      U l        OU R                  R!                  U5      nOUnU R                  by  U R"                  (       dh  [*        R,                  " SU R.                  5      nXpR                  (       a  UOU-   nU[1        U R2                  XR4                  5      SU R6                   -  nU R.                  S-   [8        -  n	U	S:X  a  U R:                  (       d  [=        S	5      eXl        U R?                  U5        U =R@                  [	        U5      -  sl         U =RB                  S-  sl!        U RB                  U RD                  :  =(       d    U R@                  U RF                  :  n
U
(       ak  U RH                  (       dZ  S
nU R                  [        UR                  U RB                  U R@                  5      5        SU l%        SU l&        U RO                  5         U R
                  RQ                  5         g! U R
                  RQ                  5         f = f)zB
Write a block of data using the current cipher, as an SSH block.
r   ${:x}NzWrite packet <{}>, length {}zOUT: r   >Irt   /Sequence number rolled over during initial kex!z(Rekeying (hit {} packets, {} bytes sent)))asbytesr   r   formatr(   rY   acquirerM   _build_packetr6   _logr   r   format_binaryrF   rQ   updaterS   encryptrU   r   structpackrO   r   rK   rI   rD   r	   r;   r   r   r<   r=   REKEY_PACKETSREKEY_BYTESr7   r@   rA   _trigger_rekeyrelease)ra   datacmdcmd_nameorig_lenpacketr   packedpayloadnext_seqsent_too_muchmsgs               r   send_messagePacketizer.send_message  s   
 ||~tAw) ~H~~c*Ht9!!#;	())511$7''-F""		299(M 		%!3!3FG!DE&&2>> 1+(?(?(F(Fqr
) C __ !1+(?(?(G(Gvabz6!A;) C %)$8$8$GDM1188@C&&24??T4+E+EF >>CvF|&&1F1F'D'') ) 22Q6)CH1}T%;%;"E  *2&NN3S)1$##t'9'99 9$$(8(88  T%6%6@		3::d&9&94;L;LM 23.340##%%%'D%%'s   *L	N N*c           	         U R                  U R                  SS9nU R                  (       a  [        R                  " SUSS 5      S   nX R                  -
  S-   nUSS U R                  USS9-   nU R                  U R
                  SS9n[        R                  " SU R                  U5      U-   n[        U R                  X`R                  5      SU R
                   n[        R                  " Xu5      (       d  [        S	5      eUnU R                  (       a  [        R                  " SUSS 5      S   nUSS nX R                  -
  S-   U R
                  -   nUSS U R                  USS9-   nU R                  R!                  U R"                  XH5      nU R%                  U R"                  5      U l        U R                  b,  U R                  (       d  U R                  R'                  U5      nU R(                  (       a+  U R+                  [,        [        R.                  " US
5      5        U R                  (       d  U R                  (       a  UnO[        R                  " SUSS 5      S   nUSS n	U[1        U	5      -
  U R                  -  S:w  a  [        S5      eU R                  X R
                  -   [1        U	5      -
  5      n
U
SU[1        U	5      -
   nX[1        U	5      -
  S nU R                  b  U R                  R'                  U5      nX-   nU R(                  (       a+  U R+                  [,        [        R.                  " US
5      5        U R
                  S:  a  U R                  (       d  U R                  (       d  WSU R
                   n[        R                  " SU R                  W5      U-   n[        U R                  X`R                  5      SU R
                   n[        R                  " Xu5      (       d  [        S	5      e[3        US   5      nUSWU-
   nU R(                  (       a%  U R+                  [,        SR5                  X,5      5        U R6                  b  U R7                  U5      n[9        USS 5      nU R                  Ul        U R                  S-   [<        -  nUS:X  a  U R>                  (       d  [        S5      eXl        X R
                  -   S-   nU =R@                  U-  sl         U =RB                  S-  sl!        U RD                  (       aj  U =RF                  U-  sl#        U =RH                  S-  sl$        U RH                  U RJ                  :  d  U RF                  U RL                  :  a  [        S5      eOU RB                  U RN                  :  d  U R@                  U RP                  :  aZ  SnU R+                  [,        UR5                  U RB                  U R@                  5      5        SU l#        SU l$        U RS                  5         [3        US   5      nU[T        ;   a
  [T        U   nOSR5                  U5      nU R(                  (       a/  U R+                  [,        SR5                  U[1        U5      5      5        UU4$ )z
Only one thread should ever be in this function (no other locking is
done).

:raises: `.SSHException` -- if the packet is mangled
:raises: `.NeedRekeyException` -- if the transport should rekey
T)r   r   Nr   r   Fz>IIzMismatched MACzIN: zInvalid packet blockingrt   z"Got payload ({} bytes, {} padding)r   z+Remote transport is ignoring rekey requestsz,Rekeying (hit {} packets, {} bytes received)r   zRead packet <{}>, length {})+r   rC   rR   r   unpackrE   r   rP   r   rL   rJ   r   constant_time_bytes_eqr   rT   rG   decryptrV   r   r   r6   r   r   r   r(   r   r   rN   r   seqnor	   r;   r>   r?   r7   r@   rA   REKEY_PACKETS_OVERFLOW_MAXREKEY_BYTES_OVERFLOW_MAXr   r   r   r   )ra   headerpacket_size	remainingr   macmac_payloadmy_macaadleftoverr   post_packetpaddingr   r   r   raw_packet_sizeerrr   r   s                       r   read_messagePacketizer.read_message  s    t33F== --fRaj9!<K#&:&::Q>IABZ$--	u-"MMF-- 2 2-FCE4#<#<kJ  "!!;0D0D"""$F ..v;;"#344F>> !--fRaj9!<K!*C222Q69K9KK  ABZ$--	u-"MMF++33DLL&NF//=DL!!-dnn++226:FIIeT//?@
 ==DNNF !--fRaj9!<K abzHc(m+t/C/CCqH"#<==--0003x=@C 6;X67FCM9;<K%%1//66v>&FIIeT//?@!$--2 2 23CE4#<#<kJ  "!!;0D0D"""$F ..v;;"#3446!9%[723II4;; $$0//8Ggabk"--	--1Y>q=!7!7A  %-! &(:(::Q>01$ **o=*,,1,00223 ..$2O2OO"A  P
 %%););;!!T%5%55 ACII

422D4I4IJ ./D*/0D,!wqz") ~H~~c*HII-44Xs7|L Cxr   c                     U R                   c  g [        [        U5      [        5      (       a%  U H  nU R                   R	                  X5        M      g U R                   R	                  X5        g r   )r4   
issubclassr%   listrp   )ra   levelr   ms       r   r   Packetizer._log}  sP    == d3i&&!!%+  MMe)r   c                     U R                   (       a"  U R                  (       a  U R                  (       a  g [        R                  " 5       nXR                  U R                   -   :  a  U R                  5         Xl        g g r   )rZ   rF   r7   r[   r\   r]   )ra   nows     r   r   Packetizer._check_keepalive  s\    ))**   iik&&)B)BBB%%'$'! Cr   c                 p   [         R                   " 5       n  U R                  R                  S5      n[        U5      S:X  a
  [	        5       e U$ ! [
        R                   a     Of = fU R                  (       a
  [	        5       e[         R                   " 5       nXB-
  U:  a  [
        R                  " 5       eM  )N   r   )r[   r3   r   r(   r   rb   r   r5   )ra   r   r   r   r  s        r   r   Packetizer._read_timeout  s    		MM&&s+q6Q;"*$  >> }}j ))+C{g%nn&& s   4A A&%A&c                 x   U R                   nU R                  (       d  U R                  (       a  SOSnSU-   [        U5      U-   U-  -
  n[        R
                  " S[        U5      U-   S-   U5      nXQ-  nU R                  (       d  U R                  c  U[        U-  -  nU$ U[        R                  " U5      -  nU$ )Nr   r2   ru   z>IBrt   )rB   rQ   rS   r(   r   r   rH   rF   r
   osurandom)ra   r   bsizeaddlenr  r   s         r   r   Packetizer._build_packet  s    %% nnQe)Gv 5>?UCL7$:Q$>Ht66> i'))F  bjj))Fr   c                     SU l         g r   r   rf   s    r   r   Packetizer._trigger_rekey  s
     r   )*	__aead_in
__aead_out__block_engine_in__block_engine_out__block_size_in__block_size_out__closed__compress_engine_in__compress_engine_out__dump_packets__etm_in	__etm_out__handshake_complete__init_count__iv_in__iv_out__keepalive_callback__keepalive_interval__keepalive_last__logger__mac_engine_in__mac_engine_out__mac_key_in__mac_key_out__mac_size_in__mac_size_out__need_rekey__received_bytes__received_bytes_overflow__received_packets__received_packets_overflow__remainder__sdctr_out__sent_bytes__sent_packets__sequence_number_in__sequence_number_out__socket__timer__timer_expired__write_lockr;   )FFFN)FFN)F)+r   r   r   r    r!   powr   r   r  r	  rc   propertyrg   rj   rm   rq   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r   r   r   r   r"   r   r   r   r-   r-   A   s    2JMa*K "%Q"1bz5%n  '&  &R  &D0/&#"#!,$
!$ -.`&P	H(TQj*("$!r   r-   )r!   r   r%  rb   r   rW   r[   hmacr   paramikor   paramiko.commonr   r   r   r   r	   r
   r   paramiko.utilr   paramiko.ssh_exceptionr   r   paramiko.messager   r   r   r   r+   r-   r   r   r   <module>r]     s`   &  	          D $5	 	w	! w	!r   