3 L]RV@sdZddlZddlZddlZddlZddlZddlZddlmZddl m Z ddl m Z m Z mZmZmZmZmZddlmZmZddlmZmZddlmZd d ZGd d d eZd dZGdddeZ dS)z Packet handling N)HMAC)util) linefeed_byte cr_byte_valueasbytes MSG_NAMESDEBUG xffffffff zero_byte)ubyte_ord) SSHExceptionProxyCommandFailure)MessagecCst|||jS)N)rdigest)keymessageZ digest_classr5/tmp/pip-install-wfra5znf/paramiko/paramiko/packet.py compute_hmac.src@seZdZdZdS)NeedRekeyExceptionz1 Exception indicating a rekey is needed. N)__name__ __module__ __qualname____doc__rrrrr2srcCs.d}t|jtkr*t|jdkr*|jd}|S)Nr)typeargstuplelen)eargrrr first_arg:s r!c@s"eZdZdZeddZeddZeddZeddZddZ e ddZ dd Z d>d d Z d?d dZddZddZddZddZddZddZddZddZdd Zd!d"Zd#d$Zd%d&Zd'd(Zd@d)d*Zd+d,Zd-d.Zd/d0Zd1d2Z d3d4Z!d5d6Z"d7d8Z#d9d:Z$d;d<Z%d=S)A Packetizerz9 Implementation of the base SSH packet protocol. cCs||_d|_d|_d|_d|_d|_t|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_d|_d|_t|_t|_d|_d|_d|_d|_d|_d|_tj |_!d|_"t#j#|_$d|_%d|_&d|_'d|_(dS)NFr))_Packetizer__socket_Packetizer__logger_Packetizer__closed_Packetizer__dump_packets_Packetizer__need_rekey_Packetizer__init_countbytes_Packetizer__remainder_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 threadingRLock_Packetizer__write_lock_Packetizer__keepalive_intervaltime_Packetizer__keepalive_last_Packetizer__keepalive_callback_Packetizer__timer_Packetizer__handshake_complete_Packetizer__timer_expired)selfsocketrrr__init__QsJ  zPacketizer.__init__cCs|jS)N)r()rOrrrclosedszPacketizer.closedcCs ||_dS)z? Set the Python log object to use for logging. N)r')rOlogrrrset_logszPacketizer.set_logFcCs^||_||_||_||_||_||_d|_d|_||_|j dO_ |j dkrZd|_ d|_ dS)zd Switch outbound data cipher. :param etm: Set encrypt-then-mac from OpenSSH rFN) r8r:r4r;r6r=r.r/rCr+r*)rO block_engine block_size mac_enginemac_sizemac_keyZsdctretmrrrset_outbound_ciphers zPacketizer.set_outbound_ciphercCsd||_||_||_||_||_d|_d|_d|_d|_||_ |j dO_ |j dkr`d|_ d|_ dS)zc Switch inbound data cipher. :param etm: Set encrypt-then-mac from OpenSSH rr#rVFN) r9r5r<r7r>r0r1r2r3rDr+r*)rOrWrXrYrZr[r\rrrset_inbound_ciphers  zPacketizer.set_inbound_ciphercCs ||_dS)N)r?)rO compressorrrrset_outbound_compressorsz"Packetizer.set_outbound_compressorcCs ||_dS)N)r@)rOr_rrrset_inbound_compressorsz!Packetizer.set_inbound_compressorcCsd|_|jjdS)NT)r(r&close)rOrrrrbszPacketizer.closecCs ||_dS)N)r))rOZhexdumprrr set_hexdumpszPacketizer.set_hexdumpcCs|jS)N)r))rOrrr get_hexdumpszPacketizer.get_hexdumpcCs|jS)N)r7)rOrrrget_mac_size_inszPacketizer.get_mac_size_incCs|jS)N)r6)rOrrrget_mac_size_outszPacketizer.get_mac_size_outcCs|jS)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. )r*)rOrrr need_rekeyszPacketizer.need_rekeycCs||_||_tj|_dS)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)rHrKrIrJ)rOintervalcallbackrrr set_keepaliveszPacketizer.set_keepalivecCs d|_dS)NT)rN)rOrrr read_timerszPacketizer.read_timercCs(|js$tjt||j|_|jjdS)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)rLrETimerfloatrkstart)rOtimeoutrrrstart_handshakeszPacketizer.start_handshakecCs|js dS|jrdS|jS)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)rLrMrN)rOrrrhandshake_timed_outs zPacketizer.handshake_timed_outcCs |jr|jjd|_d|_dS)zF Tells `Packetizer` that the handshake has completed. FTN)rLcancelrNrM)rOrrrcomplete_handshakes zPacketizer.complete_handshakecCsLt}t|jdkr>|jd|}|j|d|_|t|8}x|dkrFd}|jr^ty6|jj|}t|dkr~t||7}|t|8}Wnrtjk rd}YnZtj k r}z:t |}|t j krd}n|t j krn|jrtnWYdd}~XnX|rB|jrt|r, length {}zOUT: z>IrUz(Rekeying (hit {} packets, {} bytes sent))#rr rformatrrGacquirer? _build_packetr)_logrr format_binaryr8rCupdatestructpackrArr=r;r6r rr.r/ REKEY_PACKETS REKEY_BYTESr*r2r3_trigger_rekeyrelease) rOdatacmdcmd_nameZorig_lenpacketr}packedpayloadZ sent_too_muchmsgrrr send_messagesV             zPacketizer.send_messagecCs|j|jdd}|jrtjd|ddd}||jd}|dd|j|dd}|j|jdd}tjd|j||}t|j ||j d|j}t j ||st d |}|jdk r|jj|}|jr|jtt j|d |jr|}ntjd|ddd}|dd}|t||jdkr,t d |j||jt|} | d|t|}| |t|d} |jdk r|jj|}||}|jr|jtt j|d |jdkr|j r| d|j}tjd|j||}t|j ||j d|j}t j ||st d t|d} |d || } |jrH|jtd j|| |jdk r^|j| } t| d d} |j| _|jd t@|_||jd}|j|7_|jd 7_|jr|j|7_|jd 7_|j|j ks|j|j!krFt dnL|j|j"ks|j|j#krFd}|jt|j|j|jd|_d|_|j$t| d}|t%krft%|}n dj|}|jr|jtdj|t| || fS)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|z>INrrFz>IIzMismatched MACzIN: zInvalid packet blockingrUz"Got payload ({} bytes, {} padding)z+Remote transport is ignoring rekey requestsz,Rekeying (hit {} packets, {} bytes received)z${:x}zRead packet <{}>, length {})&rr5rDrunpackr7rrBrr>r<rZconstant_time_bytes_eqr r9rr)rrrrr rr@rZseqnor r0r1r*r2r3REKEY_PACKETS_OVERFLOW_MAXREKEY_BYTES_OVERFLOW_MAXrrrr)rOheaderZ packet_size remainingrmacZ mac_payloadZmy_macleftoverrZ post_packetpaddingrrZraw_packet_sizeerrrrrrr read_messages                 zPacketizer.read_messagecCsL|jdkrdStt|tr:x*|D]}|jj||q"Wn|jj||dS)N)r' issubclassrlistrS)rOlevelrmrrrrEs   zPacketizer._logcCsD|j s|j s|jrdStj}||j|jkr@|j||_dS)N)rHr8r*rIrJrK)rOnowrrrrzNszPacketizer._check_keepalivecCstj}xy$|jjd}t|dkr*tPWnHtjk rDYn4tk rv}zt|t j krdnWYdd}~XnX|j rttj}|||kr tjq W|S)Nr) rIr&rurrtrProEnvironmentErrorr!rwryr()rOrornr~rrrrrr[s&    zPacketizer._read_timeoutcCs~|j}|jrdnd}d|t|||}tjdt||d|}||7}|js^|jdkrl|t|7}n|tj |7}|S)Nrr%rVz>IBrU) r4rCrrrr:r8r osurandom)rOrZbsizeZaddlenrrrrrrqszPacketizer._build_packetcCs d|_dS)NT)r*)rOrrrrszPacketizer._trigger_rekeyN)FF)F)F)&rrrrpowrrrrrQpropertyrRrTr]r^r`rarbrcrdrerfrgrjrkrprqrsrrrrrrrzrrrrrrrr"AsF    0       3+?  r")!rrwrrPrrErIhmacrZparamikorZparamiko.commonrrrrrr r Zparamiko.py3compatr r Zparamiko.ssh_exceptionr rZparamiko.messagerrrrr!objectr"rrrrs   $