a
    kÄ#d�6  ã                   @   s2  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„ deƒZdd„ 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!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+G d-d.„ d.eƒZ,G d/d0„ d0eƒZ-G d1d2„ d2eƒZ.G d3d4„ d4eƒZ/ej0e ej1e!ej2e"e#d5œej3e$e%d5œej4e&ej5e'ej6e(ej7e)ej8e*ej9e+ej:e,ej;e-ej<e.iZ=d6S )7aÜ  
    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                
   @   s¬   e Zd ZdZdZdZd 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d„ Zdd„ Zdd„ ZdS )ÚTZSPr   é   é   é   é   Z	RX_PACKETZ	TX_PACKETZCONFIGzKEEPALIVE/NULLZPORTé   éw   é   ZETHERNETzIEEE 802.11zPRISM HEADERzWLAN AVSÚversionÚtypeÚencapsulated_protocolc                 C   s8   zt j| j W S  ty2   td| j ƒ t Y S 0 dS )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()N)r   ÚENCAPSULATED_PROTOCOL_CLASSESr   ÚKeyErrorr   r   )Úself© r"   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/tzsp.pyÚget_encapsulated_payload_class[   s    ÿz#TZSP.get_encapsulated_payload_classc                 C   s2   | j tjkr&t|ƒr"tdt|ƒƒ tS t|ƒS d S )Nz+payload (%i bytes) in KEEPALIVE/NULL packet)r   r   ÚTYPE_KEEPALIVEÚlenr   r   Ú_tzsp_guess_next_tag©r!   Úpayloadr"   r"   r#   Úguess_payload_classh   s    ÿzTZSP.guess_payload_classc                 C   s:   | j tjkp| j tjk}|r6| j t¡}|r2|jS d S d S ©N)r   r   ÚTYPE_RX_PACKETÚTYPE_TX_PACKETr)   ZgetlayerÚ
TZSPTagEnd)r!   Zhas_encapsulated_dataZend_tag_lyrr"   r"   r#   Úget_encapsulated_payloadq   s    zTZSP.get_encapsulated_payloadN)Ú__name__Ú
__module__Ú__qualname__r,   r-   ZTYPE_CONFIGr%   Z	TYPE_NULLZ	TYPE_PORTÚTYPESZENCAPSULATED_ETHERNETZENCAPSULATED_IEEE_802_11ZENCAPSULATED_PRISM_HEADERZENCAPSULATED_WLAN_AVSZENCAPSULATED_PROTOCOLSr   r   r   r   r   r   r   r   Úfields_descr$   r*   r/   r"   r"   r"   r#   r   3   s@   ûüü

ý	r   c                 C   sV   t | ƒ}|dk rtd|ƒ tS t| d ƒ}|d |k}|sHt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)r)   Útag_typeZpayload_lenZtag_data_lengthZtag_data_fits_in_payloadr"   r"   r#   Ú_tzsp_handle_unknown_tag}   s    ÿÿ
r8   c                 C   sÀ   | st dƒ dS t| d ƒ}zt| }W n tyD   t| |ƒ Y S 0 t|ƒturV|S zt| d ƒ}W n ty|   d}Y n0 |sŽt dƒ tS z
|| W S  tyº   t d||ƒ t Y S 0 dS )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    r8   r   ÚdictÚ
IndexErrorr   )r)   r7   Ztag_class_definitionÚlengthr"   r"   r#   r'   “   s,    

r'   c                   @   s€   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d„ ZdS )Ú_TZSPTagr   r   é
   é   é   é   é   é   é   r   é(   é)   é<   ZPADDINGZENDZRAW_RSSIZSNRZ	DATA_RATEÚ	TIMESTAMPZCONTENTION_FREEZ	DECRYPTEDZ	FCS_ERRORZ
RX_CHANNELZPACKET_COUNTZRX_FRAME_LENGTHZWLAN_RADIO_HDR_SERIALc                 C   s   t |ƒS r+   )r'   r(   r"   r"   r#   r*   ×   s    z_TZSPTag.guess_payload_classN)r0   r1   r2   Ú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_TYPESr*   r"   r"   r"   r#   r=   ¸   s8   ór=   c                   @   s   e Zd ZdS )ÚTZSPStructureExceptionN)r0   r1   r2   r"   r"   r"   r#   rW   Û   s   rW   c                   @   s"   e Zd ZdZedejejƒgZdS )ÚTZSPTagPaddingz)
    padding tag (should be ignored)
    r   N)	r0   r1   r2   Ú__doc__r   r=   rI   rV   r4   r"   r"   r"   r#   rX   ß   s   ÿrX   c                   @   s*   e Zd ZdZedejejƒgZdd„ Z	dS )r.   z
    last tag
    r   c                 C   s>   | j }d}|r&t|tƒr|}q&|j }q
|r2| ¡ S tdƒ‚dS )zˆ
        the type of the payload encapsulation is given be the outer TZSP layers attribute encapsulation_protocol  # noqa: E501
        Nzmissing parent TZSP header)Z
