a
    kÄ#díc ã                   @   sÊ  d Z ddlmZ ddlmZ ddlmZ ddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZmZmZmZmZmZmZmZmZmZmZ ddlmZmZ ddlmZmZmZ dd	l m!Z!m"Z"m#Z#m$Z$m%Z% dd
l&m'Z' ddl(m)Z)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3m4Z4m5Z5 ddl6m7Z7 ddl8m9  m:Z: ddlm;Z;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZBmCZCmDZDmEZEmFZFmGZGmHZH zddlIZIW n eJ�yž   Y n0 eEde=eKe;f eAe=eKe;f  ƒZLG dd„ de: Me$e!e%¡ƒZNG dd„ deNƒZOG dd„ deNƒZPG dd„ dePƒZQePe_ReQe_SejTdu �r(ePe_Td1dd„ZUd2dd„ZVejWjXd3dd„ƒZYd4dd „ZZd5d!d"„Z[ejWjXd6d#d$„ƒZ\ejWjXd7d%d&„ƒZ]d8d(d)„Z^ejWjXd9d*d+„ƒZ_ejWjXd:d-d.„ƒZ`ejWjXd;d/d0„ƒZadS )<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¨  e Zd Zg d¢ZdZg Zi Zi Zg ZdZ	dZ
dZi Zi Zi Zi Zi Zedd„ ƒZedd	„ ƒZed
d„ ƒZdÃdd„Zeeeef eeeedf  ee ee ee ee f Zdd„ Zdd„ Z dd„ Z!dd„ Z"dd„ Z#dd„ Z$dd„ Z%dd„ Z&d d!„ Z'd"d#„ Z(d$d%„ Z)d&d'„ Z*d(d)„ Z+d*d+„ Z,d,d-„ Z-d.d/„ Z.d0d1„ Z/d2d3„ Z0d4d5„ Z1d6d7„ Z2d8d9„ Z3d:d;„ Z4d<d=„ Z5d>d?„ Z6d@dA„ Z7dBdC„ Z8dDdE„ Z9dFdG„ Z:e;j<�rždHdI„ Z=ndJdI„ Z=dKdL„ Z>dMdN„ Z?e?Z@dOdP„ ZAeAZBdQdR„ ZCdSdT„ ZDdUdV„ ZEeEZFdWdX„ ZGdYdZ„ ZHd[d\„ ZId]d^„ ZJd_d`„ ZKdadb„ ZLdcdd„ ZMdedf„ ZNdgdh„ ZOdidj„ ZPdkdl„ ZQdmdn„ ZRdÄdodp„ZSdÅdqdr„ZTdsdt„ ZUdudv„ ZVdwdx„ ZWdydz„ ZXd{d|„ ZYd}d~„ ZZdd€„ Z[d�d‚„ Z\dƒd„„ Z]dÆd…d†„Z^d‡dˆ„ Z_d‰dŠ„ Z`d‹dŒ„ Zad�dŽ„ Zbd�d�„ Zcd‘d’„ ZddZed“d”„ Zfd•d–„ Zgd—d˜„ ZhdÇd™dš„ZidÈd›dœ„Zjd�dž„ ZkdŸd „ Zld¡d¢„ Zmd£d¤„ Znd¥d¦„ Zod§d¨„ Zpd©dª„ Zqd«d¬„ ZrdÉd¯d°„ZsdÊd±d²„ZtdËd³d´„ZudÌdµd¶„Zvd·d¸„ Zwd¹dº„ ZxdÍd»d¼„ZydÎd½d¾„Zzd¿dÀ„ Z{dÁdÂ„ Z|dS )ÏÚ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Ú
underlayerÚparentr:   Z	_answeredÚ	directionÚ
sniffed_onÚwirelenÚcommentNé   TFc                 C   s
   | t ƒ ƒS ©N)r   )Úcls© rQ   úC/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/packet.pyÚfrom_hexcapq   s    zPacket.from_hexcapc              
   C   s<   | j D ]0\}}td|jd dd„ t |¡D ƒ¡f ƒ qd S )Nú	%-20s  %sú, c                 s   s   | ]}d d|  V  qdS ©z%-12sz%s=%rNrQ   ©Ú.0ÚirQ   rQ   rR   Ú	<genexpr>z   ó    z%Packet.upper_bonds.<locals>.<genexpr>)Úpayload_guessÚprintÚ__name__ÚjoinÚsixÚ	iteritems)ÚselfÚfvalÚupperrQ   rQ   rR   Úupper_bondsv   s    zPacket.upper_bondsc              
   C   sB   t  | j¡D ]0\}}td|jd dd„ t  |¡D ƒ¡f ƒ qd S )NrT   rU   c                 s   s   | ]}d d|  V  qdS rV   rQ   rW   rQ   rQ   rR   rZ   €   r[   z%Packet.lower_bonds.<locals>.<genexpr>)r`   ra   Ú_overload_fieldsr]   r^   r_   )rb   Úlowerrc   rQ   rQ   rR   Úlower_bonds|   s    zPacket.lower_bondsr[   r   c           
   	   K   sº  t   ¡ | _ d | _| jd u r"| jjn| j| _i | _| j| _i | _	i | _
i | _g | _tƒ | _|  ¡  || _|| _t|tƒr~t|ƒ}|| _d| _d | _d | _d | _d | _d | _d | _|rÊ|  |¡ |sÊ|  | ¡ | jD ]X}|j}z|  |¡}	W n t!yþ   Y qÐY n0 t|	t"ƒ�r|	n|  #|¡ $| |	¡| j
|< qÐ|D ]X}|| j%v �r||| }	|  &|¡}t|	t"ƒ�r`|	n|  #|¡ $| |	¡| j
|< �q.t'|ƒ‚�q.t|t(ƒ�rœ|| _)n|d u �r®g | _)n|g| _)d S ©Nr   )*r8   r9   Ú_nameÚ	__class__r^   r:   r;   rf   r>   r?   r<   r=   r@   Ú	NoPayloadrG   Úinit_fieldsrH   rI   Ú
isinstanceÚ	bytearrayÚbytesrA   rB   rC   rD   rL   rJ   rK   rM   ÚdissectÚdissection_doneÚfields_descÚpopÚKeyErrorr   Ú	get_fieldÚany2iÚdeprecated_fieldsÚ_resolve_aliasÚAttributeErrorÚlistrF   )
rb   rE   Zpost_transformÚ	_internalÚ_underlayerÚ_parentr<   ÚfieldÚfnameÚvaluerQ   rQ   rR   Ú__init__‚   sj    	
ÿ
þ




ÿ

ÿ
zPacket.__init__c                 C   s*   | j |  ¡ f| j| j| j| j| j| jffS )zUsed by pickling methods)rk   Úbuildr8   r9   rJ   rK   rL   rM   ©rb   rQ   rQ   rR   Ú
__reduce__Í   s    úzPacket.__reduce__c                 C   s@   |d | _ |d | _|d | _|d | _|d | _|d | _| S )z$Rebuild state using pickable methodsr   rN   é   é   é   é   )r8   r9   rJ   rK   rL   rM   )rb   ÚstaterQ   rQ   rR   Ú__setstate__Ù   s    





zPacket.__setstate__c                 C   s   |   ¡ S )zUsed by copy.deepcopy)Úcopy)rb   ÚmemorQ   rQ   rR   Ú__deepcopy__ä   s    zPacket.__deepcopy__c                 C   s*   | j  | jd¡r|  | j¡ n|  ¡  dS )ú@
        Initialize each fields of the fields_desc dict
        FN)Úclass_dont_cacheÚgetrk   Údo_init_fieldsrs   Údo_init_cached_fieldsr„   rQ   rQ   rR   rm   ë   s    zPacket.init_fieldsc                 C   sH   i }|D ]4}t  |j¡||j< || j|j< |jr| j |¡ q|| _dS )r�   N)	rŒ   ÚdeepcopyÚdefaultr:   r=   Úholds_packetsr@   Úappendr;   )rb   Úflistr;   ÚfrQ   rQ   rR   r’   ö   s    zPacket.do_init_fieldsc              	   C   sª   | j }tj |d¡du r$|  | j¡ tj |d¡}|r¦|| _tj| | _tj	| | _
tj| D ]F}| j| }z| ¡ | j|< W q^ ty¢   |dd… | j|< Y q^0 q^dS )zn
        Initialize each fields of the fields_desc dict, or use the cached
        fields information
        N)rk   r7   Úclass_default_fieldsr‘   Úprepare_cached_fieldsrs   r;   Úclass_fieldtyper=   Úclass_packetfieldsr@   Úclass_default_fields_refrŒ   r<   rz   )rb   Úcls_namer;   r€   r�   rQ   rQ   rR   r“     s    
zPacket.do_init_cached_fieldsc           	      C   sÔ   | j }|sdS tƒ }tƒ }tƒ }tƒ }|D ]|}t|tƒrTd| j|< |  | j¡  dS t 	|j
¡}|||j< |||j< |jr„| |¡ t|j
tttttfƒr*| |j¡ q*|tj|< |tj|< |tj|< |tj|< dS )zC
        Prepare the cached fields of the fields_desc dict
        NT)rk   Údictr{   rn   r   r�   r’   rs   rŒ   r”   r•   r:   r–   r—   Úsetr   r7   rž   rœ   r�   rš   )	rb   r˜   rŸ   rš   rž   rœ   r�   r™   Ztmp_copyrQ   rQ   rR   r›   #  s.    







