
    h6                     |   d 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
mZmZmZ ddlmZmZmZ ddlmZ ddlmZmZmZmZ dd	lmZ d
Z G d de          Zd Zd 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' 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/ d0e          Z. G d1 d2e          Z/ej0        e ej1        e!ej2        e"e#d3ej3        e$e%d3ej4        e&ej5        e'ej6        e(ej7        e)ej8        e*ej9        e+ej:        e,ej;        e-ej<        e.iZ=d4S )5a  
    TZSP - TaZmen Sniffer Protocol
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    :author:    Thomas Tannhaeuser, hecke@naberius.de

    :description:

        This module provides Scapy layers for the TZSP protocol.

        references:
            - https://en.wikipedia.org/wiki/TZSP
            - https://web.archive.org/web/20050404125022/http://www.networkchemistry.com/support/appnotes/an001_tzsp.html  # noqa: E501

    :NOTES:
        - to allow Scapy to dissect this layer automatically, you need to bind the TZSP layer to UDP using  # noqa: E501
          the default TZSP port (0x9090), e.g.

            bind_layers(UDP, TZSP, sport=TZSP_PORT_DEFAULT)
            bind_layers(UDP, TZSP, dport=TZSP_PORT_DEFAULT)

        - packet format definition from www.networkchemistry.com is different from the one given by wikipedia  # noqa: E501
        - seems Wireshark implements the wikipedia protocol version (didn't dive into their code)  # noqa: E501
        - observed (miss)behavior of Wireshark (2.2.6)
          - fails to decode RSSI & SNR using short values - only one byte taken
          - SNR is labeled as silence
          - WlanRadioHdrSerial is labeled as Sensor MAC
          - doesn't know the packet count tag (40 / 0x28)

    )orb)AVSWLANHeader)warningScapy_Exception)	ByteFieldShortEnumFieldIntFieldFieldLenFieldYesNoByteField)PacketDot11PrismHeader)Ether)StrLenFieldByteEnumField
ShortFieldXStrLenField)Rawi  c            
           e Zd ZdZdZdZdxZZdZedededed	ed
iZ	dZ
dZdZdZe
dededediZe
eeeeeeeiZ edd           edee	           ede
e          gZd Zd Zd ZdS )TZSPr               	RX_PACKET	TX_PACKETCONFIGzKEEPALIVE/NULLPORT   w      ETHERNETzIEEE 802.11zPRISM HEADERzWLAN AVSversiontypeencapsulated_protocolc                     	 t           j        | j                 S # t          $ r! t	          d| j        z             t
          cY S w xY w)z
        get the class that holds the encapsulated payload of the TZSP packet
        :return: class representing the payload, Raw() on error
        zGunknown or invalid encapsulation type (%i) - returning payload as raw())r   ENCAPSULATED_PROTOCOL_CLASSESr%   KeyErrorr   r   )selfs    V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/tzsp.pyget_encapsulated_payload_classz#TZSP.get_encapsulated_payload_class[   s]    	5d6PQQ 	 	 	Y\`\vvx x xJJJ	s    (AAc                     | j         t          j        k    r3t          |          rt	          dt          |                     t
          S t          |          S )Nz+payload (%i bytes) in KEEPALIVE/NULL packet)r$   r   TYPE_KEEPALIVElenr   r   _tzsp_guess_next_tagr)   payloads     r*   guess_payload_classzTZSP.guess_payload_classh   sQ    9+++7|| &EG& & &J'000    c                     | j         t          j        k    p| j         t          j        k    }|r*| j                            t                    }|r|j        S d S d S N)r$   r   TYPE_RX_PACKETTYPE_TX_PACKETr1   getlayer
