ó őůPc@sńdZddlZddlZddlZddlZddlZddlZddlTddlm Z ddl m Z ddl m Z eZyddlZeZWnek rˇnXd„Zdefd „ƒYZd efd „ƒYZdS( s Packetizer. i˙˙˙˙N(t*(tutil(t SSHException(tMessagecCsHtrtj|||ƒjƒSddlm}|j|||ƒjƒS(Ni˙˙˙˙(tHMAC(t got_r_hmactr_hmacRtdigestt Crypto.Hash(tkeytmessaget digest_classR((s*..\python\site-packages\paramiko\packet.pyt compute_hmac*stNeedRekeyExceptioncBseZRS((t__name__t __module__(((s*..\python\site-packages\paramiko\packet.pyR 1st PacketizercBseZdZeddƒZeddƒZd„Zd„Zd„Zd„Z d„Z d„Z d „Z d „Z d „Zd „Zd „Zd„Zd„Zed„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„Zd„ZRS(s9 Implementation of the base SSH packet protocol. iicCs||_d|_t|_t|_t|_d|_d|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_tjƒ|_d|_t j ƒ|_!d|_"dS(Nitil(#t_Packetizer__sockettNonet_Packetizer__loggertFalset_Packetizer__closedt_Packetizer__dump_packetst_Packetizer__need_rekeyt_Packetizer__init_countt_Packetizer__remaindert_Packetizer__sent_bytest_Packetizer__sent_packetst_Packetizer__received_bytest_Packetizer__received_packetst&_Packetizer__received_packets_overflowt_Packetizer__block_size_outt_Packetizer__block_size_int_Packetizer__mac_size_outt_Packetizer__mac_size_int_Packetizer__block_engine_outt_Packetizer__block_engine_int_Packetizer__mac_engine_outt_Packetizer__mac_engine_int_Packetizer__mac_key_outt_Packetizer__mac_key_int _Packetizer__compress_engine_outt_Packetizer__compress_engine_int _Packetizer__sequence_number_outt_Packetizer__sequence_number_int threadingtRLockt_Packetizer__write_lockt_Packetizer__keepalive_intervalttimet_Packetizer__keepalive_lastt_Packetizer__keepalive_callback(tselftsocket((s*..\python\site-packages\paramiko\packet.pyt__init__?s<                           cCs ||_dS(s? Set the python log object to use for logging. N(R(R5tlog((s*..\python\site-packages\paramiko\packet.pytset_loggscCsv||_||_||_||_||_d|_d|_|jdO_|jdkrrd|_t|_ ndS(s. Switch outbound data cipher. iiiN( R$R R&R"R(RRRRR(R5t block_enginet block_sizet mac_enginetmac_sizetmac_key((s*..\python\site-packages\paramiko\packet.pytset_outbound_cipherms        cCs||_||_||_||_||_d|_d|_d|_|jdO_|jdkr{d|_t |_ ndS(s- Switch inbound data cipher. iiiN( R%R!R'R#R)RRRRRR(R5R:R;R<R=R>((s*..\python\site-packages\paramiko\packet.pytset_inbound_cipher~s         cCs ||_dS(N(R*(R5t compressor((s*..\python\site-packages\paramiko\packet.pytset_outbound_compressorscCs ||_dS(N(R+(R5RA((s*..\python\site-packages\paramiko\packet.pytset_inbound_compressor“scCst|_|jjƒdS(N(tTrueRRtclose(R5((s*..\python\site-packages\paramiko\packet.pyRE–s cCs ||_dS(N(R(R5thexdump((s*..\python\site-packages\paramiko\packet.pyt set_hexdumpšscCs|jS(N(R(R5((s*..\python\site-packages\paramiko\packet.pyt get_hexdumpscCs|jS(N(R#(R5((s*..\python\site-packages\paramiko\packet.pytget_mac_size_in scCs|jS(N(R"(R5((s*..\python\site-packages\paramiko\packet.pytget_mac_size_outŁscCs|jS(s+ Returns C{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. @return: C{True} if a new set of keys needs to be negotiated (R(R5((s*..\python\site-packages\paramiko\packet.pyt need_rekeyŚscCs%||_||_tjƒ|_dS(sÎ Turn on/off the callback keepalive. If C{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(R1R4R2R3(R5tintervaltcallback((s*..\python\site-packages\paramiko\packet.pyt set_keepalive°s  cCs÷d}t|jƒdkrK|j| }|j||_|t|ƒ8}ntra|j||ƒSx|dkrňt}yN|jj|ƒ}t|ƒdkrŠtƒ‚n||7}|t|ƒ8}WnÓtj k rŕt }nştj k r™}t |j ƒtkr;t|j ƒdkr;|j dtjkr;t }qšt |j ƒtkr~t|j ƒdkr~|j dtjkr~qš|jr“tƒ‚qš‚nX|rd|jrľtƒ‚n|rât|ƒdkrâ|jrâtƒ‚n|jƒqdqdW|S(s* Read as close to N bytes as possible, blocking as long as necessary. @param n: number of bytes to read @type n: int @return: the data read @rtype: str @raise EOFError: if the socket was closed before all the bytes could be read Ri(tlenRtPY22t_py22_read_allRRtrecvtEOFErrorR6ttimeoutRDterrorttypetargsttupleterrnotEAGAINtEINTRRRR t_check_keepalive(R5tnt check_rekeytoutt got_timeouttxte((s*..\python\site-packages\paramiko\packet.pytread_allşs@     @ @    ! cCs{tjƒ|_xet|ƒdkrvt}y|jj|ƒ}Wn×tjk r\t}nžtj k r}t |j ƒt krˇt|j ƒdkrˇ|j dt jkrˇt}qt |j ƒt krút|j ƒdkrú|j dt jkrúqd}ntk rd}nX|r;d}|jr;d}q;n|dkrStƒ‚n|t|ƒkriPn||}qWdS(Nii˙˙˙˙(R2R3RORRtsendR6RTRDRURVRWRXRYRZR[t ExceptionRRS(R5R_R`R]Rb((s*..\python\site-packages\paramiko\packet.pyt write_allěs2 @ @       cCsŒ|j}x#d|kr.||j|ƒ7}q W|jdƒ}||d|_|| }t|ƒdkrˆ|ddkrˆ|d }n|S(s‰ Read a line from the socket. We assume no data is pending after the line, so it's okay to attempt large reads. s iii˙˙˙˙s (Rt _read_timeouttindexRO(R5RTtbufR]((s*..\python\site-packages\paramiko\packet.pytreadline s  " cCst|ƒ}t|dƒ}|tkr5t|}n d|}t|ƒ}|jjƒz—|jd k r||j|ƒ}n|j|ƒ}|j rÍ|j t d||fƒ|j t t j |dƒƒn|jd krń|jj|ƒ}n|}|jd krEtjd|jƒ|}|t|j||jƒ|j 7}n|jdd@|_|j|ƒ|jt|ƒ7_|jd7_|j|jksŽ|j|jkrî|j rî|j t d|j|jfƒd|_|jƒnWd |jjƒXd S( sR Write a block of data using the current cipher, as an SSH block. is$%xsWrite packet <%s>, length %dsOUT: s>Iil˙˙s(Rekeying (hit %d packets, %d bytes sent)N( tstrtordt MSG_NAMESROR0tacquireR*Rt _build_packetRt_logtDEBUGRt format_binaryR$tencrypttstructtpackR,R R(R&R"RfRRt REKEY_PACKETSt REKEY_BYTESRRt_trigger_rekeytrelease(R5tdatatcmdtcmd_nametorig_lentpacketR_tpayload((s*..\python\site-packages\paramiko\packet.pyt send_messages>       & $   cCs„|j|jdtƒ}|jdkr<|jj|ƒ}n|jrd|jtt j |dƒƒnt j d|d ƒd}|d}|t |ƒ|jdkr´tdƒ‚n|j||jt |ƒƒ}||t |ƒ }||t |ƒ}|jdkr |jj|ƒ}n|jrH|jtt j |dƒƒn||}|jdkrÇ||j }t jd|j|ƒ|}t|j||jƒ|j } | |krÇtdƒ‚qÇnt|dƒ} |d || !} |jr|jtd || fƒn|jdk r/|j| ƒ} nt| d ƒ} |j| _|jd d @|_|j||jd7_|jd 7_|jrÁ|jd 7_|jd krtd ƒ‚qnZ|j|jksĺ|j|jkr|jtd|j|jfƒd|_|jƒnt| dƒ} | t krDt | }n d| }|jrz|jtd|t | ƒfƒn| | fS(sÝ Only one thread should ever be in this function (no other locking is done). @raise SSHException: if the packet is mangled @raise NeedRekeyException: if the transport should rekey R^sIN: s>IiisInvalid packet blockings>IIsMismatched MACis"Got payload (%d bytes, %d padding)l˙˙is+Remote transport is ignoring rekey requestss,Rekeying (hit %d packets, %d bytes received)s$%xsRead packet <%s>, length %dN(!RcR!RDR%RtdecryptRRpRqRRrRttunpackRORR#RuR-R R)R'RlR+RtseqnoRRRRRvRwRxRm(R5theadert packet_sizetleftoverRiR~t post_packettmact mac_payloadtmy_mactpaddingRtmsgR{R|((s*..\python\site-packages\paramiko\packet.pyt read_messageDsf                 #cCsf|jdkrdStt|ƒtƒrOx7|D]}|jj||ƒq/Wn|jj||ƒdS(N(RRt issubclassRVtlistR8(R5tlevelRŒtm((s*..\python\site-packages\paramiko\packet.pyRps  cCs]|j s|j s|jr!dStjƒ}||j|jkrY|jƒ||_ndS(N(R1R$RR2R3R4(R5tnow((s*..\python\site-packages\paramiko\packet.pyR\™s   cCsšx˛|dkr´tj|jgggdƒ\}}}|j|krg|jrZtƒ‚n|jƒq|jj|ƒ}t|ƒdkr—tƒ‚n||7}|t|ƒ8}qW|S(Nigš™™™™™š?(tselectRRRSR\RRRO(R5R]R_trtwRbRa((s*..\python\site-packages\paramiko\packet.pyRQŁs'     cCsÇtjƒ}x´trÂtj|jgggdƒ\}}}|j|kr|jjdƒ}t|ƒdkr{tƒ‚nPn|jr”tƒ‚ntjƒ}|||krtj ƒ‚qqW|S(Ngš™™™™™š?ii( R2RDR“RRRRORSRR6RT(R5RTtstartR”R•RbRaR’((s*..\python\site-packages\paramiko\packet.pyt_py22_read_timeout˛s  '    cCsźtr|j|ƒStjƒ}x–trˇy5|jjdƒ}t|ƒdkr[tƒ‚nPWntj k rsnX|j r‰tƒ‚ntjƒ}|||kr"tj ƒ‚q"q"W|S(Ni€i( RPR—R2RDRRRRORSR6RTR(R5RTR–RaR’((s*..\python\site-packages\paramiko\packet.pyRgÂs"       cCs|j}d|t|ƒd|}tjdt|ƒ|d|ƒ}||7}|jdk rw|tj|ƒ7}n|tdƒ|7}|S(Niis>IBii( R RORtRuR$Rtrngtreadtchr(R5RtbsizeR‹R~((s*..\python\site-packages\paramiko\packet.pyRoŐs # cCs t|_dS(N(RDR(R5((s*..\python\site-packages\paramiko\packet.pyRxăs( RRt__doc__tpowRvRwR7R9R?R@RBRCRERGRHRIRJRKRNRRcRfRjR€RRpR\RQR—RgRoRx(((s*..\python\site-packages\paramiko\packet.pyR5s8 (           2   + L    (RœRYR“R6RtR.R2tparamiko.commontparamikoRtparamiko.ssh_exceptionRtparamiko.messageRRRRRDt ImportErrorR ReR tobjectR(((s*..\python\site-packages\paramiko\packet.pyts&