a
    kÄ#dHS  ã                   @   sÜ  d Z ddlZddlmZmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlmZm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mZmZmZmZ G d	d
„ d
eƒZ G dd„ deƒZ!G dd„ de!ƒZ"G dd„ deƒZ#G dd„ deƒZ$G dd„ deƒZ%G dd„ deƒZ&G dd„ deƒZ'G dd„ deƒZ(G dd„ deƒZ)dd„ Z*G dd „ d eƒZ+G d!d"„ d"eƒZ,G d#d$„ d$eƒZ-G d%d&„ d&eƒZ.ee!e&dd'� ee!e%d(d'� ee!e#d)d'� ee!e'd*d'� ej/ 0e
e"¡ ej/ 0ee!¡ dS )+z*
Wireless MAC according to IEEE 802.15.4.
é    N)ÚorbÚchb)Úwarning)Úconf)ÚDLT_IEEE802_15_4_WITHFCSÚDLT_IEEE802_15_4_NOFCS)ÚPacketÚbind_layers)ÚBitEnumFieldÚBitFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚEmphÚFCSFieldÚFieldÚFieldListFieldÚLELongFieldÚMultipleTypeFieldÚPacketFieldÚStrFixedLenFieldÚ
XByteFieldÚXLEIntFieldÚXLEShortFieldc                   @   s>   e Zd ZddgZddd„Zdd„ Zd	d
„ Zdd„ Zdd„ ZdS )Údot15d4AddressFieldÚadjustÚ	length_ofNú<Hc                    s8   t  ˆ |||¡ |ˆ _|d ur&|ˆ _n‡ fdd„ˆ _d S )Nc                    s   ˆ   | |¡S ©N)ÚlengthFromAddrMode©ÚpktÚx©Úself© úK/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/dot15d4.pyÚ<lambda>5   ó    z.dot15d4AddressField.__init__.<locals>.<lambda>)r   Ú__init__r   r   )r$   ÚnameÚdefaultr   Úfmtr   r%   r#   r&   r)   /   s
    zdot15d4AddressField.__init__c                    s`   t t|  |ˆ ¡ƒƒdk r(t|  |ˆ ¡ƒS d|  |ˆ ¡ ‰ d ‡ fdd„tdt ˆ ƒdƒD ƒ¡S dS )	z/Convert internal value to a nice representationé   z%016xú:c                    s$   g | ]}d ˆ | ˆ |d  f ‘qS )z%s%sé   r%   )Ú.0Úi©r"   r%   r&   Ú
<listcomp>=   r(   z.dot15d4AddressField.i2repr.<locals>.<listcomp>r   é   N)ÚlenÚhexZi2mÚjoinÚrange)r$   r!   r"   r%   r2   r&   Úi2repr7   s    zdot15d4AddressField.i2reprc                 C   s`   |   || j¡dkr,|t | jd d |¡ S |   || j¡dkrX|t | jd d |¡ S |S dS )z!Add an internal value to a stringr4   r   ÚHé   ÚQN)r   r   ÚstructÚpackr,   )r$   r!   ÚsÚvalr%   r%   r&   Úaddfield?   s
    zdot15d4AddressField.addfieldc              
   C   sœ   |   || j¡dkrH|dd … |  |t | jd d |d d… ¡d ¡fS |   || j¡dkr�|dd … |  |t | jd d |d d… ¡d ¡fS tdƒ‚d S )Nr4   r   r:   r;   r<   zimpossible case)r   r   Zm2ir=   Úunpackr,   Ú	Exception)r$   r!   r?   r%   r%   r&   ÚgetfieldH   s
    66zdot15d4AddressField.getfieldc                 C   sv   d}|j }|d u rtdƒ dS z| |¡}W qZW q tyV   |j d u rLY qZ|j }Y q0 q|dkrfdS |dkrrdS dS )Nr   z#No underlayer to guess address moder4   é   r;   )Ú
underlayerr   ÚgetfieldvalrC   )r$   r!   r"   ZaddrmodeZpkttopr%   r%   r&   r   P   s"    

z&dot15d4AddressField.lengthFromAddrMode)Nr   N)	Ú__name__Ú
__module__Ú__qualname__Ú	__slots__r)   r9   rA   rD   r   r%   r%   r%   r&   r   ,   s   
	r   c                   @   sä   e Zd ZdZedddƒedddddgƒedddddgƒed	ddddgƒed
ddddgƒeeddddddddœƒƒeddddddddœƒedddƒeddddddddœƒedddƒeeddƒƒgZdd„ Z	dd„ Z
d d!„ Zd"d#„ Zd$S )%ÚDot15d4z802.15.4Zfcf_reserved_1r   r/   Úfcf_panidcompressFTÚ
fcf_ackreqZfcf_pendingÚfcf_securityÚfcf_frametyperE   ZBeaconZDataZAckÚCommand©r   r/   r4   rE   Úfcf_srcaddrmoder4   ÚNoneÚReservedZShortÚLongÚfcf_frameverÚfcf_destaddrmodeZfcf_reserved_2Úseqnumc                 C   s
   |   d¡S )NzŽ802.15.4 %Dot15d4.fcf_frametype% ackreq(%Dot15d4.fcf_ackreq%) ( %Dot15d4.fcf_destaddrmode% -> %Dot15d4.fcf_srcaddrmode% ) Seq#%Dot15d4.seqnum%©Zsprintfr#   r%   r%   r&   Ú	mysummaryx   s    zDot15d4.mysummaryc                 C   sH   | j dkrtS | j dkrtS | j dkr*tS | j dkr8tS t | |¡S d S )Nr   r/   r4   rE   )rP   ÚDot15d4BeaconÚDot15d4DataÚ
Dot15d4AckÚ
Dot15d4Cmdr   Úguess_payload_class©r$   Úpayloadr%   r%   r&   r`   {   s    



zDot15d4.guess_payload_classc                 C   s6   t |tƒr2| jdkr2| j|jkr$dS |jdkr2dS dS )Nr4   r   r/   )Ú
isinstancerL   rP   rY   rN   )r$   Úotherr%   r%   r&   Úanswers‡   s    


zDot15d4.answersc                 C   sZ   | j dkrN| jdkrNd| _|d d… t| jd> | jd>  ƒ |dd …  | S || S d S )Nr4   r   r/   é   é   )rP   rX   r   rS   rW   ©r$   ÚpZpayr%   r%   r&   Ú
post_build�   s    
ÿ
þþzDot15d4.post_buildN)rH   rI   rJ   r*   r   r
   r   r   Úfields_descr[   r`   re   rj   r%   r%   r%   r&   rL   h   s"   


õ	rL   c                   @   s>   e Zd ZdZdZdZejedddd�g Zdd	„ Z	d
d„ Z
dS )Ú
Dot15d4FCSaw  
    This class is a drop-in replacement for the Dot15d4 class above, except
    it expects a FCS/checksum in the input, and produces one in the output.
    This provides the user flexibility, as many 802.15.4 interfaces will have an AUTO_CRC setting  # noqa: E501
    that will validate the FCS/CRC in firmware, and add it automatically when transmitting.  # noqa: E501
    z802.15.4 - FCSTÚfcsNr   )r,   c                 C   sl   d}t dt|ƒƒD ]L}t|| ƒ}||A d@ }|d |d A }||d A d@ }|d |d A }qt d|¡S )Nr   é   é   i�  r   )r8   r5   r   r=   r>   )r$   ÚdataÚcrcr1   ÚcÚqr%   r%   r&   Úcompute_fcs¦   s    zDot15d4FCS.compute_fcsc                 C   s6   t  | ||¡}| jd u r2|d d… }||  |¡ }|S )Néþÿÿÿ)rL   rj   rm   rt   rh   r%   r%   r&   rj   µ   s
    
zDot15d4FCS.post_build)rH   rI   rJ   Ú__doc__r*   Zmatch_subclassrL   rk   r   rt   rj   r%   r%   r%   r&   rl   ›   s   rl   c                   @   s   e Zd ZdZg ZdS )r^   z802.15.4 AckN)rH   rI   rJ   r*   rk   r%   r%   r%   r&   r^   ¾   s   r^   c                   @   sž   e Zd ZdZedddƒedddddd	d
dœƒeddddddddddddœƒeddƒeeddƒdd„ feddƒdd„ fge	dddd�ƒe
eddƒdd„ ƒgZd S )!ÚDot15d4AuxSecurityHeaderz"802.15.4 Auxiliary Security HeaderZsec_sc_reservedr   rE   Úsec_sc_keyidmoder4   ZImplicitZ
1oKeyIndexz4o-KeySource-1oKeyIndexz8o-KeySource-1oKeyIndexrR   Zsec_sc_seclevelrT   zMIC-32zMIC-64zMIC-128ZENCz
ENC-MIC-32z
ENC-MIC-64zENC-MIC-128)r   r/   r4   rE   rg   é   rf   r-   Zsec_framecounterZsec_keyid_keysourcec                 C   s   |   d¡dkS )Nrx   r4   ©rG   ©r!   r%   r%   r&   r'   Ö   r(   z!Dot15d4AuxSecurityHeader.<lambda>c                 C   s   |   d¡dkS )Nrx   rE   rz   r{   r%   r%   r&   r'   Ù   r(   Ú )ÚlengthZsec_keyid_keyindexéÿ   c                 C   s   |   d¡dkS )Nrx   r   rz   r{   r%   r%   r&   r'   Ý   r(   N)rH   rI   rJ   r*   r   r
   r   r   r   r   r   r   rk   r%   r%   r%   r&   rw   Ã   s*   
ÿÿÿûù	
ÿérw   c                	   @   sv   e Zd ZdZeddƒedddd�eeddƒd	d
„ ƒeedddd�dd
„ ƒeedeƒ eƒdd
„ ƒgZ	dd„ Z
dd„ ZdS )r]   z802.15.4 DataÚ
dest_panidéÿÿ  Ú	dest_addrrX   ©r   Ú	src_panidr   c                 C   s   t | ƒS r   ©Úutil_srcpanid_presentr{   r%   r%   r&   r'   ç   r(   zDot15d4Data.<lambda>Úsrc_addrNrS   c                 C   s   | j  d¡dkS ©NrS   r   ©rF   rG   r{   r%   r%   r&   r'   é   r(   Úaux_sec_headerc                 C   s   | j  d¡du S ©NrO   Trˆ   r{   r%   r%   r&   r'   ì   r(   c                 C   s`   ddl m} ddlm} tjdkr&|S tjdkr4|S tjd u rDd}nd}t|d d	 ƒ |S d S )
Nr   )Ú	SixLoWPAN)Ú	ZigbeeNWKZ	sixlowpanZzigbeez\Please set conf.dot15d4_protocol to select a 802.15.4 protocol. Values must be in the list: z0Unknown conf.dot15d4_protocol value: must be in z['sixlowpan', 'zigbee']z Defaulting to SixLoWPAN)Zscapy.layers.sixlowpanr‹   Zscapy.layers.zigbeerŒ   r   Zdot15d4_protocolr   )r$   rb   r‹   rŒ   Z_msgr%   r%   r&   r`   ï   s    


ÿþzDot15d4Data.guess_payload_classc                 C   s
   |   d¡S )Nzt802.15.4 Data ( %Dot15d4Data.src_panid%:%Dot15d4Data.src_addr% -> %Dot15d4Data.dest_panid%:%Dot15d4Data.dest_addr% )rZ   r#   r%   r%   r&   r[     s    zDot15d4Data.mysummary)rH   rI   rJ   r*   r   r   r   r   rw   rk   r`   r[   r%   r%   r%   r&   r]   á   s   
ÿÿÿør]   c                   @   sJ  e Zd ZdZeddƒedddd�eedeƒ eƒd	d
„ ƒe	dddƒe	dddƒe
dddddgƒe
dddddgƒe	dddƒe
dddddgƒe	dddƒe
dddddgƒe	dddƒe	dddƒee	dddƒdd
„ ƒee	dddƒdd
„ ƒe	d ddƒe	d!ddƒe	d"ddƒe	d#ddƒed$g ed%dƒd&d
„ d'�ed(g ed%dd)d
„ d*�d+d
„ d'�gZd,d-„ ZdS ).r\   z802.15.4 Beaconrƒ   r   r†   NrS   r‚   r‰   c                 C   s   | j  d¡du S rŠ   rˆ   r{   r%   r%   r&   r'     r(   zDot15d4Beacon.<lambda>Z
sf_sforderrn   rg   Zsf_beaconorderZsf_assocpermitr/   FTZsf_pancoordZsf_reservedZsf_battlifeextendZsf_finalcapslotZgts_spec_permitZgts_spec_reservedÚgts_spec_desccountrE   Zgts_dir_reservedc                 C   s   |   d¡dkS ©Nr�   r   rz   r{   r%   r%   r&   r'      r(   Zgts_dir_maskr-   c                 C   s   |   d¡dkS rŽ   rz   r{   r%   r%   r&   r'   !  r(   Zpa_reserved_1Úpa_num_longZpa_reserved_2Úpa_num_shortZpa_short_addressesr|   c                 C   s   | j S r   )r�   r{   r%   r%   r&   r'   .  r(   )Z
count_fromZpa_long_addressesc                 C   s   dS )Nr;   r%   r    r%   r%   r&   r'   0  r(   )r   c                 C   s   | j S r   )r�   r{   r%   r%   r&   r'   1  r(   c                 C   s
   |   d¡S )Nz˜802.15.4 Beacon ( %Dot15d4Beacon.src_panid%:%Dot15d4Beacon.src_addr% ) assocPermit(%Dot15d4Beacon.sf_assocpermit%) panCoord(%Dot15d4Beacon.sf_pancoord%)rZ   r#   r%   r%   r&   r[   5  s    zDot15d4Beacon.mysummary)rH   rI   rJ   r*   r   r   r   r   rw   r   r
   r   rk   r[   r%   r%   r%   r&   r\     s@   ÿ









þþÛ+r\   c                   @   s”   e Zd ZdZeddƒedddd�eeddƒd	d
„ ƒeedddd�dd
„ ƒeedeƒ eƒdd
„ ƒe	ddddddddddddœ	ƒgZ
dd„ Zdd„ ZdS ) r_   z802.15.4 Commandr   r€   r�   r   rX   r‚   rƒ   c                 C   s   t | ƒS r   r„   r{   r%   r%   r&   r'   @  r(   zDot15d4Cmd.<lambda>r†   NrS   c                 C   s   | j  d¡dkS r‡   rˆ   r{   r%   r%   r&   r'   C  r(   r‰   c                 C   s   | j  d¡du S rŠ   rˆ   r{   r%   r%   r&   r'   F  r(   Úcmd_idZAssocReqZ	AssocRespZDisassocNotifyZDataReqZPANIDConflictNotifyZOrphanNotifyZ	BeaconReqZCoordRealignZGTSReq)	r/   r4   rE   rg   ry   rf   r-   r;   é	   c                 C   s
   |   d¡S )Nz†802.15.4 Command %Dot15d4Cmd.cmd_id% ( %Dot15dCmd.src_panid%:%Dot15d4Cmd.src_addr% -> %Dot15d4Cmd.dest_panid%:%Dot15d4Cmd.dest_addr% )rZ   r#   r%   r%   r&   r[   V  s    zDot15d4Cmd.mysummaryc                 C   sV   | j dkrtS | j dkrtS | j dkr*tS | j dkr8tS | j dkrFtS t | |¡S d S )Nr/   r4   rE   r;   r’   )r‘   ÚDot15d4CmdAssocReqÚDot15d4CmdAssocRespÚDot15d4CmdDisassociationÚDot15d4CmdCoordRealignÚDot15d4CmdGTSReqr   r`   ra   r%   r%   r&   r`   [  s    




zDot15d4Cmd.guess_payload_class)rH   rI   rJ   r*   r   r   r   r   rw   r   rk   r[   r`   r%   r%   r%   r&   r_   9  s8   
ÿÿþÿ÷ôr_   c                   @   sD   e Zd ZdZeddƒeddƒeddƒeddƒgZdd	„ Zd
d„ ZdS )r–   z$802.15.4 Coordinator Realign CommandZpanidr€   Zcoord_addressr   ZchannelZdev_addressc                 C   s
   |   d¡S )Nzz802.15.4 Coordinator Realign Payload ( PAN ID: %Dot15dCmdCoordRealign.pan_id% : channel %Dot15d4CmdCoordRealign.channel% )rZ   r#   r%   r%   r&   r[   w  s    z Dot15d4CmdCoordRealign.mysummaryc                 C   s    t |ƒdkrtS t | |¡S d S )Nr/   )r5   ÚDot15d4CmdCoordRealignPager   r`   ra   r%   r%   r&   r`   z  s    z*Dot15d4CmdCoordRealign.guess_payload_classN)	rH   rI   rJ   r*   r   r   rk   r[   r`   r%   r%   r%   r&   r–   j  s   ør–   c                   @   s   e Zd ZdZeddƒgZdS )r˜   z!802.15.4 Coordinator Realign PageZchannel_pager   N)rH   rI   rJ   r*   r   rk   r%   r%   r%   r&   r˜   �  s   ÿr˜   c                 C   s,   | j  d¡dkr$| j  d¡dkr$dS dS dS )zeA source PAN ID is included if and only if both src addr mode != 0 and PAN ID Compression in FCF == 0rS   r   rM   TFNrˆ   r{   r%   r%   r&   r…   ‹  s     r…   c                   @   sl   e Zd ZdZedddƒedddƒedddƒedddƒedddƒed	ddƒed
ddƒedddƒgZdd„ ZdS )r“   z$802.15.4 Association Request PayloadZallocate_addressr   r/   Zsecurity_capabilityZ	reserved2Z	reserved1Zreceiver_on_when_idleZpower_sourceZdevice_typeZalternate_pan_coordinatorc                 C   s
   |   d¡S )Nz”802.15.4 Association Request Payload ( Alt PAN Coord: %Dot15d4CmdAssocReq.alternate_pan_coordinator% Device Type: %Dot15d4CmdAssocReq.device_type% )rZ   r#   r%   r%   r&   r[      s    zDot15d4CmdAssocReq.mysummaryN©rH   rI   rJ   r*   r   rk   r[   r%   r%   r%   r&   r“   “  s   







ør“   c                   @   s6   e Zd ZdZeddƒedddddd	œƒgZd
d„ ZdS )r”   z%802.15.4 Association Response PayloadZshort_addressr€   Zassociation_statusr   Z
successfulZPAN_at_capacityZPAN_access_denied)r   r/   r4   c                 C   s
   |   d¡S )Nzœ802.15.4 Association Response Payload ( Association Status: %Dot15d4CmdAssocResp.association_status% Assigned Address: %Dot15d4CmdAssocResp.short_address% )rZ   r#   r%   r%   r&   r[   ±  s    zDot15d4CmdAssocResp.mysummaryN)rH   rI   rJ   r*   r   r   rk   r[   r%   r%   r%   r&   r”   ¤  s
   ør”   c                   @   s,   e Zd ZdZedddddœƒgZdd„ Zd	S )
r•   z,802.15.4 Disassociation Notification PayloadZdisassociation_reasonr4   Zcoord_wishes_device_to_leaveZdevice_wishes_to_leave)r/   r4   c                 C   s
   |   d¡S )Nzw802.15.4 Disassociation Notification Payload ( Disassociation Reason %Dot15d4CmdDisassociation.disassociation_reason% )rZ   r#   r%   r%   r&   r[   Á  s    z"Dot15d4CmdDisassociation.mysummaryN)rH   rI   rJ   r*   r   rk   r[   r%   r%   r%   r&   r•   µ  s   ù
r•   c                   @   sD   e Zd ZdZedddƒedddƒedddƒeddd	ƒgZd
d„ ZdS )r—   z802.15.4 GTS request commandÚreservedr   r4   Zcharact_typer/   Zgts_dirZgts_lenrg   c                 C   s
   |   d¡S )NzX802.15.4 GTS Request Command ( %Dot15d4CmdGTSReq.gts_len% : %Dot15d4CmdGTSReq.gts_dir% )rZ   r#   r%   r%   r&   r[   Ó  s    zDot15d4CmdGTSReq.mysummaryNr™   r%   r%   r%   r&   r—   Å  s   



÷r—   )rP   r/   r4   rE   )1rv   r=   Zscapy.compatr   r   Zscapy.errorr   Zscapy.configr   Z
scapy.datar   r   Zscapy.packetr   r	   Zscapy.fieldsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rL   rl   r^   rw   r]   r\   r_   r–   r˜   r…   r“   r”   r•   r—   Zl2typesÚregisterr%   r%   r%   r&   Ú<module>
   s8   H<3#'11