TZSPTagEnd)r)   has_encapsulated_dataend_tag_lyrs      r*   get_encapsulated_payloadzTZSP.get_encapsulated_payloadq   s_     $	T-@ @ dDIQUQdDd  	,//
;;K "**t	 	r3   N)__name__
__module____qualname__r6   r7   TYPE_CONFIGr-   	TYPE_NULL	TYPE_PORTTYPESENCAPSULATED_ETHERNETENCAPSULATED_IEEE_802_11ENCAPSULATED_PRISM_HEADERENCAPSULATED_WLAN_AVSENCAPSULATED_PROTOCOLSr   r   r   r   r'   r   r   r   fields_descr+   r2   r<    r3   r*   r   r   3   s       NNK!%%NYI 	X#6E !# $  	z -!>z	 	u %!;}	%! 		)T""fne44.0EG]^^K  1 1 1	 	 	 	 	r3   r   c                     t          |           }|dk     rt          d|           t          S t          | d                   }|dz   |k    }|st          d|           t          S t          d|           t          S )N   zSinvalid or unknown tag type (%i) and too short packet - treat remaining data as Rawr   z invalid or unknown tag type (%i))r.   r   r   r   TZSPTagUnknown)r1   tag_typepayload_lentag_data_lengthtag_data_fits_in_payloads        r*   _tzsp_handle_unknown_tagrR   }   s    g,,KQ ./7	9 	9 	9
'!*ooO /! 3C#  ./7	9 	9 	9
.999r3   c                    | st          d           dS t          | d                   }	 t          |         }n # t          $ r t	          | |          cY S w xY wt          |          t          ur|S 	 t          | d                   }n# t          $ r d}Y nw xY w|st          d           t          S 	 ||         S # t          $ r t          d||           t          cY S w xY w)zg
    :return: class representing the next tag, Raw on error, None on missing payload  # noqa: E501
    zmissing payloadNr   r   z&no tag length given - packet too shortz%invalid tag length %s for tag type %s)	r   r   _TZSP_TAG_CLASSESr(   rR   r$   dict
IndexErrorr   )r1   rN   tag_class_definitionlengths       r*   r/   r/      s.   
  !"""t71:H;0: ; ; ;':::::;  !!--##WQZ     8999
#F++   7JJJ


s3   8 AA1B BB2B: :"CCc                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZedededededede	de
dededededediZd ZdS )_TZSPTagr   r   
                     r   (   )   <   PADDINGENDRAW_RSSISNR	DATA_RATE	TIMESTAMPCONTENTION_FREE	DECRYPTED	FCS_ERROR
RX_CHANNELPACKET_COUNTRX_FRAME_LENGTHWLAN_RADIO_HDR_SERIALc                      t          |          S r5   )r/   r0   s     r*   r2   z_TZSPTag.guess_payload_class   s    #G,,,r3   N)r=   r>   r?   TAG_TYPE_PADDINGTAG_TYPE_ENDTAG_TYPE_RAW_RSSITAG_TYPE_SNRTAG_TYPE_DATA_RATETAG_TYPE_TIMESTAMPTAG_TYPE_CONTENTION_FREETAG_TYPE_DECRYPTEDTAG_TYPE_FCS_ERRORTAG_TYPE_RX_CHANNELTAG_TYPE_PACKET_COUNTTAG_TYPE_RX_FRAME_LENGTHTAG_TYPE_WLAN_RADIO_HDR_SERIAL	TAG_TYPESr2   rJ   r3   r*   rZ   rZ      s        LL# #%)" 	)e:eKK "3KK\~ "3&(?I - - - - -r3   rZ   c                       e Zd ZdS )TZSPStructureExceptionN)r=   r>   r?   rJ   r3   r*   r   r      s        Dr3   r   c                   B    e Zd ZdZ edej        ej                  gZdS )TZSPTagPaddingz)
    padding tag (should be ignored)
    r$   N)	r=   r>   r?   __doc__r   rZ   rs   r   rI   rJ   r3   r*   r   r      s8          	fh79KLLKKKr3   r   c                   H    e Zd ZdZ edej        ej                  gZd Z	dS )r9   z
    last tag
    r$   c                     | j         }d}|r!t          |t                    r|}n	|j         }|!|r|                                S t	          d          )z
        the type of the payload encapsulation is given be the outer TZSP layers attribute encapsulation_protocol  # noqa: E501
        Nzmissing parent TZSP header)
underlayer
isinstancer   r+   r   )r)   r1   under_layertzsp_headers       r*   r2   zTZSPTagEnd.guess_payload_class   sp    
 o 	1+t,, )%0K	  	1  	G==???()EFFFr3   N)
r=   r>   r?   r   r   rZ   rt   r   rI   r2   rJ   r3   r*   r9   r9      sR          	fh3X5GHHKG G G G Gr3   r9   c                   n    e Zd ZdZ edej        ej                   edd           edd          gZ	dS )TZSPTagRawRSSIBytez?
    relative received signal strength - signed byte value
    r$   r.   r   raw_rssir   N)
r=   r>   r?   r   r   rZ   ru   r   r   rI   rJ   r3   r*   r   r     sV          	fh8(:LMM	%	*a  KKKr3   r   c                   n    e Zd ZdZ edej        ej                   edd           e	dd          gZ
dS )TZSPTagRawRSSIShortz@
    relative received signal strength - signed short value
    r$   r.   rL   r   r   N)r=   r>   r?   r   r   rZ   ru   r   r   r   rI   rJ   r3   r*   r   r     sV          	fh8(:LMM	%
:q!!KKKr3   r   c                   n    e Zd ZdZ edej        ej                   edd           edd          gZ	dS )TZSPTagSNRBytez0
    signal noise ratio - signed byte value
    r$   r.   r   snrr   N)
r=   r>   r?   r   r   rZ   rv   r   r   rI   rJ   r3   r*   r   r     sV          	fh3X5GHH	%	%KKKr3   r   c                   n    e Zd ZdZ edej        ej                   edd           e	dd          gZ
dS )TZSPTagSNRShortz1
    signal noise ratio - signed short value
    r$   r.   rL   r   r   N)r=   r>   r?   r   r   rZ   rv   r   r   r   rI   rJ   r3   r*   r   r   &  sV          	fh3X5GHH	%
5!KKKr3   r   c                   2   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZi ededededede	de
dededededed ed!ed"ed#ed$ed%ed&ed'iZ ed(ej        ej                   ed)d*           ed+ee          gZd,S )-TZSPTagDataRatez!
    wireless link data rate
    r   rL   r   r\   r]   r         $   ,   0   B   H   `   l   r[      7   n   unknownz1 MB/sz2 MB/sz5.5 MB/sz6 MB/sz9 MB/sz11 MB/sz12 MB/sz18 MB/sz22 MB/sz24 MB/sz33 MB/sz36 MB/sz48 MB/sz54 MB/sz1 MB/s (legacy)z2 MB/s (legacy)z5.5 MB/s (legacy)z11 MB/s (legacy)r$   r.   r   	data_rateN)r=   r>   r?   r   DATA_RATE_UNKNOWNDATA_RATE_1DATA_RATE_2DATA_RATE_5_5DATA_RATE_6DATA_RATE_9DATA_RATE_11DATA_RATE_12DATA_RATE_18DATA_RATE_22DATA_RATE_24DATA_RATE_33DATA_RATE_36DATA_RATE_48DATA_RATE_54DATA_RATE_LEGACY_1DATA_RATE_LEGACY_2DATA_RATE_LEGACY_5_5DATA_RATE_LEGACY_11
DATA_RATESr   rZ   rw   r   r   rI   rJ   r3   r*   r   r   1  s         KKMKKLLLLLLLLL9X 	X 	z	
 	X 	X 	i 	i 	i 	i 	i 	i 	i 	i 	i  	-!" 	-#$ 	1/' J. 	fh98;MNN	%k#4jAAKKKr3   r   c                   n    e Zd ZdZ edej        ej                   edd           e	dd          gZ
dS )TZSPTagTimestampz
    MAC receive timestamp
    r$   r.   r   	timestampr   N)r=   r>   r?   r   r   rZ   rx   r   r   r	   rI   rJ   r3   r*   r   r   f  sV          	fh98;MNN	%a  KKKr3   r   c                   v    e Zd ZdZdZdZ edej        ej	                   e
dd           ede          gZdS )TZSPTagContentionFreez3
    packet received in contention free period
    r   r   r$   r.   contention_freeN)r=   r>   r?   r   NOYESr   rZ   ry   r   r   r   rI   rJ   r3   r*   r   r   q  sc          
B
C 	fh?ASTT	%("--KKKr3   r   c            	           e Zd ZdZdZdZ edej        ej	                   e
dd           edeeedfd	          gZd
S )TZSPTagDecryptedz
    packet was decrypted
    r   r   r$   r.   	decrypted   )yesnoconfigN)r=   r>   r?   r   r   r   r   rZ   rz   r   r   r   rI   rJ   r3   r*   r   r     ss          C	B 	fh98;MNN	%{Bs2t*/M/MNNNKKKr3   r   c            
           e Zd ZdZdZdZ edej        ej	                   e
dd           edeeeedz   dfd	          gZd
S )TZSPTagErrorz
    frame checksum error
    r   r   r$   r.   	fcs_errorr   )r   r   reservedr   N)r=   r>   r?   r   r   r   r   rZ   r{   r   r   r   rI   rJ   r3   r*   r   r     s~          
B
C 	fh98;MNN	%{BbSVYZSZ\`Ra/b/bcccKKKr3   r   c                   n    e Zd ZdZ edej        ej                   edd           edd          gZ	dS )TZSPTagRXChannelz=
    channel the sensor was on while receiving the frame
    r$   r.   r   
rx_channelr   N)
r=   r>   r?   r   r   rZ   r|   r   r   rI   rJ   r3   r*   r   r     sV          	fh:H<NOO	%	,""KKKr3   r   c                   n    e Zd ZdZ edej        ej                   edd           e	dd          gZ
dS )TZSPTagPacketCountz
    packet counter
    r$   r.   r   packet_countr   N)r=   r>   r?   r   r   rZ   r}   r   r   r	   rI   rJ   r3   r*   r   r     sV          	fh<h>PQQ	%##KKKr3   r   c                   n    e Zd ZdZ edej        ej                   edd           e	dd          gZ
dS )TZSPTagRXFrameLengthz 
    received packet length
    r$   r.   rL   rx_frame_lengthr   N)r=   r>   r?   r   r   rZ   r~   r   r   r   rI   rJ   r3   r*   r   r     sW          	fh?ASTT	%
$a((KKKr3   r   c                   z    e Zd ZdZ edej        ej                   edddd           e	ddd	 
          gZ
dS )TZSPTagWlanRadioHdrSerialzH
    (vendor specific) unique capture device (sensor/AP) identifier
    r$   r.   N	sensor_idb	length_offmt c                     | j         S r5   r.   pkts    r*   <lambda>z"TZSPTagWlanRadioHdrSerial.<lambda>  s    CG r3   length_from)r=   r>   r?   r   r   rZ   r   r   r
   r   rI   rJ   r3   r*   r   r     sf          	fhExGYZZeT[cBBBK1C1CDDDKKKr3   r   c                   d    e Zd ZdZ edd           edddd           edd	d
           gZdS )rM   z 
    unknown tag type dummy
    r$   r   r.   Ndatar   r   r   c                     | j         S r5   r   r   s    r*   r   zTZSPTagUnknown.<lambda>  s     r3   r   )r=   r>   r?   r   r   r
   r   rI   rJ   r3   r*   rM   rM     s^          		&$eTV===VR-@-@AAAKKKr3   rM   )r   rL   N)>r   scapy.compatr   scapy.contrib.avsr   scapy.errorr   r   scapy.fieldsr   r   r	   r
   r   scapy.layers.dot11r   r   r   scapy.layers.l2r   r   r   r   r   scapy.packetr   TZSP_PORT_DEFAULTr   rR   r/   rZ   r   r   r9   r   r   r   r   r   r   r   r   r   r   r   r   r   rM   rs   rt   ru   rv   rw   rx   ry   rz   r{   r|   r}   r~   r   rT   rJ   r3   r*   <module>r      s   <       + + + + + + 0 0 0 0 0 0 0 0 [ [ [ [ [ [ [ [ [ [ [ [ [ [ 9 9 9 9 9 9 9 9 9 9 ! ! ! ! ! ! M M M M M M M M M M M M        G G G G G6 G G GT  ," " "J -  -  -  -  -v  -  -  -F	 	 	 	 	_ 	 	 	    X   G G G G G G G G:           (       X       h   2 2 2 2 2h 2 2 2j    x       H       x       8       x              8              X    ~:$6;N O O~/BB!1%'<!1 "2"$6%';+-F   r3   