
    fV                         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      Q/var/www/ffwdstore.be/apps/py-env/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                   B   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#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| _        tA          j!                    | _"        d| _#        tI          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	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   sT   #! 77!&  !"#)*&+,( !" "&!%  $#"WW!GG%)"$(!%&"$%! &O-- %&! $	$(!$)!$r   c                     | j         S r   )r1   rY   s    r   closedzPacketizer.closed   s
    }r   c                     d| _         d S r!   )rK   r]   s    r   reset_seqno_outzPacketizer.reset_seqno_out   s    %&"""r   c                     d| _         d S r!   )rL   r]   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   )rY   logs     r   set_logzPacketizer.set_log   s     r   Fc                     || _         || _        || _        || _        || _        || _        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   r4   r3   )rY   block_engine
block_size
mac_enginemac_sizemac_keysdctretms           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+   rh   FN)rC   r?   rF   rA   rH   r:   r;   r<   r=   rN   r4   r3   )rY   ri   rj   rk   rl   rm   ro   s          r   set_inbound_cipherzPacketizer.set_inbound_cipher   s     ".))%# !"#)*&+,( 	Q!! !D %D "!r   c                     || _         d S r   )rI   rY   
compressors     r   set_outbound_compressorz"Packetizer.set_outbound_compressor   s    %/"""r   c                     || _         d S r   )rJ   rt   s     r   set_inbound_compressorz!Packetizer.set_inbound_compressor   s    $.!!!r   c                 F    d| _         | j                                         d S NT)r1   r/   closer]   s    r   r{   zPacketizer.close   s#    r   c                     || _         d S r   r2   )rY   hexdumps     r   set_hexdumpzPacketizer.set_hexdump   s    %r   c                     | j         S r   r}   r]   s    r   get_hexdumpzPacketizer.get_hexdump       ""r   c                     | j         S r   )rA   r]   s    r   get_mac_size_inzPacketizer.get_mac_size_in   s    !!r   c                     | j         S r   )r@   r]   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   r]   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)rR   rU   rS   rT   )rY   intervalcallbacks      r   set_keepalivezPacketizer.set_keepalive   s(     %-!$,! $	r   c                     d| _         d S rz   )rX   r]   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)rV   rO   Timerfloatr   start)rY   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)rV   rW   rX   r]   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)rV   cancelrX   rW   r]   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/   recvrZ   r   errorr(   errnoEAGAINr1   r3   r   _check_keepalive)rY   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
   rg   )rS   rT   r%   r/   sendrZ   r   r   r(   r   r   r   	Exceptionr1   r   )rY   r   #iteration_with_zero_as_return_valueretry_writer   r&   r'   s          r   	write_allzPacketizer.write_allN  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.
        rg   Nr   r   )r6   r   _read_timeoutindexr%   r   r   )rY   r   bufr   s       r   readlinezPacketizer.readlinev  s    
 3&&4%%g...C 3&&IIm$$q1uww<"1"gHHqLLs2w-77crc(Cvvr   c                    |                                 }t          |d                   }|t          v rt          |         }nd                    |          }t	          |          }| j                                         	 | j        |                     |          }|                     |          }| j	        r]| 
                    t          d                    ||                     | 
                    t          t          j        |d                     | j        P| j        r.|dd         | j                            |dd                   z   }n| j                            |          }n|}| j        St#          j        d| j                  }|| j        r|n|z   }|t)          | j        || j                  d| j                 z  }| j        dz   t0          z  }	|	dk    r| j        st5          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:    >Irg   /Sequence number rolled over during initial kex!z(Rekeying (hit {} packets, {} bytes sent))%asbytesr   r   formatr%   rQ   acquirerI   _build_packetr2   _logr   r   format_binaryrB   rM   updatestructpackrK   r   rG   rE   r@   r	   r7   r   r   r8   r9   REKEY_PACKETSREKEY_BYTESr3   r<   r=   _trigger_rekeyrelease)rY   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!!###3	()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 188@@CC&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   ?IK K: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        | j                            |          }| j        r.|                     t$          t          j        |d
                     | j        r|}nt          j        d|dd                   d         }|dd         }|t)          |          z
  | j        z  dk    rt          d          |                      || j        z   t)          |          z
            }	|	d|t)          |          z
           }|	|t)          |          z
  d         }
| j        | j                            |          }||z   }| j        r.|                     t$          t          j        |d
                     | j        dk    r| j        sy|
d| j                 }t          j        d| j        |          |z   }t          | j	        || j
                  d| j                 }t          j        ||          st          d	          t+          |d                   }|d||z
           }| j        r/|                     t$          d                    ||                     | j        |                     |          }t1          |dd                   }| j        |_        | j        dz   t4          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| _         | %                                 t+          |d                   }|tL          v rtL          |         }nd                    |          }| j        r<|                     t$          d                    |t)          |                               ||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 blockingrg   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   rC   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   )rY   headerpacket_size	remainingr   macmac_payloadmy_macleftoverr   post_packetpaddingr   r   r   raw_packet_sizeerrr   r   s                      r   read_messagezPacketizer.read_message  s    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!-+226::F 	AIIeT/??@@@ = 	'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"   listrd   )rY   levelr   ms       r   r   zPacketizer._logN  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   )rR   rB   r3   rS   rT   rU   )rY   nows     r   r   zPacketizer._check_keepaliveW  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   )rS   r/   r   r%   r   rZ   r   r1   )rY   r   r   r   r   s        r   r   zPacketizer._read_timeoutd  s    		'M&&s++q66Q;;"**$>   } !jj )++CU{g%%n&&&	' s   ;A A$#A$c                 "   | j         }| 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.   rh   z>IBrg   )
r>   rM   r%   r   r   rD   rB   r
   osurandom)rY   r   bsizeaddlenr   r   s         r   r   zPacketizer._build_packetu  s    % n+!e)Gv 5>?UCLL7$:Q$>HH' 	*t6> i'))FFbj)))Fr   c                     d| _         d S rz   r   r]   s    r   r   zPacketizer._trigger_rekey  s     r   N)FF)F)(r   r   r   r   powr   r   r   r   r[   propertyr^   r`   rb   re   rp   rr   rv   rx   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   sV         C2JJM#a**K "%Q"s1bzz/% /% /%b   X' ' '& & &   & & & &J & & & &<0 0 0/ / /  & & &# # #" " "# # #! ! !, , ,$ $ $
! 
! 
!$ $ $ - - -. . . .`& & &P  @( @( @(DC C CN* * *( ( (  "  $! ! ! ! !r   r*   )r   r   r   rZ   r   rO   rS   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	 	 	 	 	 	 	 	  H	! H	! H	! H	! H	! H	! H	! H	! H	! H	!r   