zPacket.prepare_cached_fieldsc                 C   s   |   |¡ | j |¡ dS )z3DEV: will be called after a dissection is completedN)Úpost_dissectionrG   rr   ©rb   ÚpktrQ   rQ   rR   rr   M  s    
zPacket.dissection_donec                 C   s   dS )z7DEV: is called after the dissection of the whole packetNrQ   r£   rQ   rQ   rR   r¢   S  s    zPacket.post_dissectionc                 C   s
   | j | S )z:DEV: returns the field instance from the name of the field)r=   )rb   ÚfldrQ   rQ   rR   rv   X  s    zPacket.get_fieldc                 C   s¢   |d u rd S t | jtƒs&| j |¡ nxt |tƒrh|| _| | ¡ | jD ]}||jv rF|j| | _ qžqFn6t |t	t
ttfƒrŽtjt|ƒd�| _ntdt|ƒ ƒ‚d S )N©ÚloadzPpayload must be 'Packet', 'bytes', 'str', 'bytearray', or 'memoryview', not [%s])rn   rG   rl   Úadd_payloadr7   Úadd_underlayerÚ
aliastypesr>   r?   rp   Ústrro   Ú
memoryviewr   Ú	raw_layerr   Ú	TypeErrorÚrepr)rb   rG   ÚtrQ   rQ   rR   r¨   ]  s    



zPacket.add_payloadc                 C   s   | j  | ¡ tƒ | _ i | _d S rO   )rG   Úremove_underlayerrl   r?   r„   rQ   rQ   rR   Úremove_payloadp  s    zPacket.remove_payloadc                 C   s
   || _ d S rO   ©rH   ©rb   rH   rQ   rQ   rR   r©   v  s    zPacket.add_underlayerc                 C   s
   d | _ d S rO   r³   ©rb   ÚotherrQ   rQ   rR   r±   z  s    zPacket.remove_underlayerc                 C   s
   || _ dS )zƒSet packet parent.
        When packet is an element in PacketListField, parent field would
        point to the list owner packet.N©rI   ©rb   rI   rQ   rQ   rR   Ú
add_parent~  s    zPacket.add_parentc                 C   s
   d| _ dS )z†Remove packet parent.
        When packet is an element in PacketListField, parent field would
        point to the list owner packet.Nr·   rµ   rQ   rQ   rR   Úremove_parent…  s    zPacket.remove_parentc                 C   s¢   |   ¡ }|  | j¡|_|  | j¡|_| j ¡ |_| j|_| j|_| j|_| j	|_	|  | j
¡|_
| j|_| jdd… |_| j ¡ |_|j |¡ | j|_| j|_|S )z$Returns a deep copy of the instance.N)rk   Úcopy_fields_dictr<   r;   r?   rŒ   rH   rI   rB   rC   rD   rL   rF   rG   r©   r8   rM   )rb   ÚclonerQ   rQ   rR   rŒ   Œ  s$    ÿzPacket.copyc                 C   s(   | j | \}}t d|||f t¡ |S )Nz0%s has been deprecated in favor of %s since %s !)rx   ÚwarningsÚwarnÚDeprecationWarning)rb   ÚattrÚnew_attrÚversionrQ   rQ   rR   ry   ¢  s    ÿýzPacket._resolve_aliasc                 C   sb   | j r|| j v r|  |¡}|| jv r.| j| S || jv rB| j| S || jv rV| j| S | j |¡S rO   )rx   ry   r<   r?   r;   rG   Úgetfieldval©rb   rÀ   rQ   rQ   rR   rÃ   ¬  s    






zPacket.getfieldvalc                 C   s|   | j r|| j v r|  |¡}|| jv r8|  |¡| j| fS || jv rV|  |¡| j| fS || jv rt|  |¡| j| fS t‚d S rO   )rx   ry   r<   rv   r?   r;   Ú
ValueErrorrÄ   rQ   rQ   rR   Úgetfield_and_val¸  s    



zPacket.getfield_and_valc                 C   sX   z|   |¡\}}W n ty0   | j |¡ Y S 0 |d urTt|tƒrH|S | | |¡S |S rO   )rÆ   rÅ   rG   Ú__getattr__rn   r   Úi2h)rb   rÀ   r¥   ÚvrQ   rQ   rR   rÇ   Ä  s    zPacket.__getattr__c                 C   s¬   | j r|| j v r|  |¡}|| jv r~|  |¡}|d u r@dd„ }n|j}t|tƒrT|n|| |ƒ| j|< d| _d | _	d | _
d | _n*|dkrš|  ¡  |  |¡ n| j ||¡ d S )Nc                 S   s   |S rO   rQ   )ÚxÚyrQ   rQ   rR   Ú<lambda>Õ  r[   z$Packet.setfieldval.<locals>.<lambda>r   rG   )rx   ry   r;   rv   rw   rn   r   r<   rB   rC   rD   rL   r²   r¨   rG   Úsetfieldval)rb   rÀ   Úvalr¥   rw   rQ   rQ   rR   rÍ   Î  s$    



ÿzPacket.setfieldvalc                 C   sH   || j v rt | ||¡S z|  ||¡W S  ty8   Y n0 t | ||¡S rO   )Ú__all_slots__ÚobjectÚ__setattr__rÍ   rz   ©rb   rÀ   rÎ   rQ   rQ   rR   rÑ   ä  s    
zPacket.__setattr__c                 C   sZ   || j v r,| j |= d| _d | _d | _d | _n*|| jv r8n|dkrJ|  ¡  n| j |¡ d S )Nr   rG   )	r<   rB   rC   rD   rL   r;   r²   rG   ÚdelfieldvalrÄ   rQ   rQ   rR   rÓ   î  s    


zPacket.delfieldvalc                 C   sR   |dkr|   ¡ S || jv r&t | |¡S z|  |¡W S  tyD   Y n0 t | |¡S ©NrG   )r²   rÏ   rÐ   Ú__delattr__rÓ   rz   rÄ   rQ   rQ   rR   rÕ   ý  s    
zPacket.__delattr__c                 C   sH   t ƒ }| j}t|dƒr"| |j¡ |jD ]}t|dƒr(| |j¡ q(|S )zV
        Return a list of slots and methods, including those from subclasses.
        rÏ   Ú__dict__)r¡   rk   ÚhasattrÚupdaterÏ   Ú__mro__rÖ   )rb   ÚattrsrP   ZbclsrQ   rQ   rR   Ú	_superdir	  s    


zPacket._superdirc                 C   s   t t |  ¡ | j¡ƒS )z4
        Add fields to tab completion list.
        )ÚsortedÚ	itertoolsÚchainrÛ   r;   r„   rQ   rQ   rR   Ú__dir__  s    zPacket.__dir__c           	   	   C   s<  d}t j}| jD ]ô}t|tƒr*| | ¡s*q|j| jv rn| j|j }t|tt	t
fƒr`t|ƒdkr`q| | |¡}nF|j| jv r| j|j }t|tt	t
fƒr¤t|ƒdkr¤q| | |¡}nqt|tƒsÈ|t jv rÖ|j}|j}n|j}|j}|d||jƒ| d¡||ƒf 7 }qd| d¡| | jj¡|| d¡t| jƒ| d¡f S )	NÚ r   z %s%s%sú=z%s%s %s %s%s%sú<ú|ú>)r   Úcolor_themers   rn   r   Ú	_evalcondr:   r<   r{   r    r¡   ÚlenÚi2reprr?   r   ÚemphÚemph_field_nameÚemph_field_valueÚ
field_nameÚfield_valueÚpunctÚ
layer_namerk   r^   r¯   rG   )	rb   ÚsÚctr™   rc   rÎ   ZfoverÚncolÚvcolrQ   rQ   rR   Ú__repr__  s@    
þ

ûzPacket.__repr__c                 C   s   |   ¡ S rO   ©rƒ   r„   rQ   rQ   rR   Ú__str__C  s    zPacket.__str__c                 C   s   |   ¡ S rO   )Úsummaryr„   rQ   rQ   rR   rö   G  s    c                 C   s   |   ¡ S rO   rõ   r„   rQ   rQ   rR   Ú	__bytes__K  s    zPacket.__bytes__c                 C   s\   t |tƒr(|  ¡ }| ¡ }| |¡ |S t |ttttfƒrN| tj	t
|ƒd� S | | ¡S d S ©Nr¦   )rn   r7   rŒ   r¨   rp   r«   ro   r¬   r   r­   r   Ú__rdiv__)rb   r¶   ZcloneAZcloneBrQ   rQ   rR   Ú__div__O  s    

zPacket.__div__c                 C   s.   t |ttttfƒr&tjt|ƒd�|  S t‚d S rù   )	rn   rp   r«   ro   r¬   r   r­   r   r®   rµ   rQ   rQ   rR   rú   \  s    zPacket.__rdiv__c                 C   s   t |tƒr| g| S t‚d S rO   )rn   Úintr®   rµ   rQ   rQ   rR   Ú__mul__d  s    

