
    hHS                        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
e          Z  G d de          Z! G d de!          Z" G d de          Z# G d de          Z$ G d de          Z% G d de          Z& G d de          Z' G d de          Z( G d de          Z)d Z* G d de          Z+ G d  d!e          Z, G d" d#e          Z- G d$ d%e          Z. ee!e&d&            ee!e%d'&            ee!e#d(&            ee!e'd)&           ej/        0                    e
e"           ej/        0                    e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                   6    e Zd ZddgZd
dZd Zd Zd Zd	 ZdS )dot15d4AddressFieldadjust	length_ofN<Hc                 n     t          j         |||           | _        |	| _        d S  fd _        d S )Nc                 0                         | |          S N)lengthFromAddrMode)pktxselfs     X/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/dot15d4.py<lambda>z.dot15d4AddressField.__init__.<locals>.<lambda>5   s    )@)@a)H)H     )r   __init__r   r   )r&   namedefaultr   fmtr   s   `     r'   r*   zdot15d4AddressField.__init__/   sE    tT7C000" DKKKHHHHDKKKr)   c           	      ^   t          t          |                     |                              dk     r#t          |                     |                    S d|                     |          z  d                    fdt	          dt                    d          D                       S )z/Convert internal value to a nice representation   z%016x:c                 :    g | ]}|         |d z            S )    ).0ir%   s     r'   
<listcomp>z.dot15d4AddressField.i2repr.<locals>.<listcomp>=   s.    TTT1qttQq1uXX6TTTr)   r      )lenhexi2mjoinrange)r&   r$   r%   s     `r'   i2reprzdot15d4AddressField.i2repr7   s    s488C##$$%%))txxQ''((($((3***A88TTTTaQQR@S@STTTUUUr)   c                    |                      || j                  dk    r&|t          j        | j        d         dz   |          z   S |                      || j                  dk    r&|t          j        | j        d         dz   |          z   S |S )z!Add an internal value to a stringr7   r   H   Q)r   r   structpackr-   )r&   r$   svals       r'   addfieldzdot15d4AddressField.addfield?   s    ;;sDN++q00v{48A;#4c::::[[dn--22v{48A;#4c::::Hr)   c           
         |                      || j                  dk    rO|dd          |                     |t          j        | j        d         dz   |d d                   d                   fS |                      || j                  dk    rO|dd          |                     |t          j        | j        d         dz   |d d                   d                   fS t          d          )Nr7   r   r?   r@   rA   zimpossible case)r   r   m2irB   unpackr-   	Exception)r&   r$   rD   s      r'   getfieldzdot15d4AddressField.getfieldH   s    ;;sDN++q00QRR5$((3dhqkC6G2A2(O(OPQ(RSSSS[[dn--22QRR5$((3dhqkC6G2A2(O(OPQ(RSSSS-...r)   c                     d}|j         }|t          d           dS 	 	 |                    |          }n!# t          $ r |j         Y n|j         }Y nw xY w8|dk    rdS |dk    rdS dS )Nr   z#No underlayer to guess address modeTr7      r@   )