underlayerÚ
isinstancer   r$   rW   )r!   r)   Zunder_layerZtzsp_headerr"   r"   r#   r*   ð   s    
zTZSPTagEnd.guess_payload_classN)
r0   r1   r2   rY   r   r=   rJ   rV   r4   r*   r"   r"   r"   r#   r.   è   s   ÿr.   c                   @   s2   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)
r0   r1   r2   rY   r   r=   rK   rV   r   r4   r"   r"   r"   r#   r[     s
   ýr[   c                   @   s2   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&   r5   r\   r   N)r0   r1   r2   rY   r   r=   rK   rV   r   r   r4   r"   r"   r"   r#   r]     s
   ýr]   c                   @   s2   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)
r0   r1   r2   rY   r   r=   rL   rV   r   r4   r"   r"   r"   r#   r^     s
   ýr^   c                   @   s2   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&   r5   r_   r   N)r0   r1   r2   rY   r   r=   rL   rV   r   r   r4   r"   r"   r"   r#   r`   &  s
   ýr`   c                &   @   sÐ   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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   r5   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   Z	data_rateN)r0   r1   r2   rY   ZDATA_RATE_UNKNOWNZDATA_RATE_1ZDATA_RATE_2ZDATA_RATE_5_5ZDATA_RATE_6ZDATA_RATE_9ZDATA_RATE_11ZDATA_RATE_12ZDATA_RATE_18ZDATA_RATE_22ZDATA_RATE_24ZDATA_RATE_33ZDATA_RATE_36ZDATA_RATE_48ZDATA_RATE_54ZDATA_RATE_LEGACY_1ZDATA_RATE_LEGACY_2ZDATA_RATE_LEGACY_5_5ZDATA_RATE_LEGACY_11Z
DATA_RATESr   r=   rM   rV   r   r4   r"   r"   r"   r#   ra   1  sX   í
ýra   c                   @   s2   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)r0   r1   r2   rY   r   r=   rN   rV   r   r   r4   r"   r"   r"   r#   ro   f  s
   ýro   c                   @   s:   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&   Zcontention_freeN)r0   r1   r2   rY   ÚNOÚYESr   r=   rO   rV   r   r
   r4   r"   r"   r"   r#   rq   q  s   ýrq   c                   @   sH   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œd	�gZd
S )ÚTZSPTagDecryptedz
    packet was decrypted
    r   r   r   r&   Z	decryptedéÿ   )ÚyesÚno©ÚconfigN)r0   r1   r2   rY   rs   rr   r   r=   rP   rV   r   r
   r4   r"   r"   r"   r#   rt     s   ýrt   c                	   @   sN   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 dfdœd	�gZd
S )ÚTZSPTagErrorz
    frame checksum error
    r   r   r   r&   Z	fcs_errorru   )rw   rv   Úreservedrx   N)r0   r1   r2   rY   rr   rs   r   r=   rQ   rV   r   r
   r4   r"   r"   r"   r#   rz   �  s   ýrz   c                   @   s2   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   Z
rx_channelr   N)
r0   r1   r2   rY   r   r=   rR   rV   r   r4   r"   r"   r"   r#   r|   ›  s
   ýr|   c                   @   s2   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   Zpacket_countr   N)r0   r1   r2   rY   r   r=   rS   rV   r   r   r4   r"   r"   r"   r#   r}   ¦  s
   ýr}   c                   @   s2   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&   r5   Zrx_frame_lengthr   N)r0   r1   r2   rY   r   r=   rT   rV   r   r   r4   r"   r"   r"   r#   r~   ±  s
   ýr~   c                   @   s@   e Zd ZdZedejejƒeddddd�e	ddd	d
„ d�gZ
dS )ÚTZSPTagWlanRadioHdrSerialzH
    (vendor specific) unique capture device (sensor/AP) identifier
    r   r&   NZ	sensor_idÚb©Z	length_ofÚfmtÚ c                 C   s   | j S r+   ©r&   ©Zpktr"   r"   r#   Ú<lambda>Ã  ó    z"TZSPTagWlanRadioHdrSerial.<lambda>©Zlength_from)r0   r1   r2   rY   r   r=   rU   rV   r	   r   r4   r"   r"   r"   r#   r   ¼  s
   ýr   c                   @   s:   e Zd ZdZeddƒeddddd�edd	d
d„ d�gZdS )r6   z 
    unknown tag type dummy
    r   ru   r&   NÚdatar€   r�   rƒ   c                 C   s   | j S r+   r„   r…   r"   r"   r#   r†   Î  r‡   zTZSPTagUnknown.<lambda>rˆ   )r0   r1   r2   rY   r   r	   r   r4   r"   r"   r"   r#   r6   Ç  s
   ýr6   )r   r5   N)>rY   Zscapy.compatr   Zscapy.contrib.avsr   Zscapy.errorr   r   Zscapy.fieldsr   r   r   r	   r
   Zscapy.layers.dot11r   r   r   Zscapy.layers.l2r   r   r   r   r   Zscapy.packetr   ZTZSP_PORT_DEFAULTr   r8   r'   r=   rW   rX   r.   r[   r]   r^   r`   ra   ro   rq   rt   rz   r|   r}   r~   r   r6   rI   rJ   rK   rL   rM   rN   rO   rP   rQ   rR   rS   rT   rU   r9   r"   r"   r"   r#   Ú<module>   sX   J%#	5ó