Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
Size: Mime:
B

´ÂßNÅ~.ÿã@sÌdZddlmZddlmZddlmZddlZddlZddlZddl	Z	ddl
Z
ddlZddlm
Z
mZmZmZmZmZmZmZmZmZmZmZddlmZmZddlmZmZmZdd	l m!Z!m"Z"m#Z#m$Z$m%Z%dd
l&m'Z'ddl(m)Z)m*Z*ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1dd
l2m3Z3m4Z4m5Z5ddl6m7Z7ddl8m9m:Z:ddlm;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZHyddlIZIWneJk
r YnXeEde=eKe;feAe=eKe;fƒZLGdd„de: Me$e!e%¡ƒZNGdd„deNƒZOGdd„deNƒZPGdd„dePƒZQePe_ReQe_SejTdkr*ePe_Td1dd„ZUd2dd„ZVejWjXd3dd„ƒZYd4dd „ZZd5d!d"„Z[ejWjXd6d#d$„ƒZ\ejWjXd7d%d&„ƒZ]d8d(d)„Z^ejWjXd9d*d+„ƒZ_ejWjXd:d-d.„ƒZ`ejWjXd;d/d0„ƒZadS)<z‡
Packet class

Provides:
 - the default Packet classes
 - binding mechanisms
 - fuzz() method
 - exploration methods: explore() / ls()
é)Úabsolute_import)Úprint_function)ÚdefaultdictN)ÚAnyFieldÚBitFieldÚConditionalFieldÚEmphÚ	EnumFieldÚFieldÚ
FlagsFieldÚMultiEnumFieldÚMultipleTypeFieldÚPacketListFieldÚRawValÚStrField)ÚconfÚ_version_checker)ÚrawÚorbÚbytes_encode)Ú
BasePacketÚGenÚSetGenÚPacket_metaclassÚ_CanvasDumpExtended)Ú_GlobInterfaceType)Ú	RandFieldÚ
VolatileValue)Ú
import_hexcapÚ
tex_escapeÚcolgenÚ	issubtypeÚpretty_listÚEDecimal)ÚScapy_ExceptionÚlog_runtimeÚwarning)ÚPYX)ÚAnyÚCallableÚDictÚIteratorÚListÚNoReturnÚOptionalÚSetÚTupleÚTypeÚTypeVarÚUnionÚSequenceÚcastÚ_Tc@sêeZdZddddddddd	d
ddd
dddddddddgZdZgZiZiZgZdZ	dZ
dZiZiZ
iZiZiZedd„ƒZedd„ƒZedd„ƒZdÝd"d#„ZeeeefeeeedfeeeeeefZd$d%„Zd&d'„Zd(d)„Z d*d+„Z!d,d-„Z"d.d/„Z#d0d1„Z$d2d3„Z%d4d5„Z&d6d7„Z'd8d9„Z(d:d;„Z)d<d=„Z*d>d?„Z+d@dA„Z,dBdC„Z-dDdE„Z.dFdG„Z/dHdI„Z0dJdK„Z1dLdM„Z2dNdO„Z3dPdQ„Z4dRdS„Z5dTdU„Z6dVdW„Z7e8j9r°dXdY„Z:ndZdY„Z:d[d\„Z;d]d^„Z<e<Z=d_d`„Z>e>Z?dadb„Z@dcdd„ZAdedf„ZBeBZCdgdh„ZDdidj„ZEdkdl„ZFdmdn„ZGdodp„ZHdqdr„ZIdsdt„ZJdudv„ZKdwdx„ZLdydz„ZMd{d|„ZNd}d~„ZOdÞdd€„ZPdßdd‚„ZQdƒd„„ZRd…d†„ZSd‡dˆ„ZTd‰dŠ„ZUd‹dŒ„ZVddŽ„ZWdd„ZXd‘d’„ZYd“d”„ZZd•d–„Z[dàd—d˜„Z\d™dš„Z]d›dœ„Z^ddž„Z_dŸd „Z`d¡d¢„Zad£d¤„Zbd¥d¦„ZcdZdd§d¨„Zed©dª„Zfd«d¬„Zgdád­d®„Zhdâd¯d°„Zid±d²„Zjd³d´„Zkdµd¶„Zld·d¸„Zmd¹dº„Znd»d¼„Zod½d¾„Zpd¿dZqdãdÃdĄZrdädÅdƄZsdådÇdȄZtdædÉdʄZudËd̄ZvdÍd΄ZwdçdÏdЄZxdèdÑd҄ZydÓdԄZzdÕdքZ{d×d؄Z|edÙdڄƒZ}edÛd܄ƒZ~dS)éÚPacketÚtimeÚ	sent_timeÚnameÚdefault_fieldsÚfieldsÚ	fieldtypeÚoverload_fieldsÚoverloaded_fieldsÚpacketfieldsÚoriginalÚexplicitÚraw_packet_cacheÚraw_packet_cache_fieldsÚ_pktÚpost_transformsÚpayloadÚ
underlayerZ	_answeredÚ	directionÚ
sniffed_onÚwirelenNéTFcCs
|tƒƒS)N)r)Úcls©rNúŠ/build/wlanpi-profiler-SHjkbd/wlanpi-profiler-1.0.8/debian/wlanpi-profiler/opt/wlanpi-profiler/lib/python3.7/site-packages/scapy/packet.pyÚfrom_hexcappszPacket.from_hexcapc
Cs@x:|jD]0\}}td|jd dd„t |¡Dƒ¡fƒqWdS)Nz	%-20s  %sz, css|]}dd|VqdS)z%-12sz%s=%rNrN)Ú.0ÚirNrNrOú	<genexpr>ysz%Packet.upper_bonds.<locals>.<genexpr>)Ú
payload_guessÚprintÚ__name__ÚjoinÚsixÚ	iteritems)ÚselfÚfvalÚupperrNrNrOÚupper_bondsuszPacket.upper_bondsc
CsFx@t |j¡D]0\}}td|jd dd„t |¡Dƒ¡fƒqWdS)Nz	%-20s  %sz, css|]}dd|VqdS)z%-12sz%s=%rNrN)rQrRrNrNrOrSsz%Packet.lower_bonds.<locals>.<genexpr>)rXrYÚ_overload_fieldsrUrVrW)rZÚlowerr[rNrNrOÚlower_bonds{szPacket.lower_bondsórc		Ks„t ¡|_d|_|jdkr"|jjn|j|_i|_|j|_i|_	i|_
i|_g|_t
ƒ|_| ¡||_||_d|_d|_d|_d|_d|_d|_|r¬| |¡|s¬| |¡xR|jD]H}|j}y| |¡}Wntk
râw´YnX| |¡ ||¡|j
|<q´WxP|D]H}||jkrD||}|  |¡}| |¡ ||¡|j
|<qt!|ƒ‚qWt"|t#ƒrf||_$n|dkrxg|_$n|g|_$dS)Nr)%r8r9Ú_nameÚ	__class__rVr:r;r^r>r?r<r=r@Ú	NoPayloadrGÚinit_fieldsrHrArBrCrDrKrIrJÚdissectÚdissection_doneÚfields_descÚpopÚKeyErrorÚ	get_fieldÚany2iÚdeprecated_fieldsÚ_resolve_aliasÚAttributeErrorÚ
isinstanceÚlistrF)	rZrEZpost_transformÚ	_internalÚ_underlayerr<ÚfieldÚfnameÚvaluerNrNrOÚ__init__sV





zPacket.__init__cCs&|j| ¡f|j|j|j|j|jffS)zUsed by pickling methods)rcÚbuildr8r9rIrJrK)rZrNrNrOÚ
__reduce__ÄszPacket.__reduce__cCs6|d|_|d|_|d|_|d|_|d|_|S)z$Rebuild state using pickable methodsrrLééé)r8r9rIrJrK)rZÚstaterNrNrOÚ__setstate__Ïs




zPacket.__setstate__cCs| ¡S)zUsed by copy.deepcopy)Úcopy)rZÚmemorNrNrOÚ__deepcopy__ÙszPacket.__deepcopy__cCs*|j |jd¡r| |j¡n| ¡dS)z@
        Initialize each fields of the fields_desc dict
        FN)Úclass_dont_cacheÚgetrcÚdo_init_fieldsrhÚdo_init_cached_fields)rZrNrNrOreàszPacket.init_fieldscCsLi}x<|D]4}t |j¡||j<||j|j<|jr
|j |¡q
W||_dS)z@
        Initialize each fields of the fields_desc dict
        N)	rÚdeepcopyÚdefaultr:r=Ú
holds_packetsr@Úappendr;)rZÚflistr;ÚfrNrNrOr„ës
zPacket.do_init_fieldsc	Cs°|j}tj |d¡dkr$| |j¡tj |d¡}|r¬||_tj||_tj	||_
xVtj|D]H}|j|}y| ¡|j
|<Wq`tk
r¦|dd…|j
|<Yq`Xq`WdS)zn
        Initialize each fields of the fields_desc dict, or use the cached
        fields information
        N)rcr7Úclass_default_fieldsrƒÚprepare_cached_fieldsrhr;Úclass_fieldtyper=Úclass_packetfieldsr@Úclass_default_fields_refrr<ro)rZÚcls_namer;rurvrNrNrOr…ûs
zPacket.do_init_cached_fieldsc	CsÖ|j}|sdStƒ}tƒ}tƒ}tƒ}x‚|D]z}t|tƒrTd|j|<| |j¡dSt 	|j
¡}|||j<|||j<|jr„| 
|¡t|j
tttttfƒr,| 
|j¡q,W|tj|<|tj|<|tj|<|tj|<dS)zC
        Prepare the cached fields of the fields_desc dict
        NT)rcÚdictrqrpr
r‚r„rhrr†r‡r:rˆr‰Úsetrr7rrŽrrŒ)	rZrŠr‘rŒrrŽrr‹Ztmp_copyrNrNrOrs.








zPacket.prepare_cached_fieldscCs| |¡|j |¡dS)z3DEV: will be called after a dissection is completedN)Úpost_dissectionrGrg)rZÚpktrNrNrOrgBs
zPacket.dissection_donecCsdS)z7DEV: is called after the dissection of the whole packetNrN)rZr•rNrNrOr”HszPacket.post_dissectioncCs
|j|S)z:DEV: returns the field instance from the name of the field)r=)rZÚfldrNrNrOrkMszPacket.get_fieldcCs¤|dkrdSt|jtƒs&|j |¡nzt|tƒrj||_| |¡x^|jD]}||jkrH|j||_PqHWn6t|t	t
ttfƒrt
jt|ƒd|_ntdt|ƒƒ‚dS)N)ÚloadzPpayload must be 'Packet', 'bytes', 'str', 'bytearray', or 'memoryview', not [%s])rprGrdÚadd_payloadr7Úadd_underlayerÚ
aliastypesr>r?ÚbytesÚstrÚ	bytearrayÚ
memoryviewrÚ	raw_layerrÚ	TypeErrorÚrepr)rZrGÚtrNrNrOr˜Rs


zPacket.add_payloadcCs|j |¡tƒ|_i|_dS)N)rGÚremove_underlayerrdr?)rZrNrNrOÚremove_payloadeszPacket.remove_payloadcCs
||_dS)N)rH)rZrHrNrNrOr™kszPacket.add_underlayercCs
d|_dS)N)rH)rZÚotherrNrNrOr£oszPacket.remove_underlayercCs’| ¡}| |j¡|_| |j¡|_|j ¡|_|j|_|j|_|j|_| |j	¡|_	|j
|_
|jdd…|_|j ¡|_|j 
|¡|j|_|S)z$Returns a deep copy of the instance.N)rcÚcopy_fields_dictr<r;r?rrHrBrCrDrKrFrGr™r8)rZÚclonerNrNrOrss
zPacket.copycCs(|j|\}}t d|||ft¡|S)Nz0%s has been deprecated in favor of %s since %s !)rmÚwarningsÚwarnÚDeprecationWarning)rZÚattrÚnew_attrÚversionrNrNrOrn‡s
zPacket._resolve_aliascCsb|jr||jkr| |¡}||jkr.|j|S||jkrB|j|S||jkrV|j|S|j |¡S)N)rmrnr<r?r;rGÚgetfieldval)rZr«rNrNrOr®‘s






zPacket.getfieldvalcCs||jr||jkr| |¡}||jkr8| |¡|j|fS||jkrV| |¡|j|fS||jkrt| |¡|j|fSt‚dS)N)rmrnr<rkr?r;Ú
ValueError)rZr«rNrNrOÚgetfield_and_vals



zPacket.getfield_and_valcCsHy| |¡\}}Wntk
r.|j |¡SX|dk	rD| ||¡S|S)N)r°r¯rGÚ__getattr__Zi2h)rZr«r–ÚvrNrNrOr±©szPacket.__getattr__cCsž|jr||jkr| |¡}||jkrp| |¡}|dkr@dd„}n|j}|||ƒ|j|<d|_d|_d|_d|_	n*|dkrŒ| 
¡| |¡n|j 
||¡dS)NcSs|S)NrN)ÚxÚyrNrNrOÚ<lambda>ºraz$Packet.setfieldval.<locals>.<lambda>rrG)rmrnr;rkrlr<rBrCrDrKr¤r˜rGÚsetfieldval)rZr«Úvalr–rlrNrNrOr¶³s 



zPacket.setfieldvalcCsZ||jkr*|dkr| |¡t |||¡Sy| ||¡Stk
rJYnXt |||¡S)Nr9)Ú
__all_slots__Úupdate_sent_timeÚobjectÚ__setattr__r¶ro)rZr«r·rNrNrOr»Ès

zPacket.__setattr__cCsZ||jkr,|j|=d|_d|_d|_d|_n*||jkr8n|dkrJ| ¡n|j |¡dS)NrrG)	r<rBrCrDrKr;r¤rGÚdelfieldval)rZr«rNrNrOr¼Ôs


zPacket.delfieldvalcCsR|dkr| ¡S||jkr&t ||¡Sy
| |¡Stk
rDYnXt ||¡S)NrG)r¤r¸rºÚ__delattr__r¼ro)rZr«rNrNrOr½ãs

zPacket.__delattr__cCsLtƒ}|j}t|dƒr"| |j¡x$|jD]}t|dƒr*| |j¡q*W|S)zV
        Return a list of slots and methods, including those from subclasses.
        r¸Ú__dict__)r“rcÚhasattrÚupdater¸Ú__mro__r¾)rZÚattrsrMZbclsrNrNrOÚ	_superdirïs

zPacket._superdircCstt | ¡|j¡ƒS)z4
        Add fields to tab completion list.
        )ÚsortedÚ	itertoolsÚchainrÃr;)rZrNrNrOÚ__dir__ýszPacket.__dir__c		Cs@d}tj}xþ|jD]ô}t|tƒr,| |¡s,q|j|jkrp|j|j}t|tt	t
fƒrbt|ƒdkrbq| ||¡}nF|j|j
kr|j
|j}t|tt	t
fƒr¦t|ƒdkr¦q| ||¡}nqt|tƒsÊ|tjkrØ|j}|j}n|j}|j}|d||jƒ| d¡||ƒf7}qWd| d¡| |jj¡|| d¡t|jƒ| d¡fS)	NÚrz %s%s%sú=z%s%s %s %s%s%sú<ú|ú>)rÚcolor_themerhrprÚ	_evalcondr:r<rqr’r“ÚlenÚi2reprr?rÚemphÚemph_field_nameÚemph_field_valueÚ
field_nameÚfield_valueÚpunctÚ
layer_namercrVr¡rG)	rZÚsÚctr‹r[r·ZfoverÚncolÚvcolrNrNrOÚ__repr__s<
zPacket.__repr__cCs| ¡S)N)rx)rZrNrNrOÚ__str__)szPacket.__str__cCstdƒt| ¡ƒS)Nz,Calling str(pkt) on Python 3 makes no sense!)r&rœrx)rZrNrNrOrÝ-scCs| ¡S)N)rx)rZrNrNrOÚ	__bytes__2szPacket.__bytes__cCs\t|tƒr(| ¡}| ¡}| |¡|St|ttttfƒrN|tj	t
|ƒdS| |¡SdS)N)r—)rpr7rr˜r›rœrržrrŸrÚ__rdiv__)rZr¥ZcloneAZcloneBrNrNrOÚ__div__6s

zPacket.__div__cCs.t|ttttfƒr&tjt|ƒd|St‚dS)N)r—)	rpr›rœrržrrŸrr )rZr¥rNrNrOrßCszPacket.__rdiv__cCst|tƒr|g|St‚dS)N)rpÚintr )rZr¥rNrNrOÚ__mul__Ks

zPacket.__mul__cCs
| |¡S)N)râ)rZr¥rNrNrOÚ__rmul__RszPacket.__rmul__cCsdS)NTrN)rZrNrNrOÚ__nonzero__VszPacket.__nonzero__cCst| ¡ƒS)N)rÏrÞ)rZrNrNrOÚ__len__[szPacket.__len__cCs| |¡ |¡S)N)rkÚdo_copy)rZÚ	fieldnamervrNrNrOÚcopy_field_value_szPacket.copy_field_valuecs$|dkrdS‡fdd„t |¡DƒS)Ncsi|]\}}ˆ ||¡|“qSrN)rè)rQrur[)rZrNrOú
<dictcomp>gsz+Packet.copy_fields_dict.<locals>.<dictcomp>)rXrY)rZr<rN)rZrOr¦cs
zPacket.copy_fields_dictcCsrd|_x\t |j¡D]L\}}| |¡}|jrt|tƒr@| ¡qt|t	ƒrx|D]}| ¡qPWqW|j
 ¡dS)z>Clear the raw packet cache for the field and all its subfieldsN)rCrXrYr<rkrˆrpr7Úclear_cacherqrG)rZr–r[ZfsubvalrNrNrOrêjs




zPacket.clear_cachecCs |jdk	rVx:t |j¡D]*\}}| |¡|krd|_d|_d|_PqW|jdk	rV|jSd}x@|jD]6}| |j¡}t|t	ƒrŠ|t
|ƒ7}qb| |||¡}qbW|S)ze
        Create the default layer regarding fields_desc dict

        :param field_pos_list:
        Nra)rCrXrYrDr®rKrhr:rprr›Úaddfield)rZrur[Úpr‹r·rNrNrOÚ
self_buildxs 


zPacket.self_buildcCs
|j ¡S)zm
        Create the default version of the payload layer

        :return: a string of payload layer
        )rGÚdo_build)rZrNrNrOÚdo_build_payload‘szPacket.do_build_payloadcCs\|jstt|ƒƒ}| ¡}x|jD]}||ƒ}q"W| ¡}|jdkrP| ||¡S||SdS)zs
        Create the default version of the layer

        :return: a string of the packet with the payload
        N)rBÚnextÚiterrírFrïrCÚ
post_build)rZr•r¢ÚpayrNrNrOrîšs
zPacket.do_buildcCs
|j ¡S)N)rGÚ
build_padding)rZrNrNrOrô¬szPacket.build_paddingcCs"| ¡}|| ¡7}| |¡}|S)zb
        Create the current layer

        :return: string of the packet with the payload
        )rîrôÚ
build_done)rZrìrNrNrOrx°s
zPacket.buildcCs||S)a
        DEV: called right after the current layer is build.

        :param str pkt: the current packet (build by self_buil function)
        :param str pay: the packet payload (build by do_build_payload function)
        :return: a string of the packet with the payload
        rN)rZr•rórNrNrOrò¼s	zPacket.post_buildcCs|j |¡S)N)rGrõ)rZrìrNrNrOrõÇszPacket.build_donec
Cs¼d}g}d}x~|jD]t}t|tƒr.| |¡s.q| ||| |j¡¡}t|tƒrd|t|ƒd…}|}nd}| 	|| 
|| |j¡¡|f¡qW|jjdd\}}||7}| 	||f¡||fS)NrarL)Úinternal)
rhrprrÎrër®r:r›rÏr‰rÐrGÚbuild_ps)rZrìÚplÚqr‹Úrr•ÚlstrNrNrOÚdo_build_psËs 
$zPacket.do_build_pscCs| ¡\}}||fS)N)rü)rZrörìrûrNrNrOr÷ászPacket.build_psc&	s¾tdkrtdƒ‚tj ¡}|r6| t|ƒ¡ ¡\}}n| ¡\}}t|ƒ}x|D]\}}|t|ƒ7}qPWt|ƒ}|‰d}	d‰d}
d}d‰d‰t	dd	d
tj
jd}t	dd
d	tj
jd}
dd„‰‡‡‡‡‡fdd„‰dd„}dd„‰d+‡‡fdd„	}d\}}x¾|r¸t|ƒ}| 
¡\}}|
d
7}
tj |	||
ˆdtt|jƒƒtjjjg¡}|
d7}
| ¡}| tjjd¡| | ¡tj
jjtj |g¡g¡| |¡x
|D]\}}}t|
ƒ}tj |	||
ˆdt|jƒ¡}t|tƒrôd|j}ndt|ƒ}t |dƒr$d|j!jj"dd …ks:d|jj"dd …krBd!|}tj |	d"||
ˆd#|tjj#j$g¡}t|tƒr˜t|ƒd$krœ|dd$…d%}nd&}tj |	d'||
ˆdt|ƒ¡}|
d
7}
|rˆ||||||ƒ\}} }}| }!| ¡}"||"ƒ}#||!ƒ}$|! tjj¡y8|dkr2tj%j&|#|$dd(d)}%ntj%j&|#|$dd*d)}%Wnt'k
r^Yn X| |%tj(j)j*tjj+j,|g¡| |¡| |¡| |¡| |¡q¦W||7}qüW|S),Nrz*PyX and its dependencies must be installedrLé
çgš™™™™™á?gš™™™™™Ù?g333333ã?gš™™™™™é?gð?)Ztransgš™™™™™É?gà?cSsd dd„|Dƒ¡S)Nú css|]}dt|ƒVqdS)z%02xN)r)rQÚcrNrNrOrS	sz5Packet.canvas_dump.<locals>.hexstr.<locals>.<genexpr>)rW)r³rNrNrOÚhexstrsz"Packet.canvas_dump.<locals>.hexstrcs2tj ˆ|ˆˆ|ˆdˆ|ƒtjjjg¡S)Nz\tt{%s})ÚpyxÚtextÚsizeÚLarge)r³r´Útxt)ÚXDSTARTÚXMULÚYDUMPÚYMULrrNrOÚ
make_dump_txts



z)Packet.canvas_dump.<locals>.make_dump_txtcSs&tjj| ¡| ¡| ¡| ¡ddS)N)gà?gà?)Z	relcenter)rZboxZrectÚleftÚbottomÚwidthÚheight)ÚorNrNrOÚmake_boxsz$Packet.canvas_dump.<locals>.make_boxcSs4t|ƒdkr.|d ¡}| tjj¡| ¡S|d ¡}| tjj¡|d ¡}| tjj¡t|ƒdkr,| ¡| ¡kr,tj tj 	| ¡| 
¡¡tj | ¡| 
¡¡tj | ¡| ¡¡tj | ¡| ¡¡tj 	| ¡| 
¡¡tj | ¡| 
¡¡tj | ¡| ¡¡tj | ¡| ¡¡¡S|d ¡}||krP| tjj¡|d ¡}||kr~||kr~| tjj¡tj tj 	| ¡| 
¡¡tj | ¡| 
¡¡tj | ¡| ¡¡tj | ¡| ¡¡tj | ¡| ¡¡tj | ¡| ¡¡tj | ¡| 
¡¡tj | ¡| 
¡¡tj 
¡¡	SdS)NrLréÿÿÿÿrzéþÿÿÿ)rÏÚbboxÚenlargerÚunitÚu_ptÚpathrÚrightZmovetoÚtopZlinetor
Z	closepath)rûÚbZfbZlbÚgbÚkbrNrNrOÚ
make_frames@ 
z&Packet.canvas_dump.<locals>.make_frameéc
sætj ¡}g}x`|rn|d||…|||d…}}ˆ|||ƒ}	| |	¡|t|ƒ7}|dkrd}|d7}qW|dkr‚tjjj}|dkr”tjjj}| ˆ|ƒ|tj	 
|g¡tjjj
g¡x|D]}	| |	¡qÀW||d ¡||fS)NrrrLr)rÚcanvasr‰rÏÚcolorÚrgbÚredÚwhiteÚstrokeÚdecoÚfilledÚstyleÚ	linewidthZThickÚinsertr)
rØÚshiftr´ÚcolÚbkcolZlargerZtlistZdmpr)rrrNrOÚ	make_dumpAs$
"


&
z%Packet.canvas_dump.<locals>.make_dump)rgz"\font\cmssfont=cmss10\cmssfont{%s}rzz%sbz%sBrtZLEr{z$\scriptstyle\langle$g333333@z/\font\cmbxfont=cmssbx10 scaled 600\cmbxfont{%s}éz[...]rÈg@i¦ÿÿÿ)Z	absangle1Z	absangle2éZ)rrþNNr)-r'ÚImportErrorrr rcrr÷rÏÚfloatr r!r"rðrirrrœr:rrrrrrr%rÚblackr&r'r*rprr¿rtrVZhalignZboxrightZ	connectorZcurveÚ	Exceptionr(r)ZthinZearrowÚsmall)&rZZlayer_shiftZrebuildr Ú_r¢ZYTXTIÚlZYTXTZXSTARTr´ZydZ	backcolorZ	forecolorrr.Z
last_shiftZlast_yr-Úprotor<ÚptZptbbrtr[Zfdumpr,ÚftÚfsizeÚstZvtÚdtÚtargetZdtbZvtbZbxvtZbxdtZcnxrN)rrr	r
rrrrOÚcanvas_dumpís¢
	'

$
"*$



zPacket.canvas_dumpcCs|dfS)z±
        DEV: to be overloaded to extract current layer's padding.

        :param str s: the current layer
        :return: a couple of strings (actual layer, padding)
        NrN)rZrØrNrNrOÚextract_paddingœszPacket.extract_paddingcCs|S)z?DEV: is called right after the current layer has been dissectedrN)rZrØrNrNrOÚpost_dissect¦szPacket.post_dissectcCs|S)z:DEV: is called right before the current layer is dissectedrN)rZrØrNrNrOÚpre_dissect«szPacket.pre_dissectcCsš|}i|_xh|jD]^}|sP| ||¡\}}t|tƒr@|dkr@q|jsR|jsR|jrd| |¡|j|j	<||j
|j	<qW|rŠ|dt|ƒ…n||_d|_
|S)NrL)rDrhZgetfieldrprÚislistrˆZ	ismutablerær:r<rÏrCrB)rZrØÚ_rawr‹r[rNrNrOÚ
do_dissect°szPacket.do_dissectc	Cs¨|r¤| |¡}y||d|d}Wnxtk
r6‚Yndtk
r˜tjr„t|tƒrdt d|j	¡nt d|j
j	t|ƒ¡|dk	r„‚tj|d|d}YnX| 
|¡dS)zd
        Perform the dissection of the layer's payload

        :param str s: the raw layer
        rL)rrrsz%s dissector failedz&%s.guess_payload_class() returned [%s]N)Úguess_payload_classÚKeyboardInterruptr4rZdebug_dissectorr!r7r%ÚerrorrVrcr¡rŸr˜)rZrØrMrìrNrNrOÚdo_dissect_payloadÄs 

zPacket.do_dissect_payloadcCsT| |¡}| |¡}| |¡}| |¡\}}| |¡|rPtjrP| t |¡¡dS)N)	rBrErAr@rIrÚpaddingr˜Ú
padding_layer)rZrØÚpaylÚpadrNrNrOrfÞs




zPacket.dissectc
shx\ˆjD]R}xL|jD]B\}}y$t‡fdd„t |¡Dƒƒr>|SWqtk
rTYqXqWqWˆ |¡S)zÓ
        DEV: Guesses the next payload class from layer bonds.
        Can be overloaded to use a different mechanism.

        :param str payload: the layer's payload
        :return: the payload class
        c3s |]\}}|ˆ |¡kVqdS)N)r®)rQÚkr²)rZrNrOrS÷sz-Packet.guess_payload_class.<locals>.<genexpr>)ršrTÚallrXrYroÚdefault_payload_class)rZrGr¢r[rMrN)rZrOrFës	zPacket.guess_payload_classcCstjS)a
        DEV: Returns the default payload class if nothing has been found by the
        guess_payload_class() method.

        :param str payload: the layer's payload
        :return: the default payload class define inside the configuration file
        )rrŸ)rZrGrNrNrOrPþs	zPacket.default_payload_classcCsVxFtt |j¡ƒD]2\}}|j|}||jkr|j||kr|j|=qW|j ¡dS)z;Removes fields' values that are the same as default values.N)rqrXrYr<r;rGÚ
hide_defaults)rZrNr²rNrNrOrQ	s

zPacket.hide_defaultscCsdS)z.Use by clone_with to share the sent_time valueNrN)rZr8rNrNrOr¹szPacket.update_sent_timecKs| ¡}d|_||_| |j¡|_|j ¡|_|j|_|j|_|j	|_	|j
|_
| |j¡|_|j|_|dk	rv| 
|¡|rŒ|fdd„}||_|S)NrLcSs
||_dS)N)r9)r³ÚparentrNrNrOÚ_up_time,sz#Packet.clone_with.<locals>._up_time)rcrBr<r¦r;r?rr8rHrFrCrDrKr˜r¹)rZrGÚ
share_timeÚkargsr•rSrNrNrOÚ
clone_withs$

zPacket.clone_withcsj|f‡fdd„	‰|js |jdk	r,g}|j}n4dd„t t |j¡t |j¡¡Dƒt	|jƒ}i}ˆ||ƒS)z:Iterates through all sub-packets generated by this Packet.c
3s|rz| ¡}| |¡}t|tƒs@| |¡jr8t|gƒ}nt|ƒ}xÒ|D].}|||<x ˆ|dd…|ƒD]
}|VqfWqFWnšt|jtƒr’tdgƒ}n|j}d}|j	|kr¶| 
¡dkr¶d}x\|D]T}	| ¡}
x*|
D]"}t|
|tƒrÎ|
| 
¡|
|<qÎW|jf|	|dœ|
—Ž}|Vq¼WdS)NFrLT)rGrT)rir®rprrkrCrrGrdr<Ú__iterlen__rrÚ_fixrV)
ÚtodoÚdonerZZeltnameÚeltÚer³ZpayloadsrTrLZdone2rNr•)ÚlooprNrOr]6s2




zPacket.__iter__.<locals>.loopNcSsg|]\}}t|tƒr|‘qSrN)rpr)rQrNr²rNrNrOú
<listcomp>\sz#Packet.__iter__.<locals>.<listcomp>)
rBrCr<rÅrÆrXrYr;r?rq)rZrYrZrN)r]rOÚ__iter__2s"zPacket.__iter__c	Cs>dd„t t |j¡t |j¡¡Dƒt|jƒ}d}dd„}xà|D]Ø}| |¡\}}t	|dƒrl|| 
¡9}qB||ƒrŽ||d|dd9}qBt|tƒrB|jsBd}xh|D]`}t	|dƒrÄ|| 
¡7}q¨||ƒræ||d|dd7}q¨t|tƒr|t
|ƒ7}q¨|d7}q¨W||pd9}qBWt|jtƒs:||j 
¡S|S)z(Predict the total length of the iteratorcSsg|]\}}t|tƒr|‘qSrN)rpr)rQÚkeyr·rNrNrOr^esz&Packet.__iterlen__.<locals>.<listcomp>rLcSs,t|tƒsdSt|ƒdko*tdd„|DƒƒS)NFrzcss|]}t|tƒVqdS)N)rprá)rQÚzrNrNrOrSnszAPacket.__iterlen__.<locals>.is_valid_gen_tuple.<locals>.<genexpr>)rpÚtuplerÏrO)r³rNrNrOÚis_valid_gen_tuplejs
z.Packet.__iterlen__.<locals>.is_valid_gen_tuplerWr)rÅrÆrXrYr;r?rqr<r°r¿rWrprCrÏrGrd)	rZr<Úlengthrcrtr–r·Zlen2r³rNrNrOrWbs2



zPacket.__iterlen__ccs&|V|}x|jr |j}|VqWdS)zfUsed to iter through the payloads of a Packet.
        Useful for DNS or 802.11 for instance.
        N)rG)rZÚcurrentrNrNrOÚiterpayloads†s
zPacket.iterpayloadscCs0t|tƒr||kSt|tƒr dSt||fƒ‚dS)z6True if other is an answer from self (self ==> other).rLN)rpr7r›r )rZr¥rNrNrOÚ__gt__‘s


z
Packet.__gt__cCs2t|tƒr| |¡St|tƒr"dSt||fƒ‚dS)z6True if self is an answer from other (other ==> self).rLN)rpr7Úanswersr›r )rZr¥rNrNrOÚ__lt__›s



z
Packet.__lt__cCsVt||jƒsdSx8|jD].}||jkr*dS| |j¡| |j¡krdSqW|j|jkS)NF)rprcrhr®r:rG)rZr¥r‹rNrNrOÚ__eq__¥s
z
Packet.__eq__cCs| |¡S)N)rj)rZr¥rNrNrOÚ__ne__°sz
Packet.__ne__cCs
|j ¡S)zSDEV: returns a string that has the same value for a request
        and its answer.)rGÚhashret)rZrNrNrOrl¸szPacket.hashretcCs|j|jkr|j |j¡SdS)z)DEV: true if self is an answer from otherr)rcrGrh)rZr¥rNrNrOrh¾szPacket.answerscCs2g}|}x$|r,| |j¡|jjddd}q
W|S)zEreturns a list of layer classes (including subclasses) in this packetrT)Ú	_subclass)r‰rcrGÚgetlayer)rZÚlayersZlyrrNrNrOroÅsz
Packet.layerscCsÄ|dkr|jpd}|rt}ndd„}|dksJ||j|ƒsJ||jj|jgkrNdSxd|jD]Z}| |j¡}|dkrpqV|js‚t	|dd}x,|D]$}t
|tƒrˆ|j||d}|rˆ|SqˆWqVW|j
j||dS)zr
        true if self has a layer that is an instance of cls.
        Superseded by "cls in self" syntax.
        NcSst||kƒS)N)Úbool)Úcls1Úcls2rNrNrOrµÚraz!Packet.haslayer.<locals>.<lambda>Tr)Ú_iterpacket)rm)Úmatch_subclassr!rcrVrbr@r®r:rCrrpr7ÚhaslayerrG)rZrMrmÚmatchr‹Ú
fvalue_genÚfvalueÚretrNrNrOruÏs(


zPacket.haslayercs„|dkrˆjpd}|rt}ndd„}t|tƒr<|d}d}n|}d}d}	t|tƒrld|krl| dd¡\}}	n
|d}}	|r˜|ˆj|ƒs˜|ˆjjˆjgkrÜt	‡fdd„t
 |¡DƒƒrÜ|dkrÔ|	dkrȈSˆ |	¡Sn|d8}xŠˆj
D]€}
ˆ |
j¡}|dkrqä|
jst|d	d
}xN|D]F}t|tƒrg}
|j|f||
|dœ|—Ž}|dk	rV|S|
d	}qWqäWˆjj|f|||dœ|—ŽS)zPReturn the nb^th layer that is an instance of cls, matching flt
values.
        NcSst||kƒS)N)rp)rqrrrNrNrOrµûraz!Packet.getlayer.<locals>.<lambda>rLrÈÚ.c3s |]\}}ˆ |¡|kVqdS)N)r®)rQZfldnameZfldvalue)rZrNrOrS
sz"Packet.getlayer.<locals>.<genexpr>r)rs)ÚnbÚ_trackrm)rtr!rprárœÚsplitrcrVrbrOrXrYr®r@r:rCrr7rnrG)rZrMr{r|rmÚfltrvZstring_class_nameÚ
class_namer–r‹rwrxÚtrackryrN)rZrOrnësN





zPacket.getlayercCs|}x|jdk	r|j}qW|S)N)rH)rZrùrNrNrOÚ
firstlayer's
zPacket.firstlayercCs¦t|tƒrP|j}|jr8|j|jfd|ji|jp0i—Ž}q^|j|jf|jpJiŽ}n|}| |¡}|dkr¢t|tƒrx|j}nt|tƒsŒt	|ƒ}n
t
t|ƒ}td|ƒ‚|S)Nr{zLayer [%s] not found)
rpÚsliceÚstartÚstoprnÚstepÚtyperVr›r¡r5rœÚ
IndexError)rZrMÚlnameryr:rNrNrOÚ__getitem__.s
"




zPacket.__getitem__cCs||j`dS)N)rHrG)rZrMrNrNrOÚ__delitem__CszPacket.__delitem__cCs|||j_dS)N)rHrG)rZrMr·rNrNrOÚ__setitem__GszPacket.__setitem__cCs
| |¡S)ze
        "cls in self" returns true if self has a layer which is an
        instance of cls.
        )ru)rZrMrNrNrOÚ__contains__KszPacket.__contains__cCs
|j ¡S)N)rGÚroute)rZrNrNrOrSszPacket.routecOs|jj||ŽS)N)rGÚfragment)rZÚargsrUrNrNrOrŽWszPacket.fragmentcOs|j||ŽdS)zDeprecated. Use show() method.N)Úshow)rZrrUrNrNrOÚdisplay[szPacket.displayr{rÈc	Cs|rddlm}|ƒ}ntj}d|| d¡| |j¡| d¡f}xˆ|jD]|}	t|	t	ƒrh|	 
|¡shqLt|	tƒs||	tjkrŠ|j
}
|j}n|j}
|j}| |	j¡}t|tƒsÈ|	jr8|	jr8t|tƒr8tddt|	jƒƒd}
|d|||
|	jƒ|
f7}t|dd	}xÀ|D]$}||j||||d
dd7}qWqLtddt|	jƒƒd}
d
|||
|	jƒ|
| d¡f}|	 ||¡}t|tƒr¶| dddt|ƒt|ƒt|	jƒd¡}|d|||ƒf7}qLW|jrþ||jj|||d||j|dd7}|r|st|ƒdS|SdS)a
        Internal method that shows or dumps a hierarchical view of a packet.
        Called by show.

        :param dump: determine if it prints or returns the string value
        :param int indent: the size of indentation for each layer
        :param str lvl: additional information about the layer lvl
        :param str label_lvl: additional information about the layer fields
        :param first_call: determine if the current function is the first
        :return: return a hierarchical view if dump, else print it
        r)ÚAnsiColorThemez%s%s %s %s 
z###[z]###rýrÿz%s  \%s%s\
)rsz   |F)ÚdumpÚindentÚ	label_lvlÚ
first_callz%s  %s%s%s rÉÚ
r|z%s%s
)r“r”Úlvlr•r–N) Zscapy.themesr’rrÍrÖr×r:rhrprrÎrrÑrÒrÓrÔrÕr®r7rCrˆrqÚmaxrÏrÚ
_show_or_dumprÐrœÚreplacerGÚshow_indentrU)rZr“r”r˜r•r–r’rÙrØr‹rÚrÛrxrMrwZbegnZreprvalrNrNrOrš`s^
&
&

zPacket._show_or_dumpcCs| ||||¡S)aÁ
        Prints or returns (when "dump" is true) a hierarchical view of the
        packet.

        :param dump: determine if it prints or returns the string value
        :param int indent: the size of indentation for each layer
        :param str lvl: additional information about the layer lvl
        :param str label_lvl: additional information about the layer fields
        :return: return a hierarchical view if dump, else print it
        )rš)rZr“r”r˜r•rNrNrOr¬szPacket.showcCs| t|ƒ¡ ||||¡S)a
        Prints or returns (when "dump" is true) a hierarchical view of an
        assembled version of the packet, so that automatic fields are
        calculated (checksums, etc.)

        :param dump: determine if it prints or returns the string value
        :param int indent: the size of indentation for each layer
        :param str lvl: additional information about the layer lvl
        :param str label_lvl: additional information about the layer fields
        :return: return a hierarchical view if dump, else print it
        )rcrr)rZr“r”r˜r•rNrNrOÚshow2ºs
zPacket.show2c	Cs`ddddœ}xÜd|krè| d¡}||dd… d¡}||d||d…}| d¡}|dkrltd	|ƒ‚|d|…||dd…}}d
}	|ddkrªd}	|dd…}| |¡rº|	}	|	sÂd
}|d|…||||dd…}qWd
}
xbd|krR| d¡}|
|d|…7}
||dd…}|rX|d|krX|
||d7}
|dd…}qòy¶| d¡}|d|…}| d¡}t|ƒdkr–d}
|d}nt|ƒdkr®|\}
}nt‚d|krÌ| d¡\}}n|jj}|}d}d|krü| d¡\}}t	|ƒ}||dd…}Wn<t
k
rJtd|dd…|dd…o>dfƒ‚YqòX|dkrˆt dt 
t|jƒ¡¡t	|jt	|jƒdƒ}n¸||jjkr*t||ƒr*|dkrÐ|j d|
||d|f|¡}d}
nX|
ddkrt||ƒ}|
dd…}
|
s(d}
n(t||ƒ}||jkr@|j| ||¡}n|j d||¡}d}
|
d|
|7}
qòW|
|7}
|
S)ag
        sprintf(format, [relax=1]) -> str

        Where format is a string that can include directives. A directive
        begins and ends by % and has the following format:
        ``%[fmt[r],][cls[:nb].]field%``

        :param fmt: is a classic printf directive, "r" can be appended for raw
          substitution:
          (ex: IP.flags=0x18 instead of SA), nb is the number of the layer
          (ex: for IP/IP packets, IP:2.src is the src of the upper IP layer).
          Special case : "%.time%" is the creation time.
          Ex::

            p.sprintf(
              "%.time% %-15s,IP.src% -> %-15s,IP.dst% %IP.chksum% "
              "%03xr,IP.proto% %r,TCP.flags%"
            )

          Moreover, the format string can include conditional statements. A
          conditional statement looks like : {layer:string} where layer is a
          layer name, and string is the string to insert in place of the
          condition if it is true, i.e. if layer is present. If layer is
          preceded by a "!", the result is inverted. Conditions can be
          imbricated. A valid statement can be::

            p.sprintf("This is a{TCP: TCP}{UDP: UDP}{ICMP:n ICMP} packet")
            p.sprintf("{IP:%IP.dst% {ICMP:%ICMP.type%}{TCP:%TCP.dport%}}")

          A side effect is that, to obtain "{" and "}" characters, you must use
          "%(" and "%)".
        ú%Ú{Ú})ržú(ú)rLNú:rz8Bad condition in format string: [%s] (read sprintf doc!)Fú!TrÈrzú,rØrzzBad format string [%%%s%s]éz...r8z%H:%M:%S.%%06ii@Bz%%%s,%s:%s.%s%%rrúz%%%s%%)ÚrindexÚindexÚfindr$rur}rÏrcrVrár4r8ÚstrftimeÚ	localtimer2r¿rGÚsprintfÚgetattrr=rÐ)rZÚfmtÚrelaxÚescaperRÚjZcondrNZformat_ÚresrØZsfclsfldZfclsfldr‹ZclsfldrMr–ÚnumZsnumr·rNrNrOr¬És#



(






,



zPacket.sprintfcCsdS)aODEV: can be overloaded to return a string that summarizes the layer.
           Only one mysummary() is used in a whole packet summary: the one of the upper layer,  # noqa: E501
           except if a mysummary() also returns (as a couple) a list of layers whose  # noqa: E501
           mysummary() must be called if they are present.rÈrN)rZrNrNrOÚ	mysummary?szPacket.mysummarycCsò|j ¡\}}}d}|r"|j|krD| ¡}t|tƒrD|\}}||7}|sL|rPd}|sf|jrb|jjnd}|jtj	krÆg}x<|j
D]2}|tj	kr~| d|j| 
|| |j¡¡f¡q~Wd|d |¡f}|rÜ|rÜd||f}nd||f}|||fS)NrÈrLz%s=%sz%s [%s]rÿz%s / %sz%s%s)rGÚ_do_summaryrcr´rprbÚshow_summaryrVrrÑrhr‰r:rÐr®rW)rZÚfoundrØÚneededryÚnZimpfr‹rNrNrOrµGs*

(zPacket._do_summarycCs| ¡dS)z&Prints a one line summary of a packet.rL)rµ)rZÚinternrNrNrOÚsummary`szPacket.summarycCs|j |¡S)z&Returns the uppest layer of the packet)rGÚ	lastlayer)rZÚlayerrNrNrOr¼eszPacket.lastlayercCsDt|jƒ}||d|d|_|}x|jdk	r2|j}q W|j |¡dS)z@Reassembles the payload and decode it using another packet classrL)rrrsN)rrGrHrg)rZrMrØÚpprNrNrOÚdecode_payload_asjs

zPacket.decode_payload_ascCsg}xÊt |j¡D]º\}}| |¡}t|tttfƒrBt|ƒdkrBqt|t	ƒrV| 
¡}nd|jr„|jr„t|tƒr„dd 
tt	j
|ƒ¡}n6t|tƒr˜t|ƒ}n"tt|ddƒƒr²| 
¡}nt|ƒ}| d||f¡qWd|jjd 
|¡f}|j 
¡}|r|d	|7}|S)
zn
        Returns a string representing the command you have to type to
        obtain the same packet
        rz[%s]r¥ÚcommandNz%s=%sz%s(%s)z, ú/)rXrYr<rkrprqr’r“rÏr7rÀrCrˆrWÚmaprráÚcallabler­r¡r‰rcrVrG)rZr‹ÚfnZfvr–rZpcrNrNrOrÀts(






zPacket.commandcKsft|tƒstd |¡ƒ‚|tkr,tt|ƒƒSd|krJ|j|fddi|—ŽStd t|ƒj|j¡ƒ‚dS)a¦Converts this Packet to another type.

        This is not guaranteed to be a lossless process.

        By default, this only implements conversion to ``Raw``.

        :param other_cls: Reference to a Packet class to convert to.
        :type other_cls: Type[scapy.packet.Packet]
        :return: Converted form of the packet.
        :rtype: other_cls
        :raises TypeError: When conversion is not possible
        z{} must implement PacketrrTzCannot convert {} to {}N)	r!r7r ÚformatÚRawrÚconvert_packetr†rV)rZZ	other_clsÚkwargsrNrNrOÚ
convert_tos
zPacket.convert_tocKsLt|tƒstdƒ‚d|kr0|j|fddi|—ŽStd t|ƒj|j¡ƒ‚dS)a<Converts another packet to be this type.

        This is not guaranteed to be a lossless process.

        :param pkt: The packet to convert.
        :type pkt: scapy.packet.Packet
        :return: Converted form of the packet.
        :rtype: cls
        :raises TypeError: When conversion is not possible
        zCan only convert PacketsrrTzCannot convert {} to {}N)rpr7r rÉrÅr†rV)rMr•rÈrNrNrOrǪs
zPacket.convert_packetcks"x|D]}|j|f|ŽVqWdS)zConverts many packets to this type.

        This is implemented as a generator.

        See ``Packet.convert_packet``.
        N)rÇ)rMZpktsrÈr•rNrNrOÚconvert_packetsÀs
zPacket.convert_packets)raNrN)r)rrL)NF)N)rLNN)Fr{rÈrÈT)Fr{rÈrÈ)Fr{rÈrÈ)rL)r)N)rVÚ
__module__Ú__qualname__Ú	__slots__r:rhrmr>rTrœr¶rtr‚rrŒrrŽÚclassmethodrPr]r`rwr0r3r#r2r.rárZ_PickleTyperyr~rrer„r…rrgr”rkr˜r¤r™r£rrnr®r°r±r¶r»r¼r½rÃrÇrÜrXÚPY2rÝrÞràÚ__truediv__rßÚ__rtruediv__rârãräÚ__bool__rårèr¦rêrírïrîrôrxròrõrür÷r?r@rArBrErIrfrFrPrQr¹rVr_rWrfrgrirjrkÚ__hash__rlrhrorurnrr‰rŠr‹rŒrrŽr‘ršrrr¬r´rµr»r¼r¿rÀrÉrÇrÊrNrNrNrOr7Os
7

*

$
	

0


0$




8
G


v


r7c@sDeZdZdd„Zdd„Zdd„Zdd„Zd	d
„Zdd„Zd
d„Z	dd„Z
dd„Zdd„Zdd„Z
dd„Zdd„ZeZdd„Zdd„Zdd „Zd!d"„ZdQd$d%„Zd&d'„Zd(d)„Zd*d+„Zd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„Zd6d7„ZdRd9d:„ZdSd<d=„Z d>d?„Z!dTdCdD„Z"dUdEdF„Z#dGdH„Z$dIdJ„Z%dVdKdL„Z&dMdN„Z'dOdP„Z(d8S)WrdcOs2|j d¡}|dkr.t |¡|_}t |¡|S)NÚ	__singl__)r¾rƒr7Ú__new__rÔrw)rMrrUZsinglrNrNrOrÕÑs

zNoPayload.__new__cOsdS)NrN)rZrrUrNrNrOrwÙszNoPayload.__init__cCsdS)NrN)rZr•rNrNrOrgÝszNoPayload.dissection_donecCstdƒ‚dS)Nz'Can't add payload to NoPayload instance)r$)rZrGrNrNrOr˜ászNoPayload.add_payloadcCsdS)NrN)rZrNrNrOr¤åszNoPayload.remove_payloadcCsdS)NrN)rZrHrNrNrOr™észNoPayload.add_underlayercCsdS)NrN)rZr¥rNrNrOr£íszNoPayload.remove_underlayercCs|S)NrN)rZrNrNrOrñszNoPayload.copycCsdS)NrN)rZrNrNrOrêõszNoPayload.clear_cachecCsdS)NrÈrN)rZrNrNrOrÜùszNoPayload.__repr__cCsdS)NrÈrN)rZrNrNrOrÝýszNoPayload.__str__cCsdS)NrarN)rZrNrNrOrÞszNoPayload.__bytes__cCsdS)NFrN)rZrNrNrOräszNoPayload.__nonzero__cCsdS)NrarN)rZrNrNrOrî
szNoPayload.do_buildcCsdS)NrarN)rZrNrNrOrxszNoPayload.buildcCsdS)NrarN)rZrNrNrOrôszNoPayload.build_paddingcCs|S)NrN)rZrìrNrNrOrõszNoPayload.build_donercCsdgfS)NrarN)rZrörNrNrOr÷szNoPayload.build_pscCst|ƒ‚dS)N)ro)rZr«rNrNrOr®szNoPayload.getfieldvalcCst|ƒ‚dS)N)ro)rZr«rNrNrOr°"szNoPayload.getfield_and_valcCst|ƒ‚dS)N)ro)rZr«r·rNrNrOr¶&szNoPayload.setfieldvalcCst|ƒ‚dS)N)ro)rZr«rNrNrOr¼*szNoPayload.delfieldvalcCsdS)NrN)rZrNrNrOrQ.szNoPayload.hide_defaultscCstgƒS)N)rñ)rZrNrNrOr_2szNoPayload.__iter__cCst|tƒrdSdS)NTF)rprd)rZr¥rNrNrOrj6s
zNoPayload.__eq__cCsdS)NrarN)rZrNrNrOrl<szNoPayload.hashretcCst|ttjfƒS)N)rprdrrK)rZr¥rNrNrOrh@szNoPayload.answersNcCsdS)NrrN)rZrMrmrNrNrOruDszNoPayload.haslayerrLcKs|dk	r| |¡dS)N)r‰)rZrMr{r|rmr~rNrNrOrnHs
zNoPayload.getlayercOstdƒ‚dS)Nzcannot fragment this packet)r$)rZrrUrNrNrOrŽTszNoPayload.fragmentFr{rÈcCsdS)NrN)rZr“r”r˜r•rNrNrOrXszNoPayload.showcCs|rdStd|ƒ‚dS)Nz??zFormat not found [%s])r$)rZr®r¯rNrNrOr¬\szNoPayload.sprintfcCs
ddgfS)NrrÈrN)rZrNrNrOrµcszNoPayload._do_summarycCsgS)NrN)rZrNrNrOrogszNoPayload.layerscCs|p|S)NrN)rZr½rNrNrOr¼kszNoPayload.lastlayercCsdS)NrÈrN)rZrNrNrOrÀoszNoPayload.commandcCsdS)N)NNNrN)rZrNrNrOrsszNoPayload.route)r)N)rLNN)Fr{rÈrÈ)rL)N))rVrËrÌrÕrwrgr˜r¤r™r£rrêrÜrÝrÞrärÒrîrxrôrõr÷r®r°r¶r¼rQr_rjrlrhrurnrŽrr¬rµror¼rÀrrNrNrNrOrdÐsP





rdcsJeZdZdZeddƒgZd‡fdd„	Zdd„Zdd„Ze	d	d
„ƒZ
‡ZS)rÆr—racs2|rt|tƒst|ƒ}tt|ƒj|f|ž|ŽdS)N)rpr›rÚsuperrÆrw)rZrErrÈ)rcrNrOrwszRaw.__init__cCsdS)NrLrN)rZr¥rNrNrOrh‡szRaw.answerscCs4tj}|r*t|ƒr d||jƒSd|jSt |¡S)NzRaw %szRaw %r)rZraw_summaryrÃr—r7r´)rZÚcsrNrNrOr´‹s
z
Raw.mysummarycKstt|ƒƒS)N)rÆr)rMr•rÈrNrNrOrÇ•szRaw.convert_packet)ra)rVrËrÌr:rrhrwrhr´rÎrÇÚ
__classcell__rNrN)rcrOrÆ}s
rÆc@s"eZdZdZddd„Zdd„ZdS)ÚPaddingNcCsdS)NrarN)rZZfield_pos_listrNrNrOrížszPadding.self_buildcCs$|jdkrt|jƒn|j|j ¡S)N)rCrr—rGrô)rZrNrNrOrô¢szPadding.build_padding)N)rVrËrÌr:rírôrNrNrNrOrÙ›s
rÙcKs6|dk	r| |¡|jdd…|_|j ||f¡dS)aBind 2 layers for dissection.
    The upper layer will be chosen for dissection on top of the lower layer, if
    ALL the passed arguments are validated. If multiple calls are made with
    the same layers, the last one will be used as default.

    ex:
        >>> bind_bottom_up(Ether, SNAP, type=0x1234)
        >>> Ether(b'\xff\xff\xff\xff\xff\xff\xd0P\x99V\xdd\xf9\x124\x00\x00\x00\x00\x00')  # noqa: E501
        <Ether  dst=ff:ff:ff:ff:ff:ff src=d0:50:99:56:dd:f9 type=0x1234 |<SNAP  OUI=0x0 code=0x0 |>>  # noqa: E501
    N)rÀrTr‰)r_r\Ú__fvalr[rNrNrOÚbind_bottom_up´s
rÛcKs,|dk	r| |¡|j ¡|_||j|<dS)aBind 2 layers for building.
    When the upper layer is added as a payload of the lower layer, all the
    arguments will be applied to them.

    ex:
        >>> bind_top_down(Ether, SNAP, type=0x1234)
        >>> Ether()/SNAP()
        <Ether  type=0x1234 |<SNAP  |>>
    N)rÀr^r)r_r\rÚr[rNrNrOÚ
bind_top_downÊs
rÜcKs2|dk	r| |¡t||f|Žt||f|ŽdS)aHBind 2 layers on some specific fields' values.

    It makes the packet being built and dissected when the arguments
    are present.

    This function calls both bind_bottom_up and bind_top_down, with
    all passed arguments.

    Please have a look at their docs:
     - help(bind_bottom_up)
     - help(bind_top_down)
     N)rÀrÜrÛ)r_r\rÚr[rNrNrOÚbind_layersßs
rÝcs:|dk	rˆ |¡‡‡fdd„‰‡fdd„|jDƒ|_dS)zrThis call un-links an association that was made using bind_bottom_up.
    Have a look at help(bind_bottom_up)
    Ncs(t‡fdd„t ˆ¡Dƒƒ}|ˆkp&|S)Nc3s&|]\}}|ˆkpˆ||kVqdS)NrN)rQrNr²)ÚparamsrNrOrSsz5split_bottom_up.<locals>.do_filter.<locals>.<genexpr>)ÚanyrXrY)rÞrMZparams_is_invalid)r[r\)rÞrOÚ	do_filtersz"split_bottom_up.<locals>.do_filtercsg|]}ˆ|Žr|‘qSrNrN)rQr³)ràrNrOr^
sz#split_bottom_up.<locals>.<listcomp>)rÀrT)r_r\rÚr[rN)ràr[r\rOÚsplit_bottom_upøs	
rács^|dk	r| |¡||jkrZ|j|‰t‡fdd„t |¡DƒƒrFdS|j ¡|_|j|=dS)zpThis call un-links an association that was made using bind_top_down.
    Have a look at help(bind_top_down)
    Nc3s&|]\}}|ˆkpˆ||kVqdS)NrN)rQrNr²)ÚofvalrNrOrSsz!split_top_down.<locals>.<genexpr>)rÀr^rßrXrYr)r_r\rÚr[rN)rârOÚsplit_top_down
s	


rãcKs2|dk	r| |¡t||f|Žt||f|ŽdS)zùSplit 2 layers previously bound.
    This call un-links calls bind_top_down and bind_bottom_up. It is the opposite of  # noqa: E501
    bind_layers.

    Please have a look at their docs:
     - help(split_bottom_up)
     - help(split_top_down)
    N)rÀrárã)r_r\rÚr[rNrNrOÚsplit_layers s
räcCsš|dkrvtjstdƒ‚yddl}Wntk
r@tdƒ‚YnXt|dƒsTtdƒ‚ddlm}m}ddl	m
}d	d
„}t|dƒrŠdd
„}|t d
tj
¡|t d¡ƒt d¡dft d¡dft d¡dfgd}||ƒ}|dkrütj ¡}dd„|Dƒ}	nT|dkrLddlm}
tttttf|
ddƒ}dd„|Dƒ}	dd„|	Dƒ}	ndStjrfdd„|	Dƒ}	|dkrttƒ}x´|	D]˜\}
}d|
kr|
 d¡}|}x8|dd…D](}||krÂi||<||}||d <q¬Wd!|krêg|d!<|d! |d|f¡n|d! |
|f¡q~Wn|dkr.d!|	i}|}g}xt| ¡ƒ}d"d„|Dƒ| d!g¡}d#}|r”d t d$d%„|d&d…Dƒ|d f¡¡}d'||r¦d|nd#}||t d
tj
¡|t d(|¡ƒ|rÚd)ndd*}||ƒ}|dkr|r| ¡}q:ndS|  d+¡r4| |¡||d&d…}n|rF|d|}Pq:W|dkr(dd,lm!}||ƒd-|}n²t"|t#j$ƒrŠ|j%}t"|tƒr|  d.¡r¨|}nr|  d-¡rÀ| &d-d#¡}dd,lm!}||ƒd/|d0|}}|tjj'krú|}n |tjj'kr|}ntd1|ƒ‚nt(d2ƒdSytjj'|}Wn"t)k
rZtd1|ƒ‚YnXt*tj+ ,d3|¡ƒg}d4d„|Dƒ}t*t-|d5gdd6ƒdS)7aCFunction used to discover the Scapy layers and protocols.
    It helps to see which packets exists in contrib or layer files.

    params:
     - layer: If specified, the function will explore the layer. If not,
              the GUI mode will be activated, to browse the available layers

    examples:
      >>> explore()  # Launches the GUI
      >>> explore("dns")  # Explore scapy.layers.dns
      >>> explore("http2")  # Explore scapy.contrib.http2
      >>> explore(scapy.layers.bluetooth4LE)

    Note: to search a packet by name, use ls("name") rather than explore.
    NzZexplore() GUI-mode cannot be run in interactive mode. Please provide a 'layer' parameter !rzgprompt_toolkit is not installed ! You may install IPython, which contains it, via `pip install ipython`)rzrz%prompt_toolkit >= 2.0.0 is required !)Úradiolist_dialogÚ
button_dialog)ÚHTMLcSs
tt|ƒS)N)r5rœ)r³rNrNrOrµZrazexplore.<locals>.<lambda>)r{rcSs| ¡S)N)Úrun)r³rNrNrOrµ\raz	Scapy v%szQ<style bg="white" fg="red">Chose the type of packets you want to explore:</style>ZLayersroZContribsZcontribsZCancelÚcancel)ÚtitlerZbuttonscSs4g|],}d|dks,d|dks,d|dkr|‘qS)rorÚpacketZasn1rN)rQr³rNrNrOr^qszexplore.<locals>.<listcomp>)Úlist_contribT)rycSsg|]}|d|df‘qS)r:ÚdescriptionrN)rQr³rNrNrOr^xscSsg|]}d|dkr|‘qS)ZcanrrN)rQr³rNrNrOr^{scSs$g|]\}}t |¡t |¡f‘qSrN)rXÚ	text_type)rQr³r´rNrNrOr^srzrrbZ_lcSs0g|](}| d¡sd|t d| ¡¡f‘qS)r6ú$z[+] )Ú
startswithrXrîÚ
capitalize)rQr:rNrNrOr^¢srÈcss|]}|dVqdS)rbNrN)rQr³rNrNrOrS©szexplore.<locals>.<genexpr>rLz0
<style bg="white" fg="green">> scapy.%s</style>zn<style bg="white" fg="red">Please select a fileamong the following, to see all layers contained in it:</style>ÚBack)ÚvaluesrêrZcancel_textrï)Úload_contribzscapy.contrib.z
scapy.layers.zscapy.layers.%szscapy.contrib.%szUnknown scapy module '%s'z%Wrong usage ! Check out help(explore)zPackets contained in %s:cSs g|]}|jpd|jpdf‘qS)rÈ)rVrb)rQZlayrNrNrOr^ös)ZClassÚName)Zborders).rÚinteractiver$Úprompt_toolkitr1rZ prompt_toolkit.shortcuts.dialogsråræZprompt_toolkit.formatted_textrçrXrîr­roZ
scapy.mainrìr5r,r*rœrÏrrqr}r‰ÚkeysrƒrWrÅrÆrirðrôrpÚtypesÚ
ModuleTyperVr›Zldictr&rjrUrÍr×r")r½r÷rårærçZcall_ptkZbtn_diagÚactionZlvaluesrórìZcvaluesÚtreer:ÚdescÚpartsZsubtreeÚpareÚpreviousÚfoldersZ
_radio_valuesZcur_pathZ
extra_textZrd_diagÚresultrôZresult_layerZresult_contribÚ
all_layersZrtlstrNrNrOÚexplore5sî















rFc
Cs0t|tƒ}t|tƒs|st‚g}x|jD]ü}|}g}g}x8t|ttfƒrtt|tƒrl| |jj	dd…¡|j
}q>W|j}|j}	|rÎt|t
ƒrÎt|dƒrÎt|jp¤gƒdkrÌ| dd„tt |j¡ƒDƒ¡nöt|tƒr\| tt|rê|n|ƒƒ¡}
| d|
¡|rÄ|j | tt|r |n|ƒƒ¡i¡}t|ƒdkrÄ| dd„tt |¡ƒDƒ¡nh|r†t|tƒr†|j}| d	 |¡¡n>t|tƒrÄ|jj}	| d	 d
d„t  |j!|jfg¡Dƒ¡¡|j}
|rÞdd	 |¡nd}t|t"ƒr|d
|j#|j#dkrdndf7}| ||
|t$|	ƒ|f¡q*W|S)zÓInternal function used to resolve `fields_desc` to display it.

    :param obj: a packet object or class
    :returns: a list containing tuples [(name, clsname, clsname_extras,
        default, long_attrs)]
    Nr|Úi2sé2css|]\}}d||fVqdS)z%s: %dNrN)rQÚnumvalÚstrvalrNrNrOrS	sz_pkt_ls.<locals>.<genexpr>z
Depends on %scss|]\}}d||fVqdS)z%s: %dNrN)rQrrrNrNrOrS'	sz, css|]}|djjVqdS)rN)rcrV)rQr³rNrNrOrS1	sz(%s)rÈz (%d bit%s)rLrØ)%rpr7r!r¯rhrrr‰rcrVr–r:r‡r	r¿rÏrÚextendrÄrXrYrZ
depends_onr5Z	i2s_multirƒrÚnamesrWr
ÚdfltrÅrÆZfldsrrr¡)ÚobjÚverboseÚis_pktr<r‹Zcur_fldrÂÚ
long_attrsr:r‡Z
fld_dependZcur_i2sr
rMZclass_name_extrasrNrNrOÚ_pkt_lsúsl




rcsÆtˆtƒ}ˆdks|rÎd}ˆdkr:d}ttjdd„d}n^t ttˆƒ|rNdntj¡‰|rh‡fdd„}nˆ 	¡‰‡fd	d„}t‡fd
d„tjDƒ|d}x |D]}t
d|j|jfƒqžW|rÌtj
rÌt
d
ƒnôyÔtˆ|d}tˆtƒ}	x„|D]|\}
}}}
}|jd|}t
d|
|fdd|	r:t
dtˆ|
ƒfddt
d|
fƒx|D]}t
dd|fƒqNWqìW|	r ttˆƒ‰tˆjtƒrŽdSt
dƒtˆjƒWntk
rÀt
dƒYnXdS)zËList  available layers, or infos on a given layer class or name.

    :param obj: Packet / packet name to use
    :param case_sensitive: if obj is a string, is it case sensitive?
    :param verbose:
    NFTcSs|jS)N)rV)r³rNrNrOrµZ	razls.<locals>.<lambda>)r`rcs|j ˆ¡t|jƒfS)N)rVr¨rÏ)r³)rrNrOrµb	racs|j ¡ ˆ¡t|jƒfS)N)rVr_r¨rÏ)r³)rrNrOrµe	sc3sB|]:}t|jtƒrˆ |j¡s6t|jtƒrˆ |j¡r|VqdS)N)rprVrœÚsearchr:)rQr½)ÚpatternrNrOrSg	s
zls.<locals>.<genexpr>z
%-10s : %szL
TIP: You may use explore() to navigate through all layers using a clear GUI)r
rÿz%-10s : %-35s =)Úendz%-15rz(%r)z%-15s%srÈz--z?Not a packet class or name. Type 'ls()' to list packet classes.)rprœrÄrroÚreÚcompiler5ÚIr_rUrVrbrörr7r­rGrdÚlsr¯)rZcase_sensitiver
Ú	is_stringZtiprZsorterr½r<rrurMZclsnerrZclsinfor«rN)rrrOrH	sP






rTcCs–t|tƒstdƒ‚d}g}g}dd„}d}x¢|jD]˜}t|jdƒ}	||	7}|d7}|j ¡ dd¡}
xbt	d|d	ƒ}||	|ƒ}| 
|
d
|…||f¡|d	krÄ| 
|¡|}}	d}
g}|sÆPqhPqhWq2W|rÜ| 
|¡g}
|
 
d¡x¾tt|ƒdƒD]ª}d}||||d}}|d
d|ddkrœt
dd„|d
d
…Dƒƒ}|dd}||krœ||d}|d
d|…d|||d|d
…}|
 
|¡qüWd}|dd dd„tdƒDƒ¡d7}|dd dd„td	ƒDƒ¡d7}xRt||
ƒD]D\}}||7}x(|D] \}}	}|d| |	d¡7}qW|d7}qW|d|pVd	d7}|r€|dd|j dd¡7}|rŠ|St|ƒd
S)a
    Generate an RFC-like representation of a packet def.

    :param cls: the Packet class
    :param ret: return the result instead of printing (def. False)
    :param legend: show text under the diagram (default True)

    Ex::

        >>> rfc(Ether)

    zPacket class expectedrcSsd|dS)NrzrLrN)r³rNrNrOrµ£	razrfc.<locals>.<lambda>érLr6rÿé NrÈzB+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
rrzcss|]}|dVqdS)rLNrN)rQr³rNrNrOrSÍ	szrfc.<locals>.<genexpr>z                   css|]}t|ƒVqdS)N)rœ)rQr³rNrNrOrSà	sr|r—css|]}t|dƒVqdS)rýN)rœ)rQr³rNrNrOrSä	srËz|
z+-z+
zFig. éB)Ú
issubclassr7r rhráÚszr:r\r›r™r‰ÚrangerÏÚsumrWÚzipÚcenterrVrU)rMryZlegendÚcur_lenÚcur_lineÚlinesZclsizeÚidentr‹ZflenruZoverZlen1ÚsepsrRÚsepZaboveZbelowZ	pos_aboveZ	pos_belowrÚliner[r6rNrNrOÚrfc	sp





""r)c
Cs2|s| ¡}|}xt|tƒs,i}g}xŒ|jD]‚}t|tƒrbxrt||jƒD]}t|ddqLWq0t|tƒrz| 	|j¡q0|j
dk	r0t|tƒr˜| |¡r0| 
¡}|dk	r0|||j<q0W|rdd„t |¡Dƒ}|j |¡x:|D]2}tt| |¡ƒ}	|	 |¡ 
¡}|dk	râ|||<qâW|j |¡|j}qW|S)z±
    Transform a layer into a fuzzy layer by replacing some default values
    by random objects.

    :param p: the Packet instance to fuzz
    :return: the fuzzed packet.
    rL)Ú_inplaceNcSs(i|] \}}t|tƒr| ¡n||“qSrN)rprrX)rQr`r·rNrNrOré
szfuzz.<locals>.<dictcomp>)rrprdrhrr­r:Úfuzzr
r‰r‡rrÎZrandvalrXrYr;rÀr5rkZ
_find_fld_pktrG)
rìr*rùZnew_default_fieldsZmultiple_type_fieldsr‹rúZrndr:r–rNrNrOr+û	s:




r+)N)N)N)N)N)N)N)F)NFF)FT)r)bÚ__doc__Ú
__future__rrÚcollectionsrrr8rÅrrùr¨Zscapy.fieldsrrrrr	r
rrr
rrrZscapy.configrrZscapy.compatrrrZscapy.base_classesrrrrrZscapy.interfacesrZscapy.volatilerrZscapy.utilsrrr r!r"r#Zscapy.errorr$r%r&Zscapy.extlibr'Zscapy.modules.sixÚmodulesrXr(r)r*r+r,r-r.r/r0r1r2r3r4r5rr1rœr6Úwith_metaclassr7rdrÆrÙrŸrKZ
default_l2rÛrÜÚcommandsÚregisterrÝrárãrärrrr)r+rNrNrNrOÚ<module>sˆ8 @ 

.	



F
MBm