underlayerr   getfieldvalrJ   )r&   r$   r%   addrmodepkttops        r'   r#   z&dot15d4AddressField.lengthFromAddrModeP   s    >9:::1	++!--a00 + + +$,E*+		+ q==1]]1qs   5 AAA)Nr   N)	__name__
__module____qualname__	__slots__r*   r=   rF   rK   r#   r3   r)   r'   r   r   ,   su        ;'II I I IV V V  / / /    r)   r   c                      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 Z	d Z
d Zd Zd S )!Dot15d4z802.15.4fcf_reserved_1r   r2   fcf_panidcompressFT
fcf_ackreqfcf_pendingfcf_securityfcf_frametyperM   BeaconDataAckCommandr   r2   r7   rM   fcf_srcaddrmoder7   NoneReservedShortLongfcf_frameverfcf_destaddrmodefcf_reserved_2seqnumc                 ,    |                      d          S )Nz802.15.4 %Dot15d4.fcf_frametype% ackreq(%Dot15d4.fcf_ackreq%) ( %Dot15d4.fcf_destaddrmode% -> %Dot15d4.fcf_srcaddrmode% ) Seq#%Dot15d4.seqnum%sprintfr&   s    r'   	mysummaryzDot15d4.mysummaryx   s!    ||  m  n  n  	nr)   c                     | j         dk    rt          S | j         dk    rt          S | j         dk    rt          S | j         dk    rt          S t          j        | |          S )Nr   r2   r7   rM   )r]   Dot15d4BeaconDot15d4Data
Dot15d4Ack
Dot15d4Cmdr	   guess_payload_classr&   payloads     r'   rv   zDot15d4.guess_payload_class{   se    %%  4''4''4''-dG<<<r)   c                     t          |t                    r*| j        dk    r| j        |j        k    rdS |j        dk    rdS dS )Nr7   r   r2   )
isinstancerW   r]   rk   rZ   )r&   others     r'   answerszDot15d4.answers   sN    eW%% 	!Q&&;%,..1%**1qr)   c                     | j         dk    rM| j        dk    rBd| _        |d d         t          | j        dz  | j        dz  z             z   |dd          z   |z   S ||z   S )Nr7   r   r2         )r]   ri   r   rc   rh   r&   ppays      r'   
post_buildzDot15d4.post_build   s~    ""t'<'A'A$%D!RaR5T)Q.43D3IJKKLABB%  s7Nr)   N)rR   rS   rT   r+   r   r   r   r   fields_descrp   rv   r|   r   r3   r)   r'   rW   rW   h   sv       D!1a(((!Q>>\1a%77]Aq5$-88^QE4=99\\/1aX&UW`1a1abbcc&1&ZGX^._._``A&&'A6jWY_/`/`aa!1a((YYx##$$Kn n n
= 
= 
=      r)   rW   c                   T    e Zd ZdZdZdZej         eddd          gz   Zd Z	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                     d}t          dt          |                    D ]@}t          ||                   }||z  dz  }|dz  |dz  z  }||dz  z  dz  }|dz  |dz  z  }At          j        d|          S )Nr         i  r   )r<   r8   r   rB   rC   )r&   datacrcr5   cqs         r'   compute_fcszDot15d4FCS.compute_fcs   s     q#d))$$ 	+ 	+ADGAqBA"9T*CRB&A"9T*CC{4%%%r)   c                     t                               | ||          }| j        "|d d         }||                     |          z   }|S )N)rW   r   r   r   r   s      r'   r   zDot15d4FCS.post_build   sK    tQ,,8#2#AD$$Q'''Ar)   )rR   rS   rT   __doc__r+   match_subclassrW   r   r   r   r   r3   r)   r'   r   r      si          DN%%4)H)H)H(IIK& & &    r)   r   c                       e Zd ZdZg ZdS )rt   z802.15.4 AckN)rR   rS   rT   r+   r   r3   r)   r'   rt   rt      s        DKKKr)   rt   c                   &   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 f edd          d fg e	ddd                     e
 edd          d           gZdS ) Dot15d4AuxSecurityHeaderz"802.15.4 Auxiliary Security Headersec_sc_reservedr   rM   sec_sc_keyidmoder7   Implicit
1oKeyIndexz4o-KeySource-1oKeyIndexz8o-KeySource-1oKeyIndexrb   sec_sc_seclevelrd   zMIC-32zMIC-64zMIC-128ENCz
ENC-MIC-32z
ENC-MIC-64zENC-MIC-128)r   r2   r7   rM   r      r~   r/   sec_framecountersec_keyid_keysourcec                 4    |                      d          dk    S )Nr   r7   rO   r$   s    r'   r(   z!Dot15d4AuxSecurityHeader.<lambda>       COO,>??1D r)   c                 4    |                      d          dk    S )Nr   rM   r   r   s    r'   r(   z!Dot15d4AuxSecurityHeader.<lambda>   r   r)    )lengthsec_keyid_keyindex   c                 4    |                      d          dk    S )Nr   r   r   r   s    r'   r(   z!Dot15d4AuxSecurityHeader.<lambda>   s    S__5G%H%HA%M r)   N)rR   rS   rT   r+   r   r   r   r   r   r   r   r   r   r3   r)   r'   r   r      sC       /D"Aq)) 	'Al/HMf0h 0h 	
 	
 	&1&X(W`ejo{  AM  R_  /`  /`  	a  	a&
33 	[.
;;DDF [.0BCCDDF
 12a@@@	B 	B 	$8$??MM	O 	O/KKKr)   r   c                       e Zd ZdZ edd           eddd           e edd          d	            e ed
dd          d            e ed e            e          d           gZ	d Z
d ZdS )rs   z802.15.4 Data
dest_panid  	dest_addrri   r   	src_panidr   c                      t          |           S r"   util_srcpanid_presentr   s    r'   r(   zDot15d4Data.<lambda>       $9#$>$> r)   src_addrNrc   c                 >    | j                             d          dk    S Nrc   r   rN   rO   r   s    r'   r(   zDot15d4Data.<lambda>       CN$>$>?P$Q$QUV$V r)   aux_sec_headerc                 :    | j                             d          du S Nr\   Tr   r   s    r'   r(   zDot15d4Data.<lambda>       CN$>$>~$N$NRV$V r)   c                     ddl m} ddlm} t          j        dk    r|S t          j        dk    r|S t          j        d}nd}t          |dz   d	z              |S )
Nr   )	SixLoWPAN)	ZigbeeNWK	sixlowpan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)scapy.layers.sixlowpanr   scapy.layers.zigbeer   r   dot15d4_protocolr   )r&   rx   r   r   _msgs        r'   rv   zDot15d4Data.guess_payload_class   s     	544444111111 K//"h..$,I JD-../ 0 0 0 r)   c                 ,    |                      d          S )Nzt802.15.4 Data ( %Dot15d4Data.src_panid%:%Dot15d4Data.src_addr% -> %Dot15d4Data.dest_panid%:%Dot15d4Data.dest_addr% )rm   ro   s    r'   rp   zDot15d4Data.mysummary  s!    ||  S  T  T  	Tr)   )rR   rS   rT   r+   r   r   r   r   r   r   rv   rp   r3   r)   r'   rs   rs      s        DlF++K;MNNN{C88>>	@ 	@,,ZIZ[[[VV	X 	X 	%57O7O7Q7QSkllVV	X 	X
K  *T T T T Tr)   rs   c                      e Zd ZdZ edd           eddd           e ed e            e          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            e e	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% &           ed'g  ed$dd( )          d* &          gZd+ ZdS ),rr   z802.15.4 Beaconr   r   r   Nrc   r   r   c                 :    | j                             d          du S r   r   r   s    r'   r(   zDot15d4Beacon.<lambda>  r   r)   
sf_sforderr   r   sf_beaconordersf_assocpermitr2   FTsf_pancoordsf_reservedsf_battlifeextendsf_finalcapslotgts_spec_permitgts_spec_reservedgts_spec_desccountrM   gts_dir_reservedc                 4    |                      d          dk    S Nr   r   r   r   s    r'   r(   zDot15d4Beacon.<lambda>   s    XlHmHmqrHr r)   gts_dir_maskr/   c                 4    |                      d          dk    S r   r   r   s    r'   r(   zDot15d4Beacon.<lambda>!  s    COOThDiDimnDn r)   pa_reserved_1pa_num_longpa_reserved_2pa_num_shortpa_short_addressesr   c                     | j         S r"   )r   r   s    r'   r(   zDot15d4Beacon.<lambda>.  s	    c.> r)   )
count_frompa_long_addressesc                     dS )Nr@   r3   )r$   r%   s     r'   r(   zDot15d4Beacon.<lambda>0  s     r)   )r   c                     | j         S r"   )r   r   s    r'   r(   zDot15d4Beacon.<lambda>1  s    co r)   c                 ,    |                      d          S )Nz802.15.4 Beacon ( %Dot15d4Beacon.src_panid%:%Dot15d4Beacon.src_addr% ) assocPermit(%Dot15d4Beacon.sf_assocpermit%) panCoord(%Dot15d4Beacon.sf_pancoord%)rm   ro   s    r'   rp   zDot15d4Beacon.mysummary5  s!    ||  w  x  x  	xr)   )rR   rS   rT   r+   r   r   r   r   r   r   r   r   r   rp   r3   r)   r'   rr   rr     sR       Dk3''J8IJJJ%57O7O7Q7QSkllVV	X 	X 	r1%%!2q))%q!eT];;]Aq5$-881%%(!Q>>"B** 	&1udm<<$a++%q!,,"4a;;=r=rss.!Q779n9noo 	!Q''1%%!Q''A&&+R$}R00">">	@ 	@ 	@ 	*B**2q9I9IJJJ"="=	? 	? 	?K)KVx x x x xr)   rr   c                      e Zd ZdZ edd           eddd           e edd          d	            e ed
dd          d            e ed e            e          d            e	dddddddddddd	          gZ
d Zd ZdS )ru   z802.15.4 Commandr   r   r   r   ri   r   r   c                      t          |           S r"   r   r   s    r'   r(   zDot15d4Cmd.<lambda>@  r   r)   r   Nrc   c                 >    | j                             d          dk    S r   r   r   s    r'   r(   zDot15d4Cmd.<lambda>C  r   r)   r   c                 :    | j                             d          du S r   r   r   s    r'   r(   zDot15d4Cmd.<lambda>F  r   r)   cmd_idAssocReq	AssocRespDisassocNotifyDataReqPANIDConflictNotifyOrphanNotify	BeaconReqCoordRealignGTSReq)	r2   r7   rM   r   r   r~   r/   r@   	   c                 ,    |                      d          S )Nz802.15.4 Command %Dot15d4Cmd.cmd_id% ( %Dot15dCmd.src_panid%:%Dot15d4Cmd.src_addr% -> %Dot15d4Cmd.dest_panid%:%Dot15d4Cmd.dest_addr% )rm   ro   s    r'   rp   zDot15d4Cmd.mysummaryV  s!    ||  e  f  f  	fr)   c                     | j         dk    rt          S | j         dk    rt          S | j         dk    rt          S | j         dk    rt          S | j         dk    rt
          S t          j        | |          S )Nr2   r7   rM   r@   r   )r   Dot15d4CmdAssocReqDot15d4CmdAssocRespDot15d4CmdDisassociationDot15d4CmdCoordRealignDot15d4CmdGTSReqr	   rv   rw   s     r'   rv   zDot15d4Cmd.guess_payload_class[  st    ;!%%[A&&[A++[A))[A##-dG<<<r)   )rR   rS   rT   r+   r   r   r   r   r   r   r   rp   rv   r3   r)   r'   ru   ru   9  s.       DlF++K8JKKK{C88>>	@ 	@,,Z#46 6 6VV	X 	X 	%57O7O7Q7QSkllVV	X 	Xh$$
 $
 	 	K6f f f
= = = = =r)   ru   c                   z    e Zd ZdZ edd           edd           edd           edd          gZd Zd	 Zd
S )r   z$802.15.4 Coordinator Realign Commandpanidr   coord_addressr   channeldev_addressc                 ,    |                      d          S )Nzz802.15.4 Coordinator Realign Payload ( PAN ID: %Dot15dCmdCoordRealign.pan_id% : channel %Dot15d4CmdCoordRealign.channel% )rm   ro   s    r'   rp   z Dot15d4CmdCoordRealign.mysummaryw  s!    ||  Y  Z  Z  	Zr)   c                 `    t          |          dk    rt          S t          j        | |          S )Nr2   )r8   Dot15d4CmdCoordRealignPager	   rv   rw   s     r'   rv   z*Dot15d4CmdCoordRealign.guess_payload_classz  s,    w<<1---dG<<<r)   N)	rR   rS   rT   r+   r   r   r   rp   rv   r3   r)   r'   r   r   j  s        1D 	gv&&ov..	)QmV,,	KZ Z Z= = = = =r)   r   c                   ,    e Zd ZdZ edd          gZdS )r   z!802.15.4 Coordinator Realign Pagechannel_pager   N)rR   rS   rT   r+   r   r   r3   r)   r'   r   r     s)        .D	.!$$KKKr)   r   c                     | j                             d          dk    r | j                             d          dk    r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 == 0rc   r   rY   TFr   r   s    r'   r   r     sD    ""#455::A[A[\oApAptuAuAutur)   c                       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 ZdS )r   z$802.15.4 Association Request Payloadallocate_addressr   r2   security_capability	reserved2	reserved1receiver_on_when_idlepower_sourcedevice_typealternate_pan_coordinatorc                 ,    |                      d          S )Nz802.15.4 Association Request Payload ( Alt PAN Coord: %Dot15d4CmdAssocReq.alternate_pan_coordinator% Device Type: %Dot15d4CmdAssocReq.device_type% )rm   ro   s    r'   rp   zDot15d4CmdAssocReq.mysummary  s!    ||  s  t  t  	tr)   NrR   rS   rT   r+   r   r   rp   r3   r)   r'   r   r     s        1D#Q**&1--a##a##(!Q//A&&1%%,a33	Kt t t t tr)   r   c            	       R    e Zd ZdZ edd           edddddd	          gZd
 ZdS )r   z%802.15.4 Association Response Payloadshort_addressr   association_statusr   