zPacket.__mul__c                 C   s
   |   |¡S rO   )rý   rµ   rQ   rQ   rR   Ú__rmul__k  s    zPacket.__rmul__c                 C   s   dS )NTrQ   r„   rQ   rQ   rR   Ú__nonzero__o  s    zPacket.__nonzero__c                 C   s   t |  ¡ ƒS rO   )rç   rø   r„   rQ   rQ   rR   Ú__len__t  s    zPacket.__len__c                 C   s   |   |¡ |¡S rO   )rv   Údo_copy)rb   Ú	fieldnamer�   rQ   rQ   rR   Úcopy_field_valuex  s    zPacket.copy_field_valuec                    s$   |d u rd S ‡ fdd„t  |¡D ƒS )Nc                    s   i | ]\}}|ˆ   ||¡“qS rQ   )r  )rX   r€   rc   r„   rQ   rR   Ú
<dictcomp>€  s   ÿz+Packet.copy_fields_dict.<locals>.<dictcomp>)r`   ra   )rb   r<   rQ   r„   rR   r»   |  s
    
ÿzPacket.copy_fields_dictc                 C   sj   d| _ t | j¡D ]H\}}|  |¡}|jrt|tƒr>| ¡  qt|t	ƒr|D ]}| ¡  qLq| j
 ¡  dS )z>Clear the raw packet cache for the field and all its subfieldsN)rC   r`   ra   r<   rv   r–   rn   r7   Úclear_cacher{   rG   )rb   r¥   rc   ZfsubvalrQ   rQ   rR   r  ƒ  s    



zPacket.clear_cachec                 C   s  | j durTt | j¡D ],\}}|  |¡|krd| _ d| _d| _ qDq| j durT| j S d}| jD ]¨}|  |j¡}t|t	ƒr†|t
|ƒ7 }q^z| | ||¡}W q^ t�y } zRz*d|j |jd  f|jdd…  |_W n ttfyê   Y n0 |‚W Y d}~q^d}~0 0 q^|S )ze
        Create the default layer regarding fields_desc dict

        :param field_pos_list:
        Nr[   zWhile dissecting field '%s': r   rN   )rC   r`   ra   rD   rÃ   rL   rs   r:   rn   r   rp   ÚaddfieldÚ	ExceptionÚargsrz   Ú
IndexError)rb   r€   rc   Úpr™   rÎ   ÚexrQ   rQ   rR   Ú
self_build‘  s8    



ÿÿý
zPacket.self_buildc                 C   s
   | j  ¡ S )zm
        Create the default version of the payload layer

        :return: a string of payload layer
        )rG   Údo_buildr„   rQ   rQ   rR   Údo_build_payload´  s    zPacket.do_build_payloadc                 C   sX   | j stt| ƒƒ} |  ¡ }| jD ]}||ƒ}q |  ¡ }| jdu rL|  ||¡S || S dS )zs
        Create the default version of the layer

        :return: a string of the packet with the payload
        N)rB   ÚnextÚiterr  rF   r  rC   Ú
post_build)rb   r¤   r°   ÚpayrQ   rQ   rR   r  ½  s    


zPacket.do_buildc                 C   s
   | j  ¡ S rO   )rG   Úbuild_paddingr„   rQ   rQ   rR   r  Ï  s    zPacket.build_paddingc                 C   s"   |   ¡ }||  ¡ 7 }|  |¡}|S )zb
        Create the current layer

        :return: string of the packet with the payload
        )r  r  Ú
build_done©rb   r
  rQ   rQ   rR   rƒ   Ó  s    
zPacket.buildc                 C   s   || S )a  
        DEV: called right after the current layer is build.

        :param str pkt: the current packet (build by self_build function)
        :param str pay: the packet payload (build by do_build_payload function)
        :return: a string of the packet with the payload
        rQ   )rb   r¤   r  rQ   rQ   rR   r  ß  s    	zPacket.post_buildc                 C   s   | j  |¡S rO   )rG   r  r  rQ   rQ   rR   r  ê  s    zPacket.build_donec              
   C   s¸   d}g }d}| j D ]t}t|tƒr,| | ¡s,q| | ||  |j¡¡}t|tƒrb|t|ƒd … }|}nd}| 	|| 
| |  |j¡¡|f¡ q| jjdd�\}}||7 }| 	| |f¡ ||fS )Nr[   rN   )Úinternal)rs   rn   r   ræ   r  rÃ   r:   rp   rç   r—   rè   rG   Úbuild_ps)rb   r
  ÚplÚqr™   Úrr¤   ÚlstrQ   rQ   rR   Údo_build_psî  s     

"zPacket.do_build_psc                 C   s   |   ¡ \}}||fS rO   )r  )rb   r  r
  r  rQ   rQ   rR   r    s    zPacket.build_psc           &   	      sª  t dkrtdƒ‚tj ¡ }|r6|  t| ƒ¡ ¡ \}}n|  ¡ \}}t|ƒ}|D ]\}}|t|ƒ7 }qNt|ƒ}|‰d}	d‰ d}
d}d‰d‰t	dd	d
tj
jd�}t	ddd	tj
jd�}dd„ ‰‡ ‡‡‡‡fdd„‰dd„ }dd„ ‰d+‡‡fdd„	}d\}}|�r¦t|ƒ}| ¡ \}}|
d7 }
tj |	||
 ˆ dtt|jƒƒ tjjjg¡}|
d7 }
| ¡ }| tjjd ¡ | | ¡ tj
jjtj |g¡g¡ | |¡ |D �]þ\}}}t|ƒ}tj |	||
 ˆ dt|jƒ ¡}t|tƒ�rèd|j }ndt|ƒ }t |dƒ�rd|j!jj"d d … v �s.d|jj"d d … v �r6d!| }tj |	d" ||
 ˆ d#| tjj#j$g¡}t|tƒ�rŒt|ƒd$k�r�|d d$… d% }nd&}tj |	d' ||
 ˆ dt|ƒ ¡}|
d
7 }
|�rz||||||ƒ\}} }}| }!| ¡ }"||"ƒ}#||!ƒ}$|! tjj¡ z8|dk �r&tj%j&|#|$dd(d)�}%ntj%j&|#|$dd*d)�}%W n t'�yP   Y n 0 | |%tj(j)j*tjj+j,|g¡ | |¡ | |¡ | |¡ | |¡ �qš||7 }qô|S ),Nr   z*PyX and its dependencies must be installedrN   é
   ç        gš™™™™™á?gš™™™™™Ù?g333333ã?gš™™™™™é?g      ð?)Ztransgš™™™™™É?ç      à?c                 S   s   d  dd„ | D ƒ¡S )Nú c                 s   s   | ]}d t |ƒ V  qdS )z%02xN)r   )rX   ÚcrQ   rQ   rR   rZ   ,  r[   z5Packet.canvas_dump.<locals>.hexstr.<locals>.<genexpr>)r_   ©rÊ   rQ   rQ   rR   Úhexstr*  s    z"Packet.canvas_dump.<locals>.hexstrc                    s2   t j ˆ | ˆ  ˆ| ˆ dˆ|ƒ t jjjg¡S )Nz\tt{%s})ÚpyxÚtextÚsizeÚLarge)rÊ   rË   Útxt)ÚXDSTARTÚXMULÚYDUMPÚYMULr#  rQ   rR   Úmake_dump_txt.  s    



üz)Packet.canvas_dump.<locals>.make_dump_txtc                 S   s&   t jj|  ¡ |  ¡ |  ¡ |  ¡ dd�S )N)r  r  )Z	relcenter)r$  ÚboxÚrectÚleftÚbottomÚwidthÚheight)ÚorQ   rQ   rR   Úmake_box7  s    þz$Packet.canvas_dump.<locals>.make_boxc                 S   s4  t | ƒdkr.| d  ¡ }| tjj¡ | ¡ S | d  ¡ }| tjj¡ | d  ¡ }| tjj¡ t | ƒdk�r,| ¡ | ¡ k�r,tj tj 	| ¡ | 
¡ ¡tj | ¡ | 
¡ ¡tj | ¡ | ¡ ¡tj | ¡ | ¡ ¡tj 	| ¡ | 
¡ ¡tj | ¡ | 
¡ ¡tj | ¡ | ¡ ¡tj | ¡ | ¡ ¡¡S | d  ¡ }||k�rP| tjj¡ | d  ¡ }||k�r~||k�r~| tjj¡ tj tj 	| ¡ | 
¡ ¡tj | ¡ | 
¡ ¡tj | ¡ | ¡ ¡tj | ¡ | ¡ ¡tj | ¡ | ¡ ¡tj | ¡ | ¡ ¡tj | ¡ | 
¡ ¡tj | ¡ | 
¡ ¡tj ¡ ¡	S d S )NrN   r   éÿÿÿÿr†   éþÿÿÿ)rç   ÚbboxÚenlarger$  ÚunitÚu_ptÚpathr0  ÚrightZmovetoÚtopZlinetor1  Z	closepath)r  ÚbZfbZlbÚgbÚkbrQ   rQ   rR   Ú
make_frame>  sD     ù

øz&Packet.canvas_dump.<locals>.make_frameé   c           
         sÞ   t j ¡ }g }| rl| d || … | || d …  }} ˆ |||ƒ}	| |	¡ |t|ƒ7 }|dkrd}|d7 }q|d u r~t jjj}|d u r�t jjj}| ˆ|ƒ|t j	 
|g¡t jjjg¡ |D ]}	| |	¡ qº||d  ¡ ||fS )NrC  r   rN   r6  )r$  Úcanvasr—   rç   ÚcolorÚrgbÚredÚwhiteÚstrokeÚdecoÚfilledÚstyleÚ	linewidthZThickÚinsertr8  )
rð   ÚshiftrË   ÚcolÚbkcolZlarger!  ZtlistZdmpr(  )r-  rB  rQ   rR   Ú	make_dumpd  s$    
"



&z%Packet.canvas_dump.<locals>.make_dump)r   r  z"\font\cmssfont=cmss10\cmssfont{%s}r†   z%sbz%sBr   ZLEr‡   z$\scriptstyle\langle$g333333@z/\font\cmbxfont=cmssbx10 scaled 600\cmbxfont{%s}é   z[...]rà   g      @i¦ÿÿÿ)Z	absangle1Z	absangle2éZ   )r   r  NNrC  )-r'   ÚImportErrorr$  rD  rk   r   r  rç   Úfloatr    rE  rF  r  rt   r%  r   r«   r:   r&  r'  r8  r9  r:  r;  rI  r<  ÚblackrJ  rK  rN  rn   r   r×   r   r^   ZhalignZboxrightZ	connectorZcurver  rL  rM  ZthinZearrowZsmall)&rb   Zlayer_shiftZrebuildrD  Ú_r°   ZYTXTIÚlZYTXTZXSTARTrË   ZydZ	backcolorZ	forecolorr5  rR  Z
last_shiftZlast_yrQ  Úprotor<   ÚptZptbbr   rc   ZfdumprP  ÚftÚfsizeÚstÚvtÚdtÚtargetZdtbZvtbZbxvtZbxdtZcnxrQ   )r)  r*  r+  r,  r#  r-  rB  rR   Úcanvas_dump  s¬    
	'     û
ÿ
ú$
"ÿþ*$




zPacket.canvas_dumpc                 C   s   |dfS )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)
        NrQ   ©rb   rð   rQ   rQ   rR   Úextract_padding¿  s    zPacket.extract_paddingc                 C   s   |S )z?DEV: is called right after the current layer has been dissectedrQ   rc  rQ   rQ   rR   Úpost_dissectÉ  s    zPacket.post_dissectc                 C   s   |S )z:DEV: is called right before the current layer is dissectedrQ   rc  rQ   rQ   rR   Úpre_dissectÎ  s    zPacket.pre_dissectc                 C   s˜   |}i | _ | jD ]`}|s qr| | |¡\}}t|tƒr@|d u r@q|jsR|jsR|jrd| |¡| j |j	< || j
|j	< q|rˆ|d t|ƒ … n|| _d| _|S ©NrN   )rD   rs   Zgetfieldrn   r   Úislistr–   Z	ismutabler  r:   r<   rç   rC   rB   )rb   rð   Ú_rawr™   rc   rQ   rQ   rR   Ú
do_dissectÓ  s    
zPacket.do_dissectc              	   C   s¤   |r |   |¡}z||d| d�}W nt ty4   ‚ Y nb ty”   tjr€t|tƒr`t d|j	¡ nt d| j
j	t|ƒ¡ |dur€‚ tj|d| d�}Y n0 |  |¡ dS )zd
        Perform the dissection of the layer's payload

        :param str s: the raw layer
        rN   ©r|   r}   z%s dissector failedz&%s.guess_payload_class() returned [%s]N)Úguess_payload_classÚKeyboardInterruptr  r   Zdebug_dissectorr!   r7   r%   Úerrorr^   rk   r¯   r­   r¨   )rb   rð   rP   r
  rQ   rQ   rR   Údo_dissect_payloadç  s"    

þzPacket.do_dissect_payloadc                 C   sT   |   |¡}|  |¡}|  |¡}|  |¡\}}|  |¡ |rPtjrP|  t |¡¡ d S rO   )	rf  rj  re  rd  ro  r   Úpaddingr¨   Úpadding_layer)rb   rð   ÚpaylÚpadrQ   rQ   rR   rq     s    




zPacket.dissectc              
      sh   ˆ j D ]V}|jD ]J\}}z.t‡ fdd„t |¡D ƒƒrD|W     S W q tyX   Y q0 qqˆ  |¡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
        c                 3   s    | ]\}}|ˆ   |¡kV  qd S rO   ©rÃ   ©rX   ÚkrÉ   r„   rQ   rR   rZ     s   ÿz-Packet.guess_payload_class.<locals>.<genexpr>)rª   r\   Úallr`   ra   rz   Údefault_payload_class)rb   rG   r°   rc   rP   rQ   r„   rR   rl    s    	
ÿ
zPacket.guess_payload_classc                 C   s   t jS )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
        )r   r­   ©rb   rG   rQ   rQ   rR   rx  !  s    	zPacket.default_payload_classc                 C   sR   t t | j¡ƒD ]2\}}| j| }|| jv r| j| |kr| j|= q| j ¡  dS )z;Removes fields' values that are the same as default values.N)r{   r`   ra   r<   r;   rG   Úhide_defaults)rb   rv  rÉ   rQ   rQ   rR   rz  ,  s    


zPacket.hide_defaultsc                 K   sŠ   |   ¡ }d|_||_|  | j¡|_| j ¡ |_| j|_| j|_| j	|_	| j
|_
| j|_|  | j¡|_| j|_| j|_|d ur†| |¡ |S rg  )rk   rB   r<   r»   r;   r?   rŒ   r8   rH   rI   rF   rC   rD   rL   rM   r¨   )rb   rG   Úkargsr¤   rQ   rQ   rR   Ú
clone_with7  s$    ÿ
zPacket.clone_withc                    sj   | f‡ fdd„	‰ | j s | jdur,g }| j}n4dd„ t t | j¡t | j¡¡D ƒt	| jƒ }i }ˆ ||ƒS )z:Iterates through all sub-packets generated by this Packet.c                 3   sè   | rr|   ¡ }| |¡}t|tƒs@| |¡jr8t|gƒ}nt|ƒ}|D ]*}|||< ˆ | d d … |ƒD ]
}|V  qbqDnrt|jtƒrŠtd gƒ}n|j}|D ]N}| 	¡ }	|	D ]"}
t|	|
 t
ƒr¤|	|
  ¡ |	|
< q¤|jf d|i|	¤Ž}|V  q”d S rÔ   )rt   rÃ   rn   r   rv   rh  r   rG   rl   rŒ   r   Ú_fixr|  )ÚtodoÚdonerb   ZeltnameÚeltÚerÊ   Zpayloadsrr  Zdone2rv  r¤   ©ÚlooprQ   rR   rƒ  O  s*    

zPacket.__iter__.<locals>.loopNc                 S   s   g | ]\}}t |tƒr|‘qS rQ   )rn   r   ru  rQ   rQ   rR   Ú
<listcomp>o  s   
þz#Packet.__iter__.<locals>.<listcomp>)
rB   rC   r<   rÝ   rÞ   r`   ra   r;   r?   r{   )rb   r~  r  rQ   r‚  rR   Ú__iter__L  s    
ÿþzPacket.__iter__c                 c   s"   | V  | }|j r|j }|V  q
dS )zfUsed to iter through the payloads of a Packet.
        Useful for DNS or 802.11 for instance.
        N)rG   )rb   ÚcurrentrQ   rQ   rR   Úiterpayloadsu  s
    zPacket.iterpayloadsc                 C   s0   t |tƒr|| k S t |tƒr dS t| |fƒ‚dS )z6True if other is an answer from self (self ==> other).rN   N)rn   r7   rp   r®   rµ   rQ   rQ   rR   Ú__gt__€  s
    

zPacket.__gt__c                 C   s2   t |tƒr|  |¡S t |tƒr"dS t| |fƒ‚dS )z6True if self is an answer from other (other ==> self).rN   N)rn   r7   Úanswersrp   r®   rµ   rQ   rQ   rR   Ú__lt__Š  s
    


zPacket.__lt__c                 C   sV   t || jƒsdS | jD ]2}||jvr* dS |  |j¡| |j¡kr dS q| j|jkS ©NF)rn   rk   rs   rÃ   r:   rG   )rb   r¶   r™   rQ   rQ   rR   Ú__eq__”  s    

zPacket.__eq__c                 C   s   |   |¡ S rO   )rŒ  rµ   rQ   rQ   rR   Ú__ne__Ÿ  s    zPacket.__ne__c                 C   s
   | j  ¡ S )zSDEV: returns a string that has the same value for a request
        and its answer.)rG   Úhashretr„   rQ   rQ   rR   rŽ  §  s    zPacket.hashretc                 C   s   |j | j kr| j |j¡S dS )z)DEV: true if self is an answer from otherr   )rk   rG   r‰  rµ   rQ   rQ   rR   r‰  ­  s    zPacket.answersc                 C   s.   g }| }|r*|  |j¡ |jjddd�}q|S )zEreturns a list of layer classes (including subclasses) in this packetr   T©Ú	_subclass)r—   rk   rG   Úgetlayer)rb   ÚlayersZlyrrQ   rQ   rR   r’  ´  s    zPacket.layersc                 C   sÄ   |du r| j pd}|rt}ndd„ }|du sJ|| j|ƒsJ|| jj| jfv rNdS | jD ]^}|  |j¡}|du rnqT|js€t	|dd�}|D ],}t
|tƒr„|j||d�}|r„|    S q„qT| jj||d�S )zr
        true if self has a layer that is an instance of cls.
        Superseded by "cls in self" syntax.
        Nc                 S   s   t | |kƒS rO   ©Úbool©Zcls1Zcls2rQ   rQ   rR   rÌ   É  r[   z!Packet.haslayer.<locals>.<lambda>Tr   ©Z_iterpacketr�  )Úmatch_subclassr!   rk   r^   rj   r@   rÃ   r:   rh  r   rn   r7   ÚhaslayerrG   )rb   rP   r�  Úmatchr™   Ú
fvalue_genÚfvalueÚretrQ   rQ   rR   r˜  ¾  s*    
ÿ

zPacket.haslayerc                    s„  |du rˆ j pd}|rt}ndd„ }t|tƒr<|d }d}n|}d}d}	t|tƒrld|v rl| dd¡\}}	n
|d }}	|r˜|ˆ j|ƒs˜|ˆ jjˆ jfv rÜt	‡ fdd„t
 |¡D ƒƒrÜ|dkrÔ|	du rÈˆ S ˆ  |	¡S n|d8 }ˆ jD ]„}
ˆ  |
j¡}|du � rþqâ|
j�st|d	d
�}|D ]N}t|tƒ�rg }|j|f|||dœ|¤Ž}|du�rZ|    S |d	 }�qqâˆ jj|f|||dœ|¤ŽS )zPReturn the nb^th layer that is an instance of cls, matching flt
values.
        Nc                 S   s   t | |kƒS rO   r“  r•  rQ   rQ   rR   rÌ   ê  r[   z!Packet.getlayer.<locals>.<lambda>rN   rà   Ú.c                 3   s    | ]\}}ˆ   |¡|kV  qd S rO   rt  )rX   ZfldnameZfldvaluer„   rQ   rR   rZ   ü  s   ÿz"Packet.getlayer.<locals>.<genexpr>r   r–  )ÚnbÚ_trackr�  )r—  r!   rn   rü   r«   Úsplitrk   r^   rj   rw  r`   ra   rÃ   r@   r:   rh  r   r7   r‘  rG   )rb   rP   rž  rŸ  r�  Úfltr™  Zstring_class_nameÚ
class_namer¥   r™   rš  r›  Útrackrœ  rQ   r„   rR   r‘  Ú  s^    


ÿÿ

ÿÿ
ÿÿzPacket.getlayerc                 C   s   | }|j d ur|j }q|S rO   r³   )rb   r  rQ   rQ   rR   Ú
firstlayer  s    
zPacket.firstlayerc                 C   sª   t |tƒrT|j}|jr8| j|jfd|ji|jp0i ¤Ž}qb| j|jfi |jpLi ¤Ž}n|}|  |¡}|d u r¦t |tƒr||j}nt |tƒs�t	|ƒ}n
t
t|ƒ}td| ƒ‚|S )Nrž  zLayer [%s] not found)rn   ÚsliceÚstartÚstopr‘  ÚstepÚtyper^   rp   r¯   r5   r«   r	  )rb   rP   Úlnamerœ  r:   rQ   rQ   rR   Ú__getitem__  s    
"




zPacket.__getitem__c                 C   s   | | j `d S rO   ©rH   rG   ©rb   rP   rQ   rQ   rR   Ú__delitem__2  s    zPacket.__delitem__c                 C   s   || | j _d S rO   r¬  )rb   rP   rÎ   rQ   rQ   rR   Ú__setitem__6  s    zPacket.__setitem__c                 C   s
   |   |¡S )ze
        "cls in self" returns true if self has a layer which is an
        instance of cls.
        )r˜  r­  rQ   rQ   rR   Ú__contains__:  s    zPacket.__contains__c                 C   s
   | j  ¡ S rO   )rG   Úrouter„   rQ   rQ   rR   r±  B  s    zPacket.routec                 O   s   | j j|i |¤ŽS rO   )rG   Úfragment©rb   r  r{  rQ   rQ   rR   r²  F  s    zPacket.fragmentc                 O   s   | j |i |¤Ž dS )zDeprecated. Use show() method.N)Úshowr³  rQ   rQ   rR   ÚdisplayJ  s    zPacket.displayr‡   rà   c              	   C   s  |rddl m} |ƒ }ntj}d|| d¡| | j¡| d¡f }| jD �]x}	t|	t	ƒrd|	 
| ¡sdqHt|	tƒsx|	tjv r†|j}
|j}n|j}
|j}|  |	j¡}t|tƒsÄ|	j�r0|	j�r0t|tƒ�r0tddt|	jƒ ƒd }|d|| |
|	jƒ|f 7 }t|dd	�}|D ]$}||j|||| d
 dd�7 }�qqHtddt|	jƒ ƒd }d|| |
|	jƒ|| d¡f }|	 | |¡}t|tƒ�r®| dddt|ƒt|ƒ t|	jƒ d   ¡}|d|||ƒf 7 }qH| j�rô|| jj|||d| | j  |dd�7 }|�r|�st|ƒ dS |S dS )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\
r–  z   |F)ÚdumpÚindentÚ	label_lvlÚ
first_callz%s  %s%s%s rá   Ú
rˆ   z%s%s
)r·  r¸  Úlvlr¹  rº  N) Zscapy.themesr¶  r   rå   rî   rï   r:   rs   rn   r   ræ   r   ré   rê   rë   rì   rí   rÃ   r7   rh  r–   r{   Úmaxrç   r   Ú_show_or_dumprè   r«   ÚreplacerG   Úshow_indentr]   )rb   r·  r¸  r¼  r¹  rº  r¶  rñ   rð   r™   rò   ró   r›  rs  rš  ZbegnZreprvalrQ   rQ   rR   r¾  O  sn    
ý&þ$ýÿþý
ûzPacket._show_or_dumpc                 C   s   |   ||||¡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¾  ©rb   r·  r¸  r¼  r¹  rQ   rQ   rR   r´  ›  s    zPacket.showc                 C   s   |   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
        )rk   r   r´  rÁ  rQ   rQ   rR   Úshow2©  s    zPacket.show2c              	   C   sn  ddddœ}d|v ræ|  d¡}||d d…  d¡}||d || d … }| d¡}|dk rjtd	| ƒ‚|d|… ||d d…  }}d
}	|d dkr¨d}	|dd… }|  |¡r¸|	 }	|	sÀd}|d|… | ||| d d…  }qd}
d|v �rb| d¡}|
|d|… 7 }
||d d… }|�rP|d |v �rP|
||d  7 }
|dd… }qêz¶| d¡}|d|… }| d¡}t|ƒdk�rŽd}|d }nt|ƒdk�r¦|\}}nt‚d|v �rÄ| d¡\}}n| jj}|}d}d|v �rô| d¡\}}t	|ƒ}||d d… }W n: t
�y@   td|dd… |dd… �o4df ƒ‚Y qê0 |dk�r~t dt t| jƒ¡¡t	| jt	| jƒ d ƒ }nÒ|| jjk�r:t| |ƒ�r:|dk�rÆ| j d|||d |f |¡}d}nrz|  |¡}W n t�yò   t| |ƒ}Y n0 |d dk�r|dd… }|�s8d}n|| jv �rP| j|  | |¡}n| j d| |¡}d}|
d| | 7 }
qê|
|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Ã  ú(ú)rN   Nú:r   z8Bad condition in format string: [%s] (read sprintf doc!)Fú!Trà   r†   ú,rð   r�  zBad format string [%%%s%s]é   z...r8   z%H:%M:%S.%%06ii@B z%%%s,%s:%s.%s%%r6  r  z%%%s%%)ÚrindexÚindexÚfindr$   r˜  r   rç   rk   r^   rü   r  r8   ÚstrftimeÚ	localtimerV  r×   rG   ÚsprintfrÃ   rz   Úgetattrr=   rè   )rb   ÚfmtÚrelaxÚescaperY   ÚjZcondrv  Zformat_Úresrð   ZsfclsfldZfclsfldr™   ZclsfldrP   r¥   ÚnumZsnumrÎ   rQ   rQ   rR   rÑ  ¸  sš    #þ


&







,
þý
zPacket.sprintfc                 C   s   dS )aO  DEV: 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à   rQ   r„   rQ   rQ   rR   Ú	mysummary1  s    zPacket.mysummaryc                 C   sî   | j  ¡ \}}}d}|r"| j|v rD|  ¡ }t|tƒrD|\}}||7 }|sL|rPd}|sf| jrb| jjnd}| jtj	v rÂg }| j
D ]2}|tj	v r|| d|j| | |  |j¡¡f ¡ q|d|d |¡f }|rØ|rØd||f }nd||f }|||fS )Nrà   rN   ú%s=%sz%s [%s]r   z%s / %sz%s%s)rG   Ú_do_summaryrk   rÙ  rn   ÚtupleÚshow_summaryr^   r   ré   rs   r—   r:   rè   rÃ   r_   )rb   Úfoundrð   Úneededrœ  ÚnZimpfr™   rQ   rQ   rR   rÛ  9  s*    


&zPacket._do_summaryc                 C   s   |   ¡ d S )z&Prints a one line summary of a packet.rN   )rÛ  )rb   ÚinternrQ   rQ   rR   r÷   R  s    zPacket.summaryc                 C   s   | j  | ¡S )z&Returns the uppest layer of the packet)rG   Ú	lastlayer©rb   ÚlayerrQ   rQ   rR   râ  W  s    zPacket.lastlayerc                 C   s@   t | jƒ}||d| d�| _| }|jdur0|j}q| j |¡ dS )z@Reassembles the payload and decode it using another packet classrN   rk  N)r   rG   rH   rr   )rb   rP   rð   ÚpprQ   rQ   rR   Údecode_payload_as\  s    

zPacket.decode_payload_asc                 C   s4  g }t  | j¡D ]ì\}}|  |¡}t|tttfƒr@t|ƒdkr@qt|t	ƒrT| 
¡ }n–|jr‚|jr‚t|tƒr‚dd tt	j
|ƒ¡ }nh|jr¬t|tƒr¬dd dd„ |D ƒ¡ }n>t|tƒrÀt|ƒ}n*tt|ddƒƒrÚ| 
¡ }nt| | |¡ƒ}| d	||f ¡ qd
| jjd |¡f }| j 
¡ }|�r0|d| 7 }|S )zn
        Returns a string representing the command you have to type to
        obtain the same packet
        r   z[%s]rÊ  rU   c                 3   s$   | ]‰ t ˆ d ‡ fdd„ƒƒ V  qdS )Úcommandc                      s   t ˆ ƒS rO   )r¯   rQ   r"  rQ   rR   rÌ   w  r[   z*Packet.command.<locals>.<genexpr>.<lambda>N)rÒ  )rX   rQ   r"  rR   rZ   v  s   ÿz!Packet.command.<locals>.<genexpr>rç  NrÚ  z%s(%s)ú/)r`   ra   r<   rv   rn   r{   r    r¡   rç   r7   rç  rh  r–   r_   Úmapr   rü   ÚcallablerÒ  r¯   rÈ   r—   rk   r^   rG   )rb   r™   ÚfnZfvr¥   r!  ZpcrQ   rQ   rR   rç  f  s0    


þ



zPacket.command)r[   Nr   NN)r   )r   rN   )N)N)rN   NN)Fr‡   rà   rà   T)Fr‡   rà   rà   )Fr‡   rà   rà   )rN   )r   )N)}r^   Ú
__module__Ú__qualname__Ú	__slots__r:   rs   rx   r>   r\   rÀ  rÝ  r—  r�   r�   rš   rž   rœ   ÚclassmethodrS   re   rh   r‚   r0   r3   r#   rV  r.   rü   r   rp   Z_PickleTyper…   r‹   rŽ   rm   r’   r“   r›   rr   r¢   rv   r¨   r²   r©   r±   r¹   rº   rŒ   ry   rÃ   rÆ   rÇ   rÍ   rÑ   rÓ   rÕ   rÛ   rß   rô   r`   ÚPY2rö   rø   rû   Ú__truediv__rú   Ú__rtruediv__rý   rþ   rÿ   Ú__bool__r   r  r»   r  r  r  r  r  rƒ   r  r  r  r  rb  rd  re  rf  rj  ro  rq   rl  rx  rz  r|  r…  r‡  rˆ  rŠ  rŒ  r�  Ú__hash__rŽ  r‰  r’  r˜  r‘  r¤  r«  r®  r¯  r°  r±  r²  rµ  r¾  r´  rÂ  rÑ  rÙ  rÛ  r÷   râ  ræ  rç  rQ   rQ   rQ   rR   r7   O   s  


     û
B
ûÿ	*


$
#	

 0

)



   ü
<     û
L


y


r7   c                   @   sT  e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zdd„ ZeZdd „ Zd!d"„ Zd#d$„ Zd%d&„ ZdUd(d)„Zd*d+„ Zd,d-„ Zd.d/„ Zd0d1„ Zd2d3„ Zd4d5„ Zd6d7„ Zd8d9„ Zd:d;„ Z dVd=d>„Z!dWd@dA„Z"dBdC„ Z#dXdGdH„Z$dYdIdJ„Z%dKdL„ Z&dMdN„ Z'dZdOdP„Z(dQdR„ Z)dSdT„ Z*d<S )[rl   c                 O   s2   | j  d¡}|d u r.t | ¡ | _}t |¡ |S )NÚ	__singl__)rÖ   r‘   r7   Ú__new__rõ  r‚   )rP   r  r{  ZsinglrQ   rQ   rR   rö  ‰  s
    
zNoPayload.__new__c                 O   s   d S rO   rQ   r³  rQ   rQ   rR   r‚   ‘  s    zNoPayload.__init__c                 C   s   d S rO   rQ   r£   rQ   rQ   rR   rr   •  s    zNoPayload.dissection_donec                 C   s   t dƒ‚d S )Nz'Can't add payload to NoPayload instance©r$   ry  rQ   rQ   rR   r¨   ™  s    zNoPayload.add_payloadc                 C   s   d S rO   rQ   r„   rQ   rQ   rR   r²   �  s    zNoPayload.remove_payloadc                 C   s   d S rO   rQ   r´   rQ   rQ   rR   r©   ¡  s    zNoPayload.add_underlayerc                 C   s   d S rO   rQ   rµ   rQ   rQ   rR   r±   ¥  s    zNoPayload.remove_underlayerc                 C   s   d S rO   rQ   r¸   rQ   rQ   rR   r¹   ©  s    zNoPayload.add_parentc                 C   s   d S rO   rQ   rµ   rQ   rQ   rR   rº   ­  s    zNoPayload.remove_parentc                 C   s   | S rO   rQ   r„   rQ   rQ   rR   rŒ   ±  s    zNoPayload.copyc                 C   s   d S rO   rQ   r„   rQ   rQ   rR   r  µ  s    zNoPayload.clear_cachec                 C   s   dS ©Nrà   rQ   r„   rQ   rQ   rR   rô   ¹  s    zNoPayload.__repr__c                 C   s   dS rø  rQ   r„   rQ   rQ   rR   rö   ½  s    zNoPayload.__str__c                 C   s   dS ©Nr[   rQ   r„   rQ   rQ   rR   rø   Á  s    zNoPayload.__bytes__c                 C   s   dS r‹  rQ   r„   rQ   rQ   rR   rÿ   Å  s    zNoPayload.__nonzero__c                 C   s   dS rù  rQ   r„   rQ   rQ   rR   r  Ê  s    zNoPayload.do_buildc                 C   s   dS rù  rQ   r„   rQ   rQ   rR   rƒ   Î  s    zNoPayload.buildc                 C   s   dS rù  rQ   r„   rQ   rQ   rR   r  Ò  s    zNoPayload.build_paddingc                 C   s   |S rO   rQ   r  rQ   rQ   rR   r  Ö  s    zNoPayload.build_doner   c                 C   s   dg fS rù  rQ   )rb   r  rQ   rQ   rR   r  Ú  s    zNoPayload.build_psc                 C   s   t |ƒ‚d S rO   ©rz   rÄ   rQ   rQ   rR   rÃ   Þ  s    zNoPayload.getfieldvalc                 C   s   t |ƒ‚d S rO   rú  rÄ   rQ   rQ   rR   rÆ   â  s    zNoPayload.getfield_and_valc                 C   s   t |ƒ‚d S rO   rú  rÒ   rQ   rQ   rR   rÍ   æ  s    zNoPayload.setfieldvalc                 C   s   t |ƒ‚d S rO   rú  rÄ   rQ   rQ   rR   rÓ   ê  s    zNoPayload.delfieldvalc                 C   s   d S rO   rQ   r„   rQ   rQ   rR   rz  î  s    zNoPayload.hide_defaultsc                 C   s   t g ƒS rO   )r  r„   rQ   rQ   rR   r…  ò  s    zNoPayload.__iter__c                 C   s   t |tƒrdS dS )NTF)rn   rl   rµ   rQ   rQ   rR   rŒ  ö  s    
zNoPayload.__eq__c                 C   s   dS rù  rQ   r„   rQ   rQ   rR   rŽ  ü  s    zNoPayload.hashretc                 C   s   t |ttjfƒS rO   )rn   rl   r   rq  rµ   rQ   rQ   rR   r‰     s    zNoPayload.answersNc                 C   s   dS ri   rQ   )rb   rP   r�  rQ   rQ   rR   r˜    s    zNoPayload.haslayerrN   c                 K   s   |d ur|  |¡ d S rO   )r—   )rb   rP   rž  rŸ  r�  r¡  rQ   rQ   rR   r‘    s    
zNoPayload.getlayerc                 O   s   t dƒ‚d S )Nzcannot fragment this packetr÷  r³  rQ   rQ   rR   r²    s    zNoPayload.fragmentFr‡   rà   c                 C   s   d S rO   rQ   rÁ  rQ   rQ   rR   r´    s    zNoPayload.showc                 C   s   |rdS t d| ƒ‚d S )Nz??zFormat not found [%s]r÷  )rb   rÓ  rÔ  rQ   rQ   rR   rÑ    s    zNoPayload.sprintfc                 C   s
   ddg fS )Nr   rà   rQ   r„   rQ   rQ   rR   rÛ  #  s    zNoPayload._do_summaryc                 C   s   g S rO   rQ   r„   rQ   rQ   rR   r’  '  s    zNoPayload.layersc                 C   s   |p| S rO   rQ   rã  rQ   rQ   rR   râ  +  s    zNoPayload.lastlayerc                 C   s   dS rø  rQ   r„   rQ   rQ   rR   rç  /  s    zNoPayload.commandc                 C   s   dS )N)NNNrQ   r„   rQ   rQ   rR   r±  3  s    zNoPayload.route)r   )N)rN   NN)Fr‡   rà   rà   )rN   )N)+r^   rì  rí  rö  r‚   rr   r¨   r²   r©   r±   r¹   rº   rŒ   r  rô   rö   rø   rÿ   ró  r  rƒ   r  r  r  rÃ   rÆ   rÍ   rÓ   rz  r…  rŒ  rŽ  r‰  r˜  r‘  r²  r´  rÑ  rÛ  r’  râ  rç  r±  rQ   rQ   rQ   rR   rl   ˆ  sV   

   ü



rl   c                       s>   e Zd Zd ZeddƒgZd	‡ fdd„	Zdd„ Zdd„ Z‡  Z	S )
ÚRawr§   r[   c                    s8   |rt |tƒst|ƒ}tt| ƒj|g|¢R i |¤Ž d S rO   )rn   rp   r   Úsuperrû  r‚   )rb   rE   r  Úkwargs©rk   rQ   rR   r‚   A  s    zRaw.__init__c                 C   s   dS rg  rQ   rµ   rQ   rQ   rR   r‰  G  s    zRaw.answersc                 C   s4   t j}|r*t|ƒr d|| jƒ S d| j S t | ¡S )NzRaw %szRaw %r)r   Zraw_summaryrê  r§   r7   rÙ  )rb   ÚcsrQ   rQ   rR   rÙ  K  s    
zRaw.mysummary)r[   )
r^   rì  rí  r:   r   rs   r‚   r‰  rÙ  Ú__classcell__rQ   rQ   rþ  rR   rû  =  s
   rû  c                   @   s"   e Zd Zd Zddd„Zdd„ ZdS )ÚPaddingNc                 C   s   dS rù  rQ   )rb   Zfield_pos_listrQ   rQ   rR   r  Y  s    zPadding.self_buildc                 C   s$   | j d u rt| jƒn| j | j ¡  S rO   )rC   r   r§   rG   r  r„   rQ   rQ   rR   r  ]  s    ýzPadding.build_padding)N)r^   rì  rí  r:   r  r  rQ   rQ   rQ   rR   r  V  s   
r  c                 K   s6   |dur|  |¡ | jdd… | _| j ||f¡ dS )a  Bind 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Ø   r\   r—   ©rg   rd   Z__fvalrc   rQ   rQ   rR   Úbind_bottom_upo  s    
r  c                 K   s,   |dur|  |¡ |j ¡ |_||j| < dS )a  Bind 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Ø   rf   rŒ   r  rQ   rQ   rR   Úbind_top_down…  s    
r  c                 K   s:   |dur|  |¡ t| |fi |¤Ž t| |fi |¤Ž dS )aH  Bind 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  rQ   rQ   rR   Úbind_layersš  s    
r  c                    s:   |durˆ  |¡ ‡‡fdd„‰ ‡ fdd„| jD ƒ| _dS )zrThis call un-links an association that was made using bind_bottom_up.
    Have a look at help(bind_bottom_up)
    Nc                    s(   t ‡ fdd„t ˆ¡D ƒƒ}|ˆkp&|S )Nc                 3   s&   | ]\}}|ˆ vpˆ | |kV  qd S rO   rQ   ru  ©ÚparamsrQ   rR   rZ   Á  s   z5split_bottom_up.<locals>.do_filter.<locals>.<genexpr>)Úanyr`   ra   )r  rP   Zparams_is_invalid)rc   rd   r  rR   Ú	do_filter¿  s    ÿz"split_bottom_up.<locals>.do_filterc                    s   g | ]}ˆ |Ž r|‘qS rQ   rQ   ©rX   rÊ   )r	  rQ   rR   r„  Å  r[   z#split_bottom_up.<locals>.<listcomp>)rØ   r\   r  rQ   )r	  rc   rd   rR   Úsplit_bottom_up³  s    	
r  c                    s^   |dur|  |¡ | |jv rZ|j|  ‰ t‡ fdd„t |¡D ƒƒrFdS |j ¡ |_|j| = dS )zpThis call un-links an association that was made using bind_top_down.
    Have a look at help(bind_top_down)
    Nc                 3   s&   | ]\}}|ˆ vpˆ | |kV  qd S rO   rQ   ru  ©ZofvalrQ   rR   rZ   Õ  r[   z!split_top_down.<locals>.<genexpr>)rØ   rf   r  r`   ra   rŒ   r  rQ   r  rR   Úsplit_top_downÈ  s    	


r  c                 K   s:   |dur|  |¡ t| |fi |¤Ž t| |fi |¤Ž dS )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  rQ   rQ   rR   Úsplit_layersÛ  s    
r  c                 C   sŠ  | du �rht jstdƒ‚zddl}W n ty>   tdƒ‚Y n0 t|dƒsRtdƒ‚ddlm}m} ddl	m
} d	d
„ }t|dƒrˆdd
„ }|t dt j ¡|t d¡ƒt d¡dft d¡dft d¡dfgd�}||ƒ}|dkrút j ¡ }dd„ |D ƒ}	nT|dk�rJddlm}
 tttttf  |
dd�ƒ}dd„ |D ƒ}	dd„ |	D ƒ}	ndS tj�rddd„ |	D ƒ}	|dk�rttƒ}|	D ]”\}}d|v �rú| d¡}|}|dd… D ](}||v�r¼i ||< || }||d < �q¦d!|v�râg |d!< |d!  |d |f¡ n|d!  ||f¡ �qzn|dk�r$d!|	i}|}g }t| ¡ ƒ}d"d„ |D ƒ| d!g ¡ }d#}|�r†d t d$d%„ |d&d… D ƒ|d  f¡¡}d'||�r˜d| nd#  }||t dt j ¡|t d(| ¡ƒ|�rÌd)ndd*�}||ƒ}|du �rþ|�rú| ¡ }�q,ndS |  d+¡�r&| |¡ ||d&d…  }n|�r@|d | }�q@�q,|dk�rdd,lm!} ||ƒ d-| }n²t"| t#j$ƒ�r|| j%} t"| tƒ�r|   d.¡�rš| }nr|   d-¡�r²|  &d-d#¡} dd,lm!} || ƒ d/|  d0|   }}|t jj'v �rì|}n |t jj'v �r |}ntd1|  ƒ‚nt(d2ƒ dS zt jj'| }W n  t)�yJ   td1|  ƒ‚Y n0 t*t j+ ,d3| ¡ƒ g }d4d„ |D ƒ}t*t-|d5gdd6�ƒ dS )7aC  Function 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 !r   zgprompt_toolkit is not installed ! You may install IPython, which contains it, via `pip install ipython`)r†   r   z%prompt_toolkit >= 2.0.0 is required !)Úradiolist_dialogÚbutton_dialog)ÚHTMLc                 S   s
   t t| ƒS rO   )r5   r«   r"  rQ   rQ   rR   rÌ     r[   zexplore.<locals>.<lambda>)r‡   r   c                 S   s   |   ¡ S rO   )Úrunr"  rQ   rQ   rR   rÌ     r[   z	Scapy v%szQ<style bg="white" fg="red">Chose the type of packets you want to explore:</style>ZLayersr’  ZContribsZcontribsZCancelÚcancel)Útitler%  Zbuttonsc                 S   s4   g | ],}d |d v s,d|d v s,d|d v r|‘qS )r’  r   ÚpacketZasn1rQ   r
  rQ   rQ   rR   r„  ,  s   þzexplore.<locals>.<listcomp>)Úlist_contribT)rœ  c                 S   s   g | ]}|d  |d f‘qS )r:   ÚdescriptionrQ   r
  rQ   rQ   rR   r„  3  s   ÿc                 S   s   g | ]}d |d vr|‘qS )Zcanr   rQ   r
  rQ   rQ   rR   r„  6  r[   c                 S   s$   g | ]\}}t  |¡t  |¡f‘qS rQ   )r`   Ú	text_type)rX   rÊ   rË   rQ   rQ   rR   r„  <  s   ÿr�  r6  rj   Z_lc                 S   s0   g | ](}|  d ¡sd| t d| ¡  ¡f‘qS )rX  ú$z[+] )Ú
startswithr`   r  Ú
capitalize)rX   r:   rQ   rQ   rR   r„  \  s   ÿrà   c                 s   s   | ]}|d  V  qdS )rj   NrQ   r
  rQ   rQ   rR   rZ   d  r[   zexplore.<locals>.<genexpr>rN   z0
<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>ZBack)Úvaluesr  r%  Zcancel_textr  )Úload_contribzscapy.contrib.zscapy.layers.zscapy.layers.%szscapy.contrib.%szUnknown scapy module '%s'z%Wrong usage ! Check out help(explore)zPackets contained in %s:c                 S   s    g | ]}|j pd |jpd f‘qS )rà   )r^   rj   )rX   ZlayrQ   rQ   rR   r„  ±  r[   )ÚClassÚName)Zborders).r   Úinteractiver$   Úprompt_toolkitrU  r   Z prompt_toolkit.shortcuts.dialogsr  r  Zprompt_toolkit.formatted_textr  r`   r  rÂ   r’  Z
scapy.mainr  r5   r,   r*   r«   rð  r   r{   r   r—   Úkeysr‘   r_   rÝ   rÞ   rt   r  r  rn   ÚtypesÚ
ModuleTyper^   r¿  Zldictr&   ru   r]   rå   rï   r"   )rä  r!  r  r  r  Zcall_ptkZbtn_diagÚactionZlvaluesr  r  ZcvaluesÚtreer:   ÚdescÚpartsZsubtreeÚpar†  ÚpreviousÚfoldersZ_radio_valuesZcur_pathZ
extra_textZrd_diagÚresultr  Zresult_layerZresult_contribÚ
all_layersZrtlstrQ   rQ   rR   Úexploreð  s   


ÿÿýø

ÿÿ





þ
ýþÿþÿüÿô



ÿr.  Fc              
   C   s&  t | tƒ}t| tƒs|st‚g }| jD �]ø}|}g }g }t |ttfƒrnt |tƒrf| |jj	dd… ¡ |j
}q8|j}|j}	|rÆt |tƒrÆt|dƒrÆt|jpœg ƒdk rÄ| dd„ tt |j¡ƒD ƒ¡ nöt |tƒ�rT| tt|râ| n| ƒ ƒ¡}
| d|
 ¡ |�r¼|j | tt|�r| n| ƒ ƒ¡i ¡}t|ƒdk �r¼| dd„ tt |¡ƒD ƒ¡ nh|�r~t |tƒ�r~|j}| d	 |¡¡ n>t |tƒ�r¼|jj}	| d	 d
d„ t  |j!|jfg¡D ƒ¡¡ |j}|�rÖdd	 |¡ nd}t |t"ƒ�r|d|j#|j#dk�rþdndf 7 }| |||t$|	ƒ|f¡ q&|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é2   c                 s   s   | ]\}}d ||f V  qdS ©z%s: %dNrQ   ©rX   ZnumvalÚstrvalrQ   rQ   rR   rZ   Ð  s   ÿz_pkt_ls.<locals>.<genexpr>zDepends on %sc                 s   s   | ]\}}d ||f V  qdS r1  rQ   r2  rQ   rQ   rR   rZ   á  s   ÿrU   c                 s   s   | ]}|d  j jV  qdS )r   N)rk   r^   r
  rQ   rQ   rR   rZ   ë  s   z(%s)rà   z (%d bit%s)rN   rð   )%rn   r7   r!   rÅ   rs   r   r   r—   rk   r^   r¥   r:   r•   r	   r×   rç   r/  ÚextendrÜ   r`   ra   r   Z
depends_onr5   Z	i2s_multir‘   r   Únamesr_   r   ÚdfltrÝ   rÞ   Úfldsr   r&  r¯   )ÚobjÚverboseÚis_pktr<   r™   Zcur_fldrÚ   Ú
long_attrsr:   r•   Z
fld_dependZcur_i2sr5  rP   Zclass_name_extrasrQ   rQ   rR   Ú_pkt_lsµ  s„    


ÿ
ý
ÿÿý
ý
þ
þÿþþüÿr<  c                    sº  t ˆ tƒ}ˆ du s|rÊd}ˆ du r:d}ttjdd„ d�}n^t ttˆ ƒ|rNdntj¡‰|rh‡ fdd„}nˆ  	¡ ‰ ‡ fd	d„}t‡fd
d„tjD ƒ|d�}|D ]}t
d|j|jf ƒ qœ|rÈtjrÈt
dƒ nìzÎtˆ |d�}t ˆ tƒ}	|D ]x\}
}}}}|jd | }t
d|
|f dd� |	�r4t
dtˆ |
ƒf dd� t
d|f ƒ |D ]}t
dd|f ƒ �qFqæ|	�r–ttˆ ƒ‰ t ˆ jtƒ�r„W dS t
dƒ tˆ jƒ W n t�y´   t
dƒ Y n0 dS )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:
    NFTc                 S   s   | j S rO   )r^   r"  rQ   rQ   rR   rÌ   	  r[   zls.<locals>.<lambda>)Úkeyr   c                    s   | j  ˆ ¡t| j ƒfS rO   )r^   rÍ  rç   r"  ©r8  rQ   rR   rÌ   	  r[   c                    s   | j  ¡  ˆ ¡t| j ƒfS rO   )r^   rg   rÍ  rç   r"  r>  rQ   rR   rÌ    	  s   ÿc                 3   sB   | ]:}t |jtƒrˆ  |j¡s6t |jtƒrˆ  |j¡r|V  qd S rO   )rn   r^   r«   Úsearchr:   )rX   rä  )ÚpatternrQ   rR   rZ   "	  s
   üzls.<locals>.<genexpr>z
%-10s : %szL
TIP: You may use explore() to navigate through all layers using a clear GUI)r9  r   z%-10s : %-35s =)Úendz%-15rz(%r)z%-15s%srà   z--z?Not a packet class or name. Type 'ls()' to list packet classes.)rn   r«   rÜ   r   r’  ÚreÚcompiler5   ÚIrg   r]   r^   rj   r   r<  r7   rÒ  rG   rl   ÚlsrÅ   )r8  Úcase_sensitiver9  Ú	is_stringZtipr-  Zsorterrä  r<   r:  r€   rP   Zclsner6  r;  ZclsinforÀ   rQ   )r8  r@  rR   rE  	  sV    
þû

þ

rE  Tc                 C   s–  t | tƒstdƒ‚d}g }g }dd„ }d}| jD ]”}t|jd ƒ}	||	7 }|d7 }|j ¡  dd¡}
t	d|d	 ƒ}||	| ƒ}| 
|
d
|… ||f¡ |d	krÄ| 
|¡ | }}	d}
g }|sÂq0qdq0qdq0|rÔ| 
|¡ g }| 
d¡ tt|ƒd ƒD ]¾}d}|| ||d   }}|d d |d d k�r¦tdd„ |d
d… D ƒƒt|d
d… ƒ d }|d d }||k �r¦||d  }|d
d| … d||   |d| d
…  }| 
|¡ qòd}|dd dd„ tdƒD ƒ¡ d 7 }|dd dd„ td	ƒD ƒ¡ d 7 }t||ƒD ]@\}}||7 }|D ] \}}	}|d| |	d¡ 7 }�q|d7 }�q|d|�pVd	 d 7 }|�r€|dd| j  dd¡ 7 }|�rŠ|S t|ƒ 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)

    zPacket class expectedr   c                 S   s   d|  d S )Nr†   rN   rQ   r"  rQ   rQ   rR   rÌ   ^	  r[   zrfc.<locals>.<lambda>é   rN   rX  r   é    Nrà   zB+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
r6  r†   c                 s   s   | ]}|d  V  qdS )rN   NrQ   r
  rQ   rQ   rR   rZ   ˆ	  r[   zrfc.<locals>.<genexpr>z                   c                 s   s   | ]}t |ƒV  qd S rO   ©r«   r
  rQ   rQ   rR   rZ   š	  s   rˆ   r»  c                 s   s   | ]}t |d  ƒV  qdS )r  NrJ  r
  rQ   rQ   rR   rZ   ž	  s   rã   z|
z+-z+
zFig. éB   )Ú
issubclassr7   r®   rs   rü   Úszr:   rd   r¿  r½  r—   Úrangerç   Úsumr_   ÚzipÚcenterr^   r]   )rP   rœ  ZlegendÚcur_lenÚcur_lineÚlinesZclsizeÚidentr™   Zflenr€   ZoverZlen1ÚsepsrY   ÚsepZaboveZbelowZ	pos_aboveZ	pos_belowr,  Úliner€  rX  rQ   rQ   rR   ÚrfcH	  s‚    




.

ÿþÿÿþÿþrY  c           
      C   s   |s|   ¡ } | }t|tƒ�si }g }|jD ]~}t|tƒrXt||jƒD ]}t|dd� qDq*t|tƒrp| 	|j¡ q*|j
dur*t|tƒrŽ| |¡r*| ¡ }|dur*|||j< q*|�rdd„ t |¡D ƒ}|j |¡ |D ]2}tt| |¡ƒ}	|	 |¡ ¡ }|durÔ|||< qÔ|j |¡ |j}q| 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.
    rN   )Ú_inplaceNc                 S   s(   i | ] \}}|t |tƒr | ¡ n|“qS rQ   )rn   r   r}  )rX   r=  rÎ   rQ   rQ   rR   r  ×	  s   ÿzfuzz.<locals>.<dictcomp>)rŒ   rn   rl   rs   r   rÒ  r:   Úfuzzr   r—   r•   r   ræ   Zrandvalr`   ra   r;   rØ   r5   rv   Z_find_fld_pktrG   )
r
  rZ  r  Znew_default_fieldsZmultiple_type_fieldsr™   r  Zrndr:   r¥   rQ   rQ   rR   r[  ¶	  s<    



þ
r[  )N)N)N)N)N)N)N)F)NFF)FT)r   )bÚ__doc__Ú
__future__r   r   Úcollectionsr   rB  r8   rÝ   rŒ   r#  r½   Zscapy.fieldsr   r   r   r   r	   r
   r   r   r   r   r   r   Zscapy.configr   r   Zscapy.compatr   r   r   Zscapy.base_classesr   r   r   r   r   Zscapy.interfacesr   Zscapy.volatiler   r   Zscapy.utilsr   r   r    r!   r"   r#   Zscapy.errorr$   r%   r&   Zscapy.libs.test_pyxr'   Zscapy.libs.sixZlibsr`   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r$  rU  r«   r6   Úwith_metaclassr7   rl   rû  r  r­   rq  Z
default_l2r  r  ÚcommandsÚregisterr  r  r  r  r.  r<  rE  rY  r[  rQ   rQ   rQ   rR   Ú<module>   sš   
8 @ ÿ            E 6	 þ
 þ
 þ þ
 þ
 þ F ÿ
N   þDm ÿ