a
    kÄ#d÷E  ã                   @   s:  d Z ddlZddlmZmZ ddlmZ ddlmZ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mZm Z m!Z! ddl"m#Z#m$Z$ dd	l%m&Z&m'Z' dd
l(m)Z)m*Z* ddl+m,Z,m-Z- G dd„ de)ƒZ.G dd„ deƒZ/G dd„ deƒZ0G dd„ deƒZ1G dd„ deƒZ2G dd„ deƒZ3G dd„ deƒZ4G dd„ deƒZ5G dd„ deƒZ6G dd„ deƒZ7G d d!„ d!eƒZ8G d"d#„ d#e7ƒZ9G d$d%„ d%e7ƒZ:G d&d'„ d'eƒZ;G d(d)„ d)eƒZ<G d*d+„ d+eƒZ=d,d-d.d/d0d1d2œZ>d3d4d5œZ?d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLœZ@G dMdN„ dNeƒZAG dOdP„ dPeƒZBG dQdR„ dReƒZCG dSdT„ dTeƒZDG dUd8„ d8eƒZEG dVd9„ d9eƒZFG dWd:„ d:eƒZGG dXd;„ d;eƒZHG dYd<„ d<eƒZIG dZd=„ d=eƒZJG d[d>„ d>eƒZKG d\d?„ d?eƒZLG d]d@„ d@eƒZMG d^dA„ dAeƒZNG d_dB„ dBeƒZOG d`dC„ dCeƒZPG dadD„ dDeƒZQG dbdE„ dEeƒZRG dcdF„ dFeƒZSG ddde„ deeƒZTG dfdg„ dgeƒZUG dhdi„ dieƒZVG djdG„ dGeƒZWG dkdH„ dHeƒZXG dldI„ dIeƒZYG dmdJ„ dJeƒZZG dndK„ dKeƒZ[G dodp„ dpeƒZ\ee4e5dqdr� ee4e6ƒ ee5e7dds� ee5e8dtds� ee5e9duds� ee5e;dvds� ee5e<dwds� ee5e=dxds� ee5e:dyds� ee6e'dudz� ee6eBdvdz� ee6eAddtd{œƒ eeBeCdd|� eeBeDdtd|� eeBeEdud|� eeBeFdvd|� eeBeGdwd|� eeBeHdxd|� eeBeIdyd|� eeBeJd}d|� eeBeKd~d|� eeBeLdd|� eeBeMd€d|� eeBeNd�d|� eeBeOd‚d|� eeBePdƒd|� eeBeQd„d|� eeBeRd…d|� eeBeSd†d|� eeBeTd‡d|� eeBeUdˆd|� eeBeVd‰d|� eeBeWdŠd|� eeBeXd‹d|� eeBeYdŒd|� eeBeZd�d|� eeBe[dŽd|� eeBe\d�d|� ej] ^ee4¡ ej] ^e	e/¡ ee/e4ƒ ee*e.e
d�� dS )‘zBluetooth 4LE layeré    N)ÚorbÚchb)Úconf)ÚDLT_BLUETOOTH_LE_LLÚDLT_BLUETOOTH_LE_LL_WITH_PHDRÚPPI_BTLE)ÚPacketÚbind_layers)ÚBitEnumFieldÚBitFieldÚByteEnumFieldÚ	ByteFieldÚFieldÚ
FlagsFieldÚ
LEIntFieldÚLEShortEnumFieldÚLEShortFieldÚMACFieldÚPacketListFieldÚSignedByteFieldÚX3BytesFieldÚ
XByteFieldÚ	XIntFieldÚXLEIntFieldÚXLELongFieldÚXLEShortFieldÚXShortField)ÚLEBitEnumFieldÚ
LEBitField)ÚEIR_HdrÚ	L2CAP_Hdr)ÚPPI_ElementÚPPI_Hdr)Úmac2strÚstr2macc                
   @   sX   e Zd ZdZdZeddƒeddƒeddƒeddƒed	dƒed
dƒeddƒeddƒgZ	dS )ÚBTLE_PPIz‚Cooked BTLE PPI header

    See ``ppi_btle_t`` in
    https://github.com/greatscottgadgets/libbtbb/blob/master/lib/src/pcap.c
    zBTLE PPI headerZbtle_versionr   Zbtle_channelNZbtle_clkn_highZbtle_clk_100nsZrssi_maxZrssi_minZrssi_avgZ
rssi_count)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer   r   r   r   Úfields_desc© r,   r,   úP/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/bluetooth4LE.pyr%   2   s   ör%   c                   @   sê   e Zd ZdZdZddddddd	d
dœZdddd
dœZeddƒeddƒeddƒeddƒe	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ƒeddd eƒe
d!ddƒe
d"ddƒe
d#ddƒe
d$ddƒed%dd&eƒgZd'S )(ÚBTLE_RFzxCooked BTLE link-layer pseudoheader.

    https://www.tcpdump.org/linktypes/LINKTYPE_BLUETOOTH_LE_LL_WITH_PHDR.html
    zBTLE RF info headerZADV_OR_DATA_UNKNOWN_DIRZAUX_ADVZDATA_M_TO_SZDATA_S_TO_MZCONN_ISO_M_TO_SZCONN_ISO_S_TO_MZBROADCAST_ISOÚRFU)r   é   é   é   é   é   é   é   Z1MZ2MZCoded)r   r0   r1   r2   Z
rf_channelr   Úsignali€ÿÿÿÚnoiseZaccess_address_offensesZreference_access_addressZ
dewhitenedr0   Zsig_power_validZnoise_power_validZ	decryptedZreference_access_address_validZaccess_address_offenses_validZchannel_aliasedÚtyper2   Zcrc_checkedZ	crc_validZmic_checkedZ	mic_validZphyr1   N)r&   r'   r(   r)   r*   Z_TYPESZ_PHYr   r   r   r   r   r+   r,   r,   r,   r-   r.   G   sF   øü










îr.   c                   @   s&   e Zd Zd	dd„Zdd„ Zdd„ ZdS )
ÚBDAddrFieldFc                 C   s"   t  | ||¡ |rtj | ¡ d S ©N)r   Ú__init__r   ÚresolveÚadd)Úselfr*   Údefaultr=   r,   r,   r-   r<   {   s    zBDAddrField.__init__c                 C   s*   |d u rdS t d | d¡d d d… ¡ƒS )Ns         ú:éÿÿÿÿ)r#   ÚjoinÚsplit©r?   ÚpktÚxr,   r,   r-   Úi2m€   s    zBDAddrField.i2mc                 C   s   t |d d d… ƒS ©NrB   )r$   rE   r,   r,   r-   Úm2i…   s    zBDAddrField.m2iN)F)r&   r'   r(   r<   rH   rJ   r,   r,   r,   r-   r:   z   s   
r:   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )ÚBTLEChanMapFieldc                 C   s   t  | ||d¡ d S )Nz<Q)r   r<   ©r?   r*   r@   r,   r,   r-   r<   Š   s    zBTLEChanMapField.__init__c                 C   s"   |t  | j|  ||¡¡d d…  S )Nr4   )ÚstructÚpackÚfmtrH   )r?   rF   ÚsÚvalr,   r,   r-   Úaddfield�   s    zBTLEChanMapField.addfieldc              
   C   s2   |dd … |   |t | j|d d… d ¡d ¡fS )Nr4   s      r   )rJ   rM   ÚunpackrO   )r?   rF   rP   r,   r,   r-   Úgetfield�   s    zBTLEChanMapField.getfieldN)r&   r'   r(   r<   rR   rT   r,   r,   r,   r-   rK   ‰   s   rK   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚBTLEFeatureFieldc                    s   t t| ƒ ||dg d¢¡ d S )NiÀÿÿÿ)Zle_encryptionZconn_par_req_procZext_reject_indZslave_init_feat_exchZle_pingZle_data_len_extZ
ll_privacyZext_scan_filterZ	le_2m_phyZ
tx_mod_idxZ
rx_mod_idxZle_coded_phyZ
le_ext_advZle_periodic_advZ
ch_sel_algZle_pwr_class)ÚsuperrU   r<   rL   ©Ú	__class__r,   r-   r<   •   s    
þzBTLEFeatureField.__init__©r&   r'   r(   r<   Ú__classcell__r,   r,   rW   r-   rU   ”   s   rU   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚBTLEPhysFieldc                    s   t t| ƒ ||dg d¢¡ d S )Niøÿÿÿ)Zphy_1mZphy_2mZ	phy_coded)rV   r[   r<   rL   rW   r,   r-   r<   ¬   s    
þzBTLEPhysField.__init__rY   r,   r,   rW   r-   r[   «   s   r[   c                   @   sR   e Zd ZdZeddƒeddƒgZeddd„ƒZd	d
„ Z	dd„ Z
dd„ Zdd„ ZdS )ÚBTLEZBT4LEÚaccess_addrì   Ö> ÚcrcNéUUU c                 C   s¦   dd„ }||d@ ƒ||d? d@ ƒd>  ||d? d@ ƒd>  }d}dd„ | D ƒD ]B}t dƒD ]4}||A d	@ }|d	L }|d	L }|rZ|d
O }||N }qZqNt d|¡d d… S )Nc                 S   s¨   d}| d@ dkr|dO }| d@ dkr,|dO }| d@ dkr@|dO }| d@ dkrT|d	O }| d	@ dkrh|dO }| d@ dkr||dO }| d@ dkr�|dO }| d@ dkr¤|dO }|S )
Nr   é€   r0   é@   r1   é    r3   é   é   r,   )ÚaÚvr,   r,   r-   ÚswapbitsÀ   s$    z"BTLE.compute_crc.<locals>.swapbitséÿ   re   rd   i `Z c                 s   s   | ]}t |ƒV  qd S r;   )r   )Ú.0rG   r,   r,   r-   Ú	<genexpr>Ö   ó    z#BTLE.compute_crc.<locals>.<genexpr>r0   i  € z<LrB   )ÚrangerM   rN   )ZpduÚinitrh   ÚstateZ	lfsr_maskÚiÚjZnext_bitr,   r,   r-   Úcompute_crc¾   s    4zBTLE.compute_crcc                 C   sD   |dd … }|d d… | }|| j d ur,|n|  |dd … ¡7 }|S )Néýÿÿÿr3   )r_   rr   )r?   ÚpÚpayr_   r,   r,   r-   Ú
post_buildà   s    $zBTLE.post_buildc                 C   s
   d | _ |S r;   )Zraw_packet_cache©r?   rP   r,   r,   r-   Úpost_dissectç   s    zBTLE.post_dissectc                 C   s$   |d d… |dd …  |dd…  S )Nr3   rs   r,   rw   r,   r,   r-   Úpre_dissectë   s    zBTLE.pre_dissectc                 C   s   t  d| j¡S )Nz!L)rM   rN   r]   )r?   r,   r,   r-   Úhashretï   s    zBTLE.hashret)r`   )r&   r'   r(   r*   r   r   r+   Ústaticmethodrr   rv   rx   ry   rz   r,   r,   r,   r-   r\   ·   s   þ!r\   c                   @   s~   e Zd ZdZeddddddœƒeddddddœƒed	dddd
iƒedddƒedddddddddddœƒeddƒgZdd„ ZdS )ÚBTLE_ADVzBTLE advertising headerZRxAddr   r0   ÚpublicÚrandom)r   r0   ZTxAddZChSelz#2r/   ÚPDU_typer3   ZADV_INDZADV_DIRECT_INDZADV_NONCONN_INDZSCAN_REQZSCAN_RSPZCONNECT_REQZADV_SCAN_IND)r   r0   r1   r2   r3   r4   r5   ÚLengthNc                 C   sj   ||7 }| j d u rPt|ƒdkr(t|ƒ}nd}|d d… t|d@ ƒ |dd …  }t| jtƒsf|  t¡ |S )Nr1   r   r0   ri   )r€   Úlenr   Ú
isinstanceZ
underlayerr\   Zadd_underlayer)r?   rt   ru   Zl_payr,   r,   r-   rv     s    

$
zBTLE_ADV.post_build)	r&   r'   r(   r*   r
   r   r   r+   rv   r,   r,   r,   r-   r|   ó   s(   
ÿ
ÿ

úñr|   c                   @   s`   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
ddddœƒeddƒgZdd„ ZdS )Ú	BTLE_DATAzBTLE data headerr/   r   r2   ZMDr0   ZSNZNESNÚLLIDr1   ÚcontinueÚstartÚcontrol)r0   r1   r2   r�   Nc                 C   s*   | j d u r"|d d… tt |ƒƒ }|| S rI   )r�   r   )r?   rt   ru   r,   r,   r-   rv      s    
zBTLE_DATA.post_build)	r&   r'   r(   r*   r   r
   r   r+   rv   r,   r,   r,   r-   rƒ     s   



ú	rƒ   c                   @   s&   e Zd ZdZeddƒeddeƒgZdS )ÚBTLE_ADV_INDzBTLE ADV_INDÚAdvANÚdata)r&   r'   r(   r*   r:   r   r   r+   r,   r,   r,   r-   rˆ   &  s   
þrˆ   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚBTLE_ADV_DIRECT_INDzBTLE ADV_DIRECT_INDr‰   NÚInitA)r&   r'   r(   r*   r:   r+   r,   r,   r,   r-   r‹   .  s   þr‹   c                   @   s   e Zd ZdZdS )ÚBTLE_ADV_NONCONN_INDzBTLE ADV_NONCONN_INDN©r&   r'   r(   r*   r,   r,   r,   r-   r�   6  s   r�   c                   @   s   e Zd ZdZdS )ÚBTLE_ADV_SCAN_INDzBTLE ADV_SCAN_INDNrŽ   r,   r,   r,   r-   r�   :  s   r�   c                   @   s,   e Zd ZdZeddƒeddƒgZdd„ ZdS )ÚBTLE_SCAN_REQzBTLE scan requestZScanANr‰   c                 C   s   t |v o| j|jkS r;   )ÚBTLE_SCAN_RSPr‰   ©r?   Úotherr,   r,   r-   ÚanswersE  s    zBTLE_SCAN_REQ.answers)r&   r'   r(   r*   r:   r+   r”   r,   r,   r,   r-   r�   >  s
   þr�   c                   @   s.   e Zd ZdZeddƒeddeƒgZdd„ ZdS )r‘   zBTLE scan responser‰   NrŠ   c                 C   s   t |v o| j|jkS r;   )r�   r‰   r’   r,   r,   r-   r”   P  s    zBTLE_SCAN_RSP.answers)	r&   r'   r(   r*   r:   r   r   r+   r”   r,   r,   r,   r-   r‘   I  s
   
þr‘   c                   @   sx   e Zd ZdZeddƒeddƒeddƒeddƒeddƒed	dƒed
dƒeddƒeddƒe	ddƒe
dddƒe
dddƒgZdS )ÚBTLE_CONNECT_REQzBTLE connect requestrŒ   Nr‰   ZAAr   Zcrc_initÚwin_sizeÚ
win_offsetÚintervalÚlatencyÚtimeoutÚchMZSCAr2   Zhopr4   )r&   r'   r(   r*   r:   r   r   r   r   rK   r   r+   r,   r,   r,   r-   r•   T  s   

ór•   z4.0z4.1z4.2z5.0z5.1z5.2)r5   r6   re   é	   é
   é   zBroadcom CorporationzNordic Semiconductor ASA)é   éY   ZLL_CONNECTION_UPDATE_REQZLL_CHANNEL_MAP_REQÚLL_TERMINATE_INDÚ
LL_ENC_REQÚ
LL_ENC_RSPÚLL_START_ENC_REQÚLL_START_ENC_RSPÚLL_UNKNOWN_RSPÚLL_FEATURE_REQÚLL_FEATURE_RSPÚLL_PAUSE_ENC_REQÚLL_PAUSE_ENC_RSPÚLL_VERSION_INDÚLL_REJECT_INDÚLL_SLAVE_FEATURE_REQÚLL_CONNECTION_PARAM_REQÚLL_CONNECTION_PARAM_RSPÚLL_LENGTH_REQÚLL_LENGTH_RSPÚ
LL_PHY_REQÚ
LL_PHY_RSPÚLL_PHY_UPDATE_IND)r   r0   r1   r2   r3   r4   r5   r6   re   rœ   r�   rž   é   é   é   rŸ   rd   é   é   é   é   é   c                   @   s   e Zd ZdZdS )ÚBTLE_EMPTY_PDUzEmpty data PDUNrŽ   r,   r,   r,   r-   r½   ‘  s   r½   c                   @   s   e Zd Zd ZeddeƒgZdS )Ú	BTLE_CTRLÚopcoder   N)r&   r'   r(   r*   r   ÚBTLE_BTLE_CTRL_opcoder+   r,   r,   r,   r-   r¾   •  s   
ÿr¾   c                   @   sD   e Zd Zd Zeddƒeddƒeddƒeddƒeddƒed	dƒgZd
S )ÚLL_CONNECTION_UPDATE_INDr–   r   r—   r˜   r5   r™   rš   é2   ÚinstantN)r&   r'   r(   r*   r   r   r+   r,   r,   r,   r-   rÁ   œ  s   úrÁ   c                   @   s$   e Zd Zd ZeddƒeddƒgZdS )ÚLL_CHANNEL_MAP_INDr›   l   þÿÿrÃ   r   N)r&   r'   r(   r*   rK   r   r+   r,   r,   r,   r-   rÄ   ¨  s   þrÄ   c                   @   s   e Zd Zd ZeddƒgZdS )r¡   Úcoder   N©r&   r'   r(   r*   r   r+   r,   r,   r,   r-   r¡   °  s   ÿc                   @   s4   e Zd Zd ZeddƒeddƒeddƒeddƒgZdS )r¢   Zrandr   ZedivZskdmZivmN)r&   r'   r(   r*   r   r   r   r+   r,   r,   r,   r-   r¢   ·  s   üc                   @   s$   e Zd Zd ZeddƒeddƒgZdS )r£   Zskdsr   ZivsN)r&   r'   r(   r*   r   r   r+   r,   r,   r,   r-   r£   Á  s   þc                   @   s   e Zd Zd Zg ZdS )r¤   N)r&   r'   r(   r*   r+   r,   r,   r,   r-   r¤   É  s   c                   @   s   e Zd Zd ZdS )r¥   NrŽ   r,   r,   r,   r-   r¥   Î  s   c                   @   s   e Zd Zd ZeddƒgZdS )r¦   rÅ   r   NrÆ   r,   r,   r,   r-   r¦   Ò  s   ÿc                   @   s   e Zd Zd ZeddƒgZdS )r§   Úfeature_setr   N©r&   r'   r(   r*   rU   r+   r,   r,   r,   r-   r§   Ù  s   ÿc                   @   s   e Zd Zd ZeddƒgZdS )r¨   rÇ   r   NrÈ   r,   r,   r,   r-   r¨   à  s   ÿc                   @   s   e Zd Zd ZdS )r©   NrŽ   r,   r,   r,   r-   r©   ç  s   c                   @   s   e Zd Zd ZdS )rª   NrŽ   r,   r,   r,   r-   rª   ë  s   c                   @   s0   e Zd Zd ZeddeƒeddeƒeddƒgZ	dS )r«   Úversionre   Zcompanyr   Ú
subversionN)
r&   r'   r(   r*   r   ÚBTLE_Versionsr   ÚBTLE_Corp_IDsr   r+   r,   r,   r,   r-   r«   ï  s
   

ýc                   @   s   e Zd Zd ZeddƒgZdS )r¬   rÅ   r   NrÆ   r,   r,   r,   r-   r¬   ø  s   ÿc                   @   s   e Zd Zd ZeddƒgZdS )r­   rÇ   r   NrÈ   r,   r,   r,   r-   r­   ÿ  s   ÿc                   @   st   e Zd Zd Zeddƒeddƒeddƒeddƒeddƒeddƒed	dƒed
dƒeddƒeddƒeddƒeddƒgZdS )r®   Úinterval_minr5   Úinterval_maxr™   r   rš   Úpreferred_periodicityÚreference_conn_evt_countÚoffset0Úoffset1Úoffset2Úoffset3Úoffset4Úoffset5N©r&   r'   r(   r*   r   r   r+   r,   r,   r,   r-   r®     s   ôc                   @   st   e Zd Zd Zeddƒeddƒeddƒeddƒeddƒeddƒed	dƒed
dƒeddƒeddƒeddƒeddƒgZdS )r¯   rÍ   r5   rÎ   r™   r   rš   rÏ   rÐ   rÑ   rÒ   rÓ   rÔ   rÕ   rÖ   Nr×   r,   r,   r,   r-   r¯     s   ôc                   @   s$   e Zd Zd ZeddƒeddƒgZdS )ÚLL_REJECT_EXT_INDZreject_opcoder   Z
error_codeNrÆ   r,   r,   r,   r-   rØ   *  s   þrØ   c                   @   s   e Zd Zd ZdS )ÚLL_PING_REQNrŽ   r,   r,   r,   r-   rÙ   2  s   rÙ   c                   @   s   e Zd Zd ZdS )ÚLL_PING_RSPNrŽ   r,   r,   r,   r-   rÚ   6  s   rÚ   c                   @   s4   e Zd ZdZeddƒeddƒeddƒeddƒgZdS )	r°   z LL_LENGTH_REQÚmax_rx_byteséû   Úmax_rx_timeéH  Úmax_tx_bytesÚmax_tx_timeN©r&   r'   r(   r*   r   r+   r,   r,   r,   r-   r°   :  s   üc                   @   s4   e Zd ZdZeddƒeddƒeddƒeddƒgZdS )	r±   z LL_LENGTH_RSPrÛ   rÜ   rÝ   rÞ   rß   rà   Nrá   r,   r,   r,   r-   r±   D  s   üc                   @   s$   e Zd Zd ZeddƒeddƒgZdS )r²   Útx_physr   Úrx_physN©r&   r'   r(   r*   r[   r+   r,   r,   r,   r-   r²   N  s   þc                   @   s$   e Zd Zd ZeddƒeddƒgZdS )r³   râ   r   rã   Nrä   r,   r,   r,   r-   r³   V  s   þc                   @   s,   e Zd Zd ZeddƒeddƒeddƒgZdS )r´   Ztx_phyr   Zrx_phyrÃ   N)r&   r'   r(   r*   r[   r   r+   r,   r,   r,   r-   r´   ^  s
   ýc                   @   s$   e Zd Zd ZeddƒeddƒgZdS )ÚLL_MIN_USED_CHANNELS_INDZphysr   Zmin_used_channelsr1   N)r&   r'   r(   r*   r[   r   r+   r,   r,   r,   r-   rå   g  s   þrå   r^   )r]   )r   r0   r1   r2   r3   r4   r5   )r„   )r�   r„   )r¿   r6   re   rœ   r�   rž   rµ   r¶   r·   rŸ   rd   é   é   é   r¸   r¹   rº   r»   r¼   é   )Zpfh_type)_r)   rM   Zscapy.compatr   r   Zscapy.configr   Z
scapy.datar   r   r   Zscapy.packetr   r	   Zscapy.fieldsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Zscapy.contrib.ethercatr   r   Zscapy.layers.bluetoothr   r    Zscapy.layers.ppir!   r"   Zscapy.utilsr#   r$   r%   r.   r:   rK   rU   r[   r\   r|   rƒ   rˆ   r‹   r�   r�   r�   r‘   r•   rË   rÌ   rÀ   r½   r¾   rÁ   rÄ   r¡   r¢   r£   r¤   r¥   r¦   r§   r¨   r©   rª   r«   r¬   r­   r®   r¯   rØ   rÙ   rÚ   r°   r±   r²   r³   r´   rå   Zl2typesÚregisterr,   r,   r,   r-   Ú<module>   s  T3<"úþê
	

		