successfulPAN_at_capacityPAN_access_denied)r   r2   r7   c                 ,    |                      d          S )Nz802.15.4 Association Response Payload ( Association Status: %Dot15d4CmdAssocResp.association_status% Assigned Address: %Dot15d4CmdAssocResp.short_address% )rm   ro   s    r'   rp   zDot15d4CmdAssocResp.mysummary  s!    ||  {  |  |  	|r)   N)rR   rS   rT   r+   r   r   r   rp   r3   r)   r'   r   r     sc        2Dov.. 	*DlGX]p2q2qrr	K| | | | |r)   r   c                   :    e Zd ZdZ eddddd          gZd ZdS )	r   z,802.15.4 Disassociation Notification Payloaddisassociation_reasonr7   coord_wishes_device_to_leavedevice_wishes_to_leave)r2   r7   c                 ,    |                      d          S )Nzw802.15.4 Disassociation Notification Payload ( Disassociation Reason %Dot15d4CmdDisassociation.disassociation_reason% )rm   ro   s    r'   rp   z"Dot15d4CmdDisassociation.mysummary  s!    ||  V  W  W  	Wr)   N)rR   rS   rT   r+   r   r   rp   r3   r)   r'   r   r     sR        9D 	-t9W\t5u5uvvKW W W W Wr)   r   c                   |    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
 ZdS )r   z802.15.4 GTS request commandreservedr   r7   charact_typer2   gts_dirgts_lenr   c                 ,    |                      d          S )NzX802.15.4 GTS Request Command ( %Dot15d4CmdGTSReq.gts_len% : %Dot15d4CmdGTSReq.gts_dir% )rm   ro   s    r'   rp   zDot15d4CmdGTSReq.mysummary  s    ||vwwwr)   Nr  r3   r)   r'   r   r     sz        )D 	Q""A&&Aq!!Aq!!
Kx x x x xr)   r   )r]   r2   r7   rM   )1r   rB   scapy.compatr   r   scapy.errorr   scapy.configr   
scapy.datar   r   scapy.packetr	   r
   scapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rW   r   rt   r   rs   rr   ru   r   r   r   r   r   r   r   l2typesregisterr3   r)   r'   <module>r)     sc     ! ! ! ! ! ! ! !             G G G G G G G G , , , , , , , ,                                   ,7 7 7 7 7% 7 7 7x0 0 0 0 0f 0 0 0f               F       
    v   <$T $T $T $T $T& $T $T $TN.x .x .x .x .xF .x .x .xb.= .= .= .= .= .= .= .=b= = = = =V = = =.         t t t t t t t t"| | | | |& | | |"W W W W Wv W W W x x x x xv x x x, G]! 4 4 4 4 G[ 2 2 2 2 GZq 1 1 1 1 GZq 1 1 1 1   .
 ; ; ;   ,g 6 6 6 6 6r)   