U v`%@sdZddlmZddlZddlZddlmZddlmZm Z m Z m Z Gddde Z Gd d d e ZGd d d eZGd dde ZGdddeZGdddedefiZdZd*ddZddZddZddZddZd d!Zd"d#Zd$d%Zd&d'Zd(d)ZdS)+z#Simple packet creation and parsing.)absolute_importN)partial) compat_ord compat_izip iteritemsntolec@s eZdZdS)ErrorN__name__ __module__ __qualname__rra/private/var/folders/0j/yyfkg7712236ncpm167bvylc27vst9/T/pip-unpacked-wheel-y9gppv54/dpkt/dpkt.pyr sr c@s eZdZdS) UnpackErrorNr rrrrrsrc@s eZdZdS)NeedDataNr rrrrrsrc@s eZdZdS) PackErrorNr rrrrrsrc@seZdZddZdS) _MetaPacketcCst||||}t|dd}|dk rdd|Ddg|d<t||||}dd|D|_t|ddd d d|D|_t|j|_t t |jd d|D|_ |S) N__hdr__cSsg|] }|dqSrr.0xrrr #sz'_MetaPacket.__new__..data __slots__cSsg|] }|dqSrrrrrrr%sZ__byte_order__>cSsg|] }|dqS)rrrrrrr&scSsg|] }|dqS)rrrrrr)s) type__new__getattr__hdr_fields__join __hdr_fmt__structcalcsize __hdr_len__dictr__hdr_defaults__)clsZclsnameZclsbasesZclsdicttstrrrr s " z_MetaPacket.__new__N)r r r r rrrrrsrc@s`eZdZdZddZddZddZdd Zd d Zd d Z ddZ ddZ ddZ ddZ dS)PacketaBase packet class, with metaclass magic to generate members from self.__hdr__. Attributes: __hdr__: Packet header should be defined as a list of (name, structfmt, default) tuples. __byte_order__: Byte order, can be set to override the default ('>') Example: >>> class Foo(Packet): ... __hdr__ = (('foo', 'I', 1), ('bar', 'H', 2), ('baz', '4s', 'quux')) ... >>> foo = Foo(bar=3) >>> foo Foo(bar=3) >>> str(foo) '\x00\x00\x00\x01\x00\x03quux' >>> foo.bar 3 >>> foo.baz 'quux' >>> foo.foo = 7 >>> foo.baz = 'whee' >>> foo Foo(baz='whee', foo=7, bar=3) >>> Foo('hello, world!') Foo(baz=' wor', foo=1751477356L, bar=28460, data='ld!') cOsd|_|rzz||dWqtjk rvt|d|jkrZtdt|d|jftd|jj |dfYqXnB|j D]}t ||t |j |qt|D]\}}t |||qt|drttj|j|_dS)aPacket constructor with ([buf], [field=val,...]) prototype. Arguments: buf -- optional packet buffer to unpack Optional keyword arguments correspond to members to set (matching fields in self.__hdr__, or 'data'). rzgot %d, %d needed at leastzinvalid %s: %rr$N)runpackr%errorlenr'rr __class__r r"setattrcopyr)rhasattrrpackr$ _pack_hdr)selfargskwargskvrrr__init__Js   zPacket.__init__cCs|jt|jSN)r'r1rr8rrr__len__gszPacket.__len__cCstt|jjt|j|jjSr>)iterzipr2r"map __getitem__r?rrr__iter__jszPacket.__iter__cCs*z t||WStk r$tYnXdSr>)r!AttributeErrorKeyError)r8r;rrrrDms zPacket.__getitem__c sg}tdgD]~\}}}t|}|j|kr|ddkrR|d||fq|dD]0}ttj|dtr\|d|t|fq\q|fddtj Dj r|dj djj d |fS) Nrr_%s=%rcs:g|]2\}}|ddkr|jjjkrd||fqS)rrHrI)rr2r lower)r attr_name attr_valuer?rrrs z#Packet.__repr__..zdata=%rz%s(%s)z, ) r!r)appendsplit isinstancer2propertyextendr__dict__rr r#)r8Zl_ field_namerHZ field_valueZ prop_namerr?r__repr__ss"   zPacket.__repr__cCs t|Sr>)str __bytes__r?rrr__str__szPacket.__str__cCs|t|jSr>)pack_hdrbytesrr?rrrrVszPacket.__bytes__c szjfddjDWSttjfk rg}jD].}t|}t|tr`||q<| |q.N)r7r" TypeErrorr%r0r!rOtuplerQrMr6r$rrU)r8valsr;r<err?rrXs     zPacket.pack_hdrcCst|S)z(Return packed header + self.data string.)rYr?rrrr6sz Packet.packcCsJt|jt|j|d|jD]\}}t|||q ||jd|_dS)z8Unpack packet header fields from buf, and set self.data.N)rr"r%r/r$r'r3r)r8bufr;r<rrrr/s  z Packet.unpackN)r r r __doc__r=r@rErDrTrWrVrXr6r/rrrrr--sr-ZTemps................................ !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[.]^_`abcdefghijklmnopqrstuvwxyz{|}~.................................................................................................................................cCsxd}g}|rn|d|||d}}ddd|D}|td}|d||d||f||7}qd |S) z3Return a hexdump output string of the given buffer.rN cSsg|]}dt|qS)z%02x)rrrrrrszhexdump..zutf-8z %04d: %-*s %s )r# translate __vis_filterdecoderM)r^lengthnreslineZhexarrrhexdumps rkcCsZt|}|dd}td|d|d|}|t|}||krV|t|d7}|S)Nrz<{}H)r1r%r/formatsumr)sr^rhZcntarirrr in_cksum_adds  rqcCs*|d?|d@}||d?7}t|d@S)Nr`i)r)rorrr in_cksum_dones rrcCsttd|S)z"Return computed Internet checksum.r)rrrq)r^rrrin_cksumsrscCsFd}d}t|}||ksttd|dks.tt|}|dksBtdS)Ns zI 0000: 00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e ...............ri81i)rkAssertionErrorrqrs)Z__bufZ__hdhcrrr test_utilss rwc Csddl}Gdddt}|ddd}|jdks2t|ddksBt|jdksPt|d dks`t|t|d W5QRXdS) z2create a Packet subclass and access its propertiesrNc@seZdZdZdS)ztest_getitem..Foo)fooIr)barHrNr r r rrrrrFoosr~rrb)ryr{ryr{Zgrill)pytestr-ryrtr{raisesrGrr~ryrrr test_getitems  rc CsDddl}Gdddt}|dd}|tt|W5QRXdS)z,Try to fit too much data into struct packingrNc@seZdZdZdS)z#test_pack_hdr_overflow..Foo)rx)r{rzrrNr}rrrrr~sr~l)ry)rr-rrrYrrrrtest_pack_hdr_overflows   rcCs.Gdddt}|}t|}|dks*tdS)z8Test the unpacking of a tuple for a single format stringc@seZdZdZdS)z test_pack_hdr_tuple..Foo))r{ZIIrNr}rrrrr~sr~sN)r-rYrt)r~rybrrrtest_pack_hdr_tuple src Cs>ddl}Gdddt}|jtdd|dW5QRXdS)Nrc@seZdZdZddZdS)z*test_unpacking_failure..TestPacket))testBrcSs&t||td|dd|_dS)Nrr)r-r/r% attribute)r8r^rrrr/!s z1test_unpacking_failure..TestPacket.unpackN)r r r rr/rrrr TestPacketsrzinvalid TestPacket: )match)rr-rr)rrrrrtest_unpacking_failuresrcCsBGdddt}|}t|dks&t|d}t|dks>tdS)Nc@s(eZdZdZeddZeddZdS)ztest_repr..TestPacket))_a_brrcSs |jd?S)Nrr?rrrrp-sztest_repr..TestPacket.acSs |jd@S)Nrr?rrrr1sztest_repr..TestPacket.bN)r r r rrPrprrrrrr*s  rz TestPacket()zTestPacket(a=1, b=2))r-reprrt)rZ test_packetrrr test_repr)s  r)r`) r_ __future__rr4r% functoolsrcompatrrrr Exceptionr rrrrrobjectr-rerkrqrrrsrwrrrrrrrrrs0