
    7g^                         d Z ddlZddlZddlZddlZddl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mZmZmZ ddlmZ ddlmZmZ ddlmZ d	 Z G d
 de          Zd Z G d d          ZdS )z
Packet handling
    N)HMAC)util)linefeed_bytecr_byte_value	MSG_NAMESDEBUG	xffffffff	zero_bytebyte_ord)u)SSHExceptionProxyCommandFailure)Messagec                 H    t          | ||                                          S N)r   digest)keymessagedigest_classs      I/var/www/html/syslog/venv/lib/python3.11/site-packages/paramiko/packet.pycompute_hmacr   .   s     Wl++22444    c                       e Zd ZdZdS )NeedRekeyExceptionz1
    Exception indicating a rekey is needed.
    N)__name__
__module____qualname____doc__ r   r   r   r   2   s          	Dr   r   c                     d }t          | j                  t          u r%t          | j                  dk    r| j        d         }|S Nr   )typeargstuplelen)eargs     r   	first_argr(   :   s:    
CAF||uQVqfQiJr   c                   P   e Zd ZdZ edd          Z edd          Z edd          Z edd          Zd Z	e
d             Zd Zd Zd Z	 	 	 	 d%dZ	 	 	 d&dZd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd'dZd Zd Z d Z!d Z"d Z#d  Z$d! Z%d" Z&d# Z'd$ Z(d
S )(
Packetizerz9
    Implementation of the base SSH packet protocol.
          c                    || _         d | _        d| _        d| _        d| _        d| _        t                      | _        d| _        d| _	        d| _
        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d| _        d | _        d | _        d| _        d | _        d | _        t                      | _        t                      | _        d | _        d | _        d| _        d| _        d| _        d| _        d| _         d| _!        d | _"        d | _#        tI          j%                    | _&        d| _'        tQ          j(                    | _)        d | _*        d | _+        d| _,        d| _-        d S )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__zPacketizer.__init__Q   sr   #! 77!&  !"#)*&+,( !" "&!%  $#"WW!GG%)"$(!%&"$%!   &O-- %&! $	$(!$)!$r   c                     | j         S r   )r1   r]   s    r   closedzPacketizer.closed   s
    }r   c                     d| _         d S r!   )rK   ra   s    r   reset_seqno_outzPacketizer.reset_seqno_out   s    %&"""r   c                     d| _         d S r!   )rL   ra   s    r   reset_seqno_inzPacketizer.reset_seqno_in   s    $%!!!r   c                     || _         dS )z?
        Set the Python log object to use for logging.
        N)r0   )r]   logs     r   set_logzPacketizer.set_log   s     r   FNc
                     || _         || _        || _        || _        || _        || _        d| _        d| _        || _        || _	        |	| _
        | xj        dz  c_        | j        dk    rd| _        d| _        dS dS )zd
        Switch outbound data cipher.
        :param etm: Set encrypt-then-mac from OpenSSH
        r         FN)rB   rD   r>   rE   r@   rG   r8   r9   rM   rO   rQ   r4   r3   )
r]   block_engine
block_size
mac_enginemac_sizemac_keysdctretmaeadiv_outs
             r   set_outbound_cipherzPacketizer.set_outbound_cipher   s      #/  * *&$ 	Q!! !D %D "!r   c	                    || _         || _        || _        || _        || _        d| _        d| _        d| _        d| _        || _	        || _
        || _        | xj        dz  c_        | j        dk    rd| _        d| _        dS dS )zc
        Switch inbound data cipher.
        :param etm: Set encrypt-then-mac from OpenSSH
        r   r+   rl   FN)rC   r?   rF   rA   rH   r:   r;   r<   r=   rN   rP   rR   r4   r3   )	r]   rm   rn   ro   rp   rq   rs   rt   iv_ins	            r   set_inbound_cipherzPacketizer.set_inbound_cipher   s     ".))%# !"#)*&+,( 	Q!! !D %D "!r   c                     || _         d S r   )rI   r]   
compressors     r   set_outbound_compressorz"Packetizer.set_outbound_compressor   s    %/"""r   c                     || _         d S r   )rJ   r{   s     r   set_inbound_compressorz!Packetizer.set_inbound_compressor   s    $.!!!r   c                 F    d| _         | j                                         d S NT)r1   r/   closera   s    r   r   zPacketizer.close   s#    r   c                     || _         d S r   r2   )r]   hexdumps     r   set_hexdumpzPacketizer.set_hexdump   s    %r   c                     | j         S r   r   ra   s    r   get_hexdumpzPacketizer.get_hexdump       ""r   c                     | j         S r   )rA   ra   s    r   get_mac_size_inzPacketizer.get_mac_size_in   s    !!r   c                     | j         S r   )r@   ra   s    r   get_mac_size_outzPacketizer.get_mac_size_out   r   r   c                     | j         S )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.
        r3   ra   s    r   
need_rekeyzPacketizer.need_rekey   s       r   c                 R    || _         || _        t          j                    | _        dS )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)rV   rY   rW   rX   )r]   intervalcallbacks      r   set_keepalivezPacketizer.set_keepalive   s(     %-!$,! $	r   c                     d| _         d S r   )r\   ra   s    r   
read_timerzPacketizer.read_timer  s    #r   c                     | j         sGt          j        t          |          | j                  | _         | j                                          dS dS )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)rZ   rS   Timerfloatr   start)r]   timeouts     r   start_handshakezPacketizer.start_handshake  sM     | 	!$?5>>4?KKDLL     	! 	!r   c                 4    | j         sdS | j        rdS | j        S )aR  
        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)rZ   r[   r\   ra   s    r   handshake_timed_outzPacketizer.handshake_timed_out  s,     | 	5$ 	5##r   c                 f    | j         r)| j                                          d| _        d| _        dS dS )zF
        Tells `Packetizer` that the handshake has completed.
        FTN)rZ   cancelr\   r[   ra   s    r   complete_handshakezPacketizer.complete_handshake#  sB     < 	-L!!!#(D (,D%%%	- 	-r   c                 >   t                      }t          | j                  dk    r5| j        d|         }| j        |d         | _        |t          |          z  }|dk    r:d}|                                 rt	                      	 | j                            |          }t          |          dk    rt	                      ||z  }|t          |          z  }nf# t          j        $ r d}Y nSt          j	        $ rB}t          |          }|t          j        k    rd}n| j        rt	                       Y d}~nd}~ww xY w|rS| j        rt	                      |r(t          |          dk    r| j        rt                      |                                  |dk    :|S )a&  
        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)r5   r%   r6   r   EOFErrorr/   recvr^   r   errorr(   errnoEAGAINr1   r3   r   _check_keepalive)r]   ncheck_rekeyoutgot_timeoutxr&   r'   s           r   read_allzPacketizer.read_all,  s    ggt  1$$"2A2&C#/3DSMA!eeK'')) !jj M&&q))q66Q;;"**$qSVV> # # #"< 
 
 
  ll%,&&"&KK] "**$	  KKKK
  (= %"**$ /CHHMMt7HM,...%%'''9 !ee: 
s   AC D>.D><8D99D>c                 :   t          j                     | _        d}t          |          dk    rd}	 | j                            |          }ni# t
          j        $ r d}Y nVt
          j        $ r.}t          |          }|t          j
        k    rd}nd}Y d }~nd }~wt          $ r  t          $ r d}Y nw xY w|rd}| j        rd}n|dk    r|dk    rd}|dz  }|dk     rt                      |t          |          k    rn||d          }t          |          dk    d S )Nr   FT
   rk   )rW   rX   r%   r/   sendr^   r   r   r(   r   r   r   	Exceptionr1   r   )r]   r   #iteration_with_zero_as_return_valueretry_writer   r&   r'   s          r   	write_allzPacketizer.write_all\  sn    $	./+#hhllKM&&s++> # # #"<   ll%,&&"&KKA&        9= A66ABFF A3q831uujj CHH}}abb'CE #hhllF 	s#   A B2B2-$BB21B2c                 J   | j         }t          |vr!||                     |          z  }t          |v!|                    t                    }||dz   d         | _         |d|         }t	          |          dk    r|d         t
          k    r
|dd         }t          |          S )z
        Read a line from the socket.  We assume no data is pending after the
        line, so it's okay to attempt large reads.
        rk   Nr   r   )r6   r   _read_timeoutindexr%   r   r   )r]   r   bufr   s       r   readlinezPacketizer.readline  s    
 3&&4%%g...C 3&&IIm$$q1uww<"1"gHHqLLs2w-77crc(Cvvr   c                     |dd          }t                               |d          }|dz   }|                    dd          }|dd         |z   }|S )N   bigrk   r.   r   )int
from_bytesto_bytes)r]   iviv_counter_b
iv_counterinc_iv_counterinc_iv_counter_bnew_ivs          r   _inc_iv_counterzPacketizer._inc_iv_counter  s[     !""v^^L%88
#a)221e<<AaC++r   c                    |                                 }t          |d                   }|t          v rt          |         }nd                    |          }t	          |          }| j                                         	 | j        |                     |          }|                     |          }| j	        r]| 
                    t          d                    ||                     | 
                    t          t          j        |d                     | j        | j        r.|dd         | j                            |dd                   z   }n| j        r\|dd         | j                            | j        |dd         |dd                   z   }|                     | j                  | _        n| j                            |          }n|}| j        Z| j        sSt+          j        d| j                  }|| j        r|n|z   }|t1          | j        || j                  d| j                 z  }| j        dz   t8          z  }	|	dk    r| j        st=          d	          |	| _        |                     |           | xj         t	          |          z  c_         | xj!        dz  c_!        | j!        | j"        k    p| j         | j#        k    }
|
rd| j$        s]d
}| 
                    t          |                    | j!        | j                              d| _%        d| _&        | '                                 | j        (                                 dS # | j        (                                 w xY w)zR
        Write a block of data using the current cipher, as an SSH block.
        r   ${:x}NzWrite packet <{}>, length {}zOUT: r   >Irk   /Sequence number rolled over during initial kex!z(Rekeying (hit {} packets, {} bytes sent)))asbytesr   r   formatr%   rU   acquirerI   _build_packetr2   _logr   r   format_binaryrB   rM   updaterO   encryptrQ   r   structpackrK   r   rG   rE   r@   r	   r7   r   r   r8   r9   REKEY_PACKETSREKEY_BYTESr3   r<   r=   _trigger_rekeyrelease)r]   datacmdcmd_nameorig_lenpacketr   packedpayloadnext_seqsent_too_muchmsgs               r   send_messagezPacketizer.send_message  s~   
 ||~~tAw) ~HH~~c**Ht99!!###;	()511$77''--F" F		299(HMM   		%!3FG!D!DEEE&2> A 1+(?(F(Fqrr
) ) CC _ 	A !1+(?(G(Gvabbz6!A#;) ) C %)$8$8$G$GDMM188@@CC&24?2T4+EFF 4>$ECCvF|&1F 'D'') ) 2Q6)CH1}}T%;}"E   *2D&NN3S)1$#t'99 9$(88   &T%6 &@		3::d&94;LMM   23.340##%%%%%'''''D%%''''s   ?J/M	 	M$c           	      (   |                      | j        d          }| j        rt          j        d|dd                   d         }|| j        z
  dz   }|dd         |                      |d          z   }|                      | j        d          }t          j        d| j        |          |z   }t          | j	        || j
                  d| j                 }t          j        ||          st          d	          |}| j        rt          j        d|dd                   d         }|dd         }|| j        z
  dz   | j        z   }|dd         |                      |d          z   }| j                            | j        ||          }|                     | j                  | _        | j        !| j        s| j                            |          }| j        r.|                     t,          t          j        |d
                     | j        s| j        r|}nt          j        d|dd                   d         }|dd         }	|t1          |	          z
  | j        z  dk    rt          d          |                      || j        z   t1          |	          z
            }
|
d|t1          |	          z
           }|
|t1          |	          z
  d         }| j        | j                            |          }|	|z   }| j        r.|                     t,          t          j        |d
                     | j        dk    r| j        s| j        sy|d| j                 }t          j        d| j        |          |z   }t          | j	        || j
                  d| j                 }t          j        ||          st          d	          t3          |d                   }|d||z
           }| j        r/|                     t,          d                    ||                     | j        |                     |          }t9          |dd                   }| j        |_        | j        dz   t<          z  }|dk    r| j        st          d          || _        || j        z   dz   }| xj         |z  c_         | xj!        dz  c_!        | j"        rP| xj#        |z  c_#        | xj$        dz  c_$        | j$        | j%        k    s| j#        | j&        k    rt          d          n}| j!        | j'        k    s| j         | j(        k    r]d}|                     t,          |                    | j!        | j                              d| _#        d| _$        | )                                 t3          |d                   }|tT          v rtT          |         }nd                    |          }| j        r<|                     t,          d                    |t1          |                               ||fS )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 blockingrk   z"Got payload ({} bytes, {} padding)r   z+Remote transport is ignoring rekey requestsz,Rekeying (hit {} packets, {} bytes received)r   zRead packet <{}>, length {})+r   r?   rN   r   unpackrA   r   rL   r   rH   rF   r   constant_time_bytes_eqr   rP   rC   decryptrR   r   r   r2   r   r   r   r%   r   r   rJ   r   seqnor	   r7   r:   r;   r3   r<   r=   REKEY_PACKETS_OVERFLOW_MAXREKEY_BYTES_OVERFLOW_MAXr   r   r   r   )r]   headerpacket_size	remainingr   macmac_payloadmy_macaadleftoverr   post_packetpaddingr   r   r   raw_packet_sizeerrr   r   s                       r   read_messagezPacketizer.read_message  so    t3FF= 	 -fRaRj99!<K#d&::Q>IABBZ$--	u-"M"MMF-- 2-FFCE4#<kJJ  "!;0D """$F .vs;; 5"#3444F> 	> !-fRaRj99!<K!*Cd22Q69KK  ABBZ$--	u-"M"MMF+33DL&#NNF//==DL!-dn-+226::F 	AIIeT/??@@@
 = 	'DN 	'FF !-fRaRj99!<K abbzHc(mm+t/CCqHH"#<===--d003x==@ C 6;X667FkCMM9;;<K%1/66v>>&F 	AIIeT/??@@@!!$-!!2 223CE4#<kJJ  "!;0D """$F .vs;; 5"#34446!9%%[7223 	II4;;    $0//88Ggabbk""-	-1Y>q==!7=A   %-! &(::Q>01$ 	" **o=**,,1,,023 3 .$2OOO"A   P
 %);;;!T%555 ACII

42D4IJJ   ./D*/0D,!!!wqz"") ~HH~~c**H 	II-44Xs7||LL   Cxr   c                     | j         d S t          t          |          t                    r"|D ]}| j                             ||           d S | j                             ||           d S r   )r0   
issubclassr"   listrh   )r]   levelr   ms       r   r   zPacketizer._log}  s{    = Fd3ii&& 	* , ,!!%++++, , MeS)))))r   c                     | j         r| j        r| j        rd S t          j                    }|| j        | j         z   k    r|                                  || _        d S d S r   )rV   rB   r3   rW   rX   rY   )r]   nows     r   r   zPacketizer._check_keepalive  sv    )	*	  	 Fikk&)BBBB%%'''$'D!!! CBr   c                 \   t          j                     }	 	 | j                            d          }t          |          dk    rt	                      nZ# t
          j        $ r Y nw xY w| j        rt	                      t          j                     }||z
  |k    rt          j                    |S )NT   r   )rW   r/   r   r%   r   r^   r   r1   )r]   r   r   r   r   s        r   r   zPacketizer._read_timeout  s    		'M&&s++q66Q;;"**$>   } !jj )++CU{g%%n&&&	' s   ;A A$#A$c                 0   | j         }| j        s| j        rdnd}d|z   t          |          |z   |z  z
  }t	          j        dt          |          |z   dz   |          }||z  }| j        s| j        |t          |z  z  }n|t          j
        |          z  }|S )Nr   r.   rl   z>IBrk   )r>   rM   rO   r%   r   r   rD   rB   r
   osurandom)r]   r   bsizeaddlenr   r   s         r   r   zPacketizer._build_packet  s    % n>>Qe)Gv 5>?UCLL7$:Q$>HH' 	*t6> i'))FFbj)))Fr   c                     d| _         d S r   r   ra   s    r   r   zPacketizer._trigger_rekey  s     r   )FFFN)FFN)F))r   r   r   r   powr   r   r   r   r_   propertyrb   rd   rf   ri   rv   ry   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   sr         C2JJM#a**K "%Q"s1bzz5% 5% 5%n   X' ' '& & &    &  &  &  &R  &  &  &  &D0 0 0/ / /  & & &# # #" " "# # #! ! !, , ,$ $ $
! 
! 
!$ $ $ - - -. . . .`& & &P  	 	 	H( H( H(TQ Q Qj* * *( ( (  "  $! ! ! ! !r   r*   )r   r   r  r^   r   rS   rW   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 D D D D D D D $ $ $ $ $ $5 5 5	 	 	 	 	 	 	 	  w	! w	! w	! w	! w	! w	! w	! w	! w	! w	!r   