Ñò pØcJc@sódZddkZddkZddkZddkZddkZddkZddkTddkl Z ddk l Z ddk l Z eZyddkZeZWnej onXd„Zdefd „ƒYZd efd „ƒYZdS( s Packetizer. iÿÿÿÿN(t*(tutil(t SSHException(tMessagecCsJtoti|||ƒiƒSddkl}|i|||ƒiƒS(Niÿÿÿÿ(tHMAC(t got_r_hmactr_hmacRtdigestt Crypto.Hash(tkeytmessaget digest_classR((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt compute_hmac*stNeedRekeyExceptioncBseZRS((t__name__t __module__(((s3/usr/lib/python2.6/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|_tiƒ|_d|_t i ƒ|_!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((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt__init__?s<                           cCs ||_dS(s? Set the python log object to use for logging. N(R(R5tlog((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytset_loggscCsx||_||_||_||_||_d|_d|_|idO_|idjod|_t|_ ndS(s. Switch outbound data cipher. iiiN( R$R R&R"R(RRRRR(R5t block_enginet block_sizet mac_enginetmac_sizetmac_key((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytset_outbound_cipherms        cCs||_||_||_||_||_d|_d|_d|_|idO_|idjod|_t |_ ndS(s- Switch inbound data cipher. iiiN( R%R!R'R#R)RRRRRR(R5R:R;R<R=R>((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytset_inbound_cipher~s         cCs ||_dS(N(R*(R5t compressor((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytset_outbound_compressorscCs ||_dS(N(R+(R5RA((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytset_inbound_compressor“scCst|_|iiƒdS(N(tTrueRRtclose(R5((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyRE–s cCs ||_dS(N(R(R5thexdump((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt set_hexdumpšscCs|iS(N(R(R5((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt get_hexdumpscCs|iS(N(R#(R5((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytget_mac_size_in scCs|iS(N(R"(R5((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytget_mac_size_out£scCs|iS(s3 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((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt need_rekey¦scCs%||_||_tiƒ|_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((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt set_keepalive°s  cCsd}t|iƒdjo1|i| }|i||_|t|ƒ8}nto|i||ƒSx©|djo›t}yP|ii|ƒ}t|ƒdjo tƒ‚n||7}|t|ƒ8}Wnáti j o t }nÇti j o·}t |i ƒtjo7t|i ƒdjo!|i dtijo t }q¯t |i ƒtjo1t|i ƒdjo|i dtijoq¯|io tƒ‚q¯‚nX|oV|io tƒ‚n|o*t|ƒdjo|io tƒ‚n|iƒqhqhW|S(s2 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((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytread_allºsB      C C    $ cCs“tiƒ|_x}t|ƒdjoit}y|ii|ƒ}Wnåtij o t}nËti j o£}t |i ƒt jo7t|i ƒdjo!|i dt ijo t}q)t |i ƒt jo1t|i ƒdjo|i dt ijoq)d}ntj o d}nX|od}|io d}qNn|djo tƒ‚n|t|ƒjoPn||}qWdS(Niiÿÿÿÿ(R2R3RORRtsendR6RTRDRURVRWRXRYRZR[t ExceptionRRS(R5R_R`R]Rb((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt write_allìs4 C C     cCs‘|i}x%d|jo||i|ƒ7}q W|idƒ}||d|_|| }t|ƒdjo|ddjo|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]((s3/usr/lib/python2.6/site-packages/paramiko/packet.pytreadline s   $c Cs4t|ƒ}t|dƒ}|tjot|}n d|}t|ƒ}|iiƒzÅ|id j o|i|ƒ}n|i|ƒ}|i o:|i t d||fƒ|i t t i |dƒƒn|id jo|ii|ƒ}n|}|id jo@tid|iƒ|}|t|i||iƒ|i 7}n|idd@|_|i|ƒ|it|ƒ7_|id7_|iddjotiƒn|i|ijp|i|ijoB|i o7|i t d |i|ifƒd|_|i ƒnWd |ii!ƒXd S( sR Write a block of data using the current cipher, as an SSH block. is$%xsWrite packet <%s>, length %dsOUT: s>Iilÿÿids(Rekeying (hit %d packets, %d bytes sent)N("tstrtordt MSG_NAMESROR0tacquireR*Rt _build_packetRt_logtDEBUGRt format_binaryR$tencrypttstructtpackR,R R(R&R"RfRRtrandpooltstirt REKEY_PACKETSt REKEY_BYTESRRt_trigger_rekeytrelease(R5tdatatcmdtcmd_nametorig_lentpacketR_tpayload((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt send_messagesB       ' &   cCs«|i|idtƒ}|idjo|ii|ƒ}n|io |itt i |dƒƒnt i d|d ƒd}|d}|t |ƒ|idjotdƒ‚n|i||it |ƒƒ}||t |ƒ }||t |ƒ}|idjo|ii|ƒ}n|io |itt i |dƒƒn||}|idjoi||i }t id|i|ƒ|}t|i||iƒ|i } | |jotdƒ‚qÕnt|dƒ} |d || !} tiƒ|io|itd || fƒn|idj o|i| ƒ} nt| d ƒ} |i| _|id d @|_|i||id7_|id 7_|io3|id 7_|id jotd ƒ‚q>n^|i|ijp|i|i jo7|itd|i|ifƒd|_|i!ƒnt| dƒ} | t"jot"| }n d| }|io$|itd|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'RlRvt add_eventR+RtseqnoRRRRRxRyRzRm(R5theadert packet_sizetleftoverRiR€t post_packettmact mac_payloadtmy_mactpaddingRtmsgR}R~((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt read_messageGsh                  $cCsj|idjodStt|ƒtƒo(x8|D]}|ii||ƒq2Wn|ii||ƒdS(N(RRt issubclassRVtlistR8(R5tlevelRtm((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyRp“scCsc|i p|i p |iodStiƒ}||i|ijo|iƒ||_ndS(N(R1R$RR2R3R4(R5tnow((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyR\œs   cCsÁxº|djo¬ti|igggdƒ\}}}|i|jo%|io tƒ‚n|iƒq|ii|ƒ}t|ƒdjo tƒ‚n||7}|t|ƒ8}qW|S(Nigš™™™™™¹?(tselectRRRSR\RRRO(R5R]R_trtwRbRa((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyRQ¦s '    cCsÑtiƒ}x¾to¶ti|igggdƒ\}}}|i|jo7|iidƒ}t|ƒdjo tƒ‚nPn|io tƒ‚ntiƒ}|||joti ƒ‚qqW|S(Ngš™™™™™¹?ii( R2RDR–RRRRORSRR6RT(R5RTtstartR—R˜RbRaR•((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyt_py22_read_timeoutµs '    cCsÈto|i|ƒStiƒ}x to˜y7|iidƒ}t|ƒdjo tƒ‚nPWnti j onX|i o tƒ‚ntiƒ}|||joti ƒ‚q$q$W|S(Ni€i( RPRšR2RDRRRRORSR6RTR(R5RTR™RaR•((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyRgÅs$     cCs‘|i}d|t|ƒd|}tidt|ƒ|d|ƒ}||7}|idj o|ti|ƒ7}n|tdƒ|7}|S(Niis>IBii( R RORtRuR$RRvt get_bytestchr(R5RtbsizeRŽR€((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyRoØs # cCs t|_dS(N(RDR(R5((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyRzæs( RRt__doc__tpowRxRyR7R9R?R@RBRCRERGRHRIRJRKRNRRcRfRjR‚RRpR\RQRšRgRoRz(((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyR5s8 (           2   . L    (RžRYR–R6RtR.R2tparamiko.commontparamikoRtparamiko.ssh_exceptionRtparamiko.messageRRRRRDt ImportErrorR ReR tobjectR(((s3/usr/lib/python2.6/site-packages/paramiko/packet.pyts&