a
    kÄ#d<Ò  ã                G   @   s\  d Z ddlZddlZddlZddlZddl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m Z m!Z!m"Z"m#Z#m$Z$m%Z% ddl&m'Z' dd	l(m)Z) dd
l	m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0m1Z1m2Z2 ddl3m4Z4 ddl5m6Z6 G dd„ deƒZ7G dd„ deƒZ8G dd„ deƒZ9dddddddddœZ:dd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdJdPdJdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcœFZ;dddedfdgdhdidjdkdldmdndodpdqdrdsdtduœZ<G dvdw„ dweƒZ=G dxdy„ dyeƒZ>G dzd{„ d{eƒZ?G d|d}„ d}eƒZ@G d~d„ deƒZAG d€d�„ d�eƒZBG d‚dƒ„ dƒeƒZCG d„d…„ d…eƒZDG d†d‡„ d‡eƒZEG dˆd‰„ d‰eƒZFG dŠd‹„ d‹eƒZGG dŒd�„ d�eƒZHG dŽd�„ d�eƒZIG d�d‘„ d‘eƒZJG d’d“„ d“eƒZKG d”d•„ d•eƒZLG d–d—„ d—eƒZMG d˜d™„ d™eƒZNG dšd›„ d›eƒZOG dœd�„ d�eƒZPG dždŸ„ dŸeƒZQG d d¡„ d¡eƒZRG d¢d£„ d£eƒZSG d¤d¥„ d¥eƒZTG d¦d§„ d§eƒZUG d¨d©„ d©eƒZVG dªd«„ d«eƒZWG d¬d­„ d­eƒZXG d®d¯„ d¯eƒZYG d°d±„ d±eƒZZG 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ƒZaG dÀdÁ„ dÁeƒZbG dÂdÃ„ dÃeƒZcG dÄdÅ„ dÅecƒZdG dÆdÇ„ dÇeƒZeG dÈdÉ„ dÉeƒZfG dÊdË„ dËeƒZgG dÌdÍ„ dÍeƒZhG dÎdÏ„ dÏeƒZiG dÐdÑ„ dÑeƒZjG dÒdÓ„ dÓeƒZkG dÔdÕ„ dÕeƒZlG dÖd×„ d×eƒZmG dØdÙ„ dÙeƒZnG dÚdÛ„ dÛeƒZoG dÜdÝ„ dÝeƒZpG dÞdß„ dßeƒZqG dàdá„ dáeƒZrG dâdã„ dãeƒZsG dädå„ dåeƒZtG dædç„ dçeƒZuG dèdé„ déeƒZvG dêdë„ dëeƒZwG dìdí„ díeƒZxG dîdï„ dïeƒZyG dðdñ„ dñeyƒZzG dòdó„ dóeyƒZ{G dôdõ„ dõeyƒZ|G död÷„ d÷e|ƒZ}G dødù„ dùeyƒZ~G dúdû„ dûe~ƒZG düdý„ dýeyƒZ€G dþdÿ„ dÿe€ƒZ�G �d �d„ �deyƒZ‚G �d�d„ �deyƒZƒG �d�d„ �deyƒZ„G �d�d„ �deyƒ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&�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 �d0�d1„ �d1eƒZšG �d2�d3„ �d3eƒZ›G �d4�d5„ �d5eƒZœG �d6�d7„ �d7eƒZ�G �d8�d9„ �d9eƒZžG �d:�d;„ �d;eƒZŸG �d<�d=„ �d=eƒZ G �d>�d?„ �d?eƒZ¡G �d@�dA„ �dAeƒZ¢G �dB�dC„ �dCeƒZ£G �dD�dE„ �dEeƒZ¤G �dF�dG„ �dGeƒZ¥G �dH�dI„ �dIeƒZ¦G �dJ�dK„ �dKeƒZ§G �dL�dM„ �dMeƒZ¨G �dN�dO„ �dOeƒZ©G �dP�dQ„ �dQeƒZªG �dR�dS„ �dSeƒZ«G �dT�dU„ �dUeƒZ¬G �dV�dW„ �dWeƒZ­G �dX�dY„ �dYeƒZ®G �dZ�d[„ �d[eƒZ¯G �d\�d]„ �d]eƒZ°ee9e=ƒ ee=e†�d^�d_� ee=e>�d`�d_� ee=e£�da�d_� ee=ej±ƒ ej² ³e
e=¡ ej² ³ee9¡ ee†e‡�db�dc� ee†e‹�dd�dc� ee†eˆ�de�dc� ee†e‰�df�dc� ee†eŠ�dg�dc� ee†eŽ�dh�dc� ee†eŒ�di�dc� ee†e��dj�dc� ee†e™�dk�dc� ee†e›�dl�dc� ee†eœ�dm�dc� ee†e��dn�dc� ee†ež�do�dc� ee†eŸ�dp�dc� ee†e��dq�dc� ee†e��dr�dc� ee†e‘�ds�dc� ee†e’�dt�dc� ee†e“�du�dc� ee†e”�dv�dc� ee†e•�dw�dc� ee†e–�dx�dc� ee†e—�dy�dc� ee†e˜�dz�dc� ee†eš�d{�dc� ee†e �d|�dc� ee†e �d|�dc� ee†e¢�d}�dc� ee†e¡�d~�dc� ee£e¤�d�d€� ee£e¥�d��d€� ee£e¦�d‚�d€� ee£e©�dƒ�d€� ee£eª�d„�d€� ee£e«�d…�d€� ee¦e§�di�dc� ee¦e¨�dv�dc� ee«e¬�d^�d†� ee«e¯�d`�d†� ee«e­�d‡�d†� ee«e°�d�d†� eexe{�d^�d_� eexe}�d`�d_� eexe|�d‡�d_� eexe�dˆ�d_� eexe~�d‰�d_� eexe��d��d_� eexe€�dŠ�d_� eexe„�d‹�d_� eexe‚�dŒ�d_� eexe…�d��d_� eexeƒ�dŽ�d_� eexezƒ ee>e?ƒ ee?e@�d^�d�� ee?e@�d�d�� ee@eC�d^�d€� ee@eA�d`�d€� ee@eB�d‡�d€� ee@eD�da�d€� ee@eE�d�d€� ee@eF�dˆ�d€� ee@eG�d‰�d€� ee@eH�dŒ�d€� ee@eI�d��d€� ee@eJ�d‘�d€� ee@eK�d„�d€� ee?eL�da�d�� eeLeO�d^�dc� eeLeP�d`�dc� eeLeQ�d‡�dc� eeLeR�da�dc� eeLeS�d�dc� eeLeT�dˆ�dc� eeLeU�d‰�dc� eeLeV�d��dc� eeLeW�d��dc� eeLeY�dŠ�dc� eeLeZ�dŒ�dc� eeLe[�d��dc� eeLeh�d’�dc� eeLei�d“�dc� eeLe\�d‚�dc� eeLe]�dƒ�dc� eeLe^�d‹�dc� eeLe_�d”�dc� eeLe`�d‘�dc� eeLeb�d„�dc� eeLec�d��dc� eeLed�d•�dc� eeLef�d–�dc� eeLeg�d—�dc� eeLea�d˜�dc� eeLee�d™�dc� eeLej�dš�dc� ee?ek�dˆ�d�� eekel�d^�d›� eekem�d`�d›� eeken�d‡�d›� eekeo�da�d›� eekep�d�d›� eekeq�dˆ�d›� eeker�d‰�d›� eekes�d��d›� eeket�dŠ�d›� eekeu�dŒ�d›� eekev�d’�d›� eekew�d“�d›� G �dœ�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j»ƒZ¼G �dª�d«„ �d«e'ƒZ½e¹e_¾ej¿j³�d±�d­�d®„ƒZÀej¿j³�d¯�d°„ ƒZÁdS (²  z7
Bluetooth layers, sockets and send/receive functions.
é    N)Úsizeof)Úconf)ÚDLT_BLUETOOTH_HCI_H4ÚDLT_BLUETOOTH_HCI_H4_WITH_PHDR)Úbind_layersÚPacket)ÚBitFieldÚByteEnumFieldÚ	ByteFieldÚFieldÚFieldLenFieldÚFieldListFieldÚ
FlagsFieldÚIntFieldÚLEShortEnumFieldÚLEShortFieldÚLenFieldÚMultipleTypeFieldÚPacketListFieldÚPadFieldÚSignedByteFieldÚStrFieldÚStrFixedLenFieldÚStrLenFieldÚ	UUIDFieldÚ
XByteFieldÚXLELongFieldÚXStrLenField)ÚSuperSocket)Úsndrcv)ÚMTU)ÚWINDOWS)Úwarning)ÚlhexÚmac2strÚstr2mac©ÚRandMAC)Úsixc                   @   s   e Zd Zdd„ ZdS )ÚXLEShortFieldc                 C   s   t |  ||¡ƒS ©N)r#   Úi2h©ÚselfÚpktÚx© r0   úM/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/bluetooth.pyÚi2repr=   s    zXLEShortField.i2reprN)Ú__name__Ú
__module__Ú__qualname__r2   r0   r0   r0   r1   r)   <   s   r)   c                   @   s<   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ ZdS )Ú
LEMACFieldc                 C   s   t  | ||d¡ d S )NZ6s)r   Ú__init__)r-   ÚnameÚdefaultr0   r0   r1   r7   B   s    zLEMACField.__init__c                 C   s   |d u rdS t |ƒd d d… S )Ns         éÿÿÿÿ)r$   r,   r0   r0   r1   Úi2mE   s    zLEMACField.i2mc                 C   s   t |d d d… ƒS )Nr:   )r%   r,   r0   r0   r1   Úm2iJ   s    zLEMACField.m2ic                 C   s.   t |tjtjfƒr*t|ƒdkr*|  ||¡}|S ©Né   )Ú
isinstancer(   Úbinary_typeÚ	text_typeÚlenr<   r,   r0   r0   r1   Úany2iM   s    zLEMACField.any2ic                 C   s&   |   ||¡}| tjv r"tj |¡}|S r*   )r+   r   ÚresolveZmanufdbZ_resolve_MACr,   r0   r0   r1   r2   R   s    
zLEMACField.i2reprc                 C   s   t ƒ S r*   r&   ©r-   r0   r0   r1   ÚrandvalX   s    zLEMACField.randvalN)	r3   r4   r5   r7   r;   r<   rC   r2   rF   r0   r0   r0   r1   r6   A   s   r6   c                   @   s   e Zd ZdZeddƒgZdS )ÚHCI_PHDR_HdrzHCI PHDR transport layerÚ	directionr   N)r3   r4   r5   r8   r   Úfields_descr0   r0   r0   r1   rG   d   s   rG   ZAcknowledgementÚCommandzACL DataZSynchronousÚEventZReserveZVendorzLink Control)r   é   é   é   é   é   é   é   ZSuccesszUnknown HCI CommandzUnknown Connection IdentifierzHardware FailurezPage TimeoutzAuthentication FailurezPIN or Key MissingzMemory Capacity ExceededzConnection TimeoutzConnection Limit Exceededz1Synchronous Connection Limit To A Device ExceededzConnection Already ExistszCommand Disallowedz,Connection Rejected due to Limited Resourcesz+Connection Rejected Due To Security Reasonsz/Connection Rejected due to Unacceptable BD_ADDRz"Connection Accept Timeout Exceededz&Unsupported Feature or Parameter ValuezInvalid HCI Command Parametersz!Remote User Terminated Connectionz8Remote Device Terminated Connection due to Low Resourcesz4Remote Device Terminated Connection due to Power Offz#Connection Terminated By Local HostzRepeated AttemptszPairing Not AllowedzUnknown LMP PDUz4Unsupported Remote Feature / Unsupported LMP FeaturezSCO Offset RejectedzSCO Interval RejectedzSCO Air Mode Rejectedz.Invalid LMP Parameters / Invalid LL ParameterszUnspecified Errorz@Unsupported LMP Parameter Value / Unsupported LL Parameter ValuezRole Change Not Allowedz*LMP Response Timeout / LL Response Timeoutz8LMP Error Transaction Collision / LL Procedure CollisionzLMP PDU Not AllowedzEncryption Mode Not AcceptablezLink Key cannot be ChangedzRequested QoS Not SupportedzInstant Passedz#Pairing With Unit Key Not SupportedzDifferent Transaction CollisionzReserved for future usezQoS Unacceptable ParameterzQoS Rejectedz$Channel Classification Not SupportedzInsufficient Securityz Parameter Out Of Mandatory RangezRole Switch PendingzReserved Slot ViolationzRole Switch Failedz#Extended Inquiry Response Too Largez+Secure Simple Pairing Not Supported By HostzHost Busy - Pairingz4Connection Rejected due to No Suitable Channel FoundzController Busyz"Unacceptable Connection ParameterszAdvertising Timeoutz(Connection Terminated due to MIC Failurez=Connection Failed to be Established / Synchronization TimeoutzMAC Connection FailedzLCoarse Clock Adjustment Rejected but Will Try to Adjust Using Clock DraggingzType0 Submap Not DefinedzUnknown Advertising IdentifierzLimit ReachedzOperation Cancelled by HostzPacket Too Long)Fr   rL   rM   rN   rO   rP   r>   é   é   é	   é
   é   é   é   rQ   rR   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é0   é1   é2   é3   é4   é5   é6   é7   é8   é9   é:   é;   é<   é=   é>   é?   é@   éA   éB   éC   éD   éE   zinvalid handlezread not permittedzwrite not permittedzinvalid pduzinsufficient authzunsupported reqzinvalid offsetzinsuficient authorzprepare queue fullzattr not foundzattr not longzinsufficient key sizezinvalid value sizeZunlikelyzinsufficiet encryptzunsupported gpr typezinsufficient resources)rL   rM   rN   rO   rP   r>   rS   rT   rU   rV   rW   rX   rY   rQ   rR   rZ   r[   c                   @   s&   e Zd ZdZeddeƒgZdd„ ZdS )ÚHCI_Hdrz
HCI headerÚtyperM   c                 C   s
   |   d¡S )Nz
HCI %type%©ZsprintfrE   r0   r0   r1   Ú	mysummaryÙ   s    zHCI_Hdr.mysummaryN)r3   r4   r5   r8   r	   Ú_bluetooth_packet_typesrI   r“   r0   r0   r0   r1   r�   Õ   s   r�   c                   @   sJ   e Zd ZdZeddddd�edddƒeddd	dd
�eddƒgZdd„ ZdS )ÚHCI_ACL_HdrzHCI ACL headerÚBCr   rM   éþÿÿÿ)Ztot_sizeÚPBÚhandlerX   )Zend_tot_sizerB   Nc                 C   s>   ||7 }| j d u r:|d d… t dt |ƒ¡ |dd …  }|S ©NrM   ú<HrO   ©rB   ÚstructÚpack©r-   ÚpZpayr0   r0   r1   Ú
post_buildä   s    
(zHCI_ACL_Hdr.post_build)r3   r4   r5   r8   r   r   rI   r¡   r0   r0   r0   r1   r•   Ý   s   
ýr•   c                   @   s4   e Zd ZdZeddƒedddddœƒgZd	d
„ ZdS )Ú	L2CAP_HdrzL2CAP headerrB   NÚcidr   ÚcontrolÚ	attribute)rL   rO   c                 C   s2   ||7 }| j d u r.t dt |ƒ¡|dd …  }|S )Nr›   rM   rœ   rŸ   r0   r0   r1   r¡   ð   s    
zL2CAP_Hdr.post_build)r3   r4   r5   r8   r   r   rI   r¡   r0   r0   r0   r1   r¢   ë   s
   ÿr¢   c                   @   sZ   e Zd ZdZedddddddd	d
dddddddœƒeddƒeddƒgZdd„ Zdd„ Z	dS )ÚL2CAP_CmdHdrzL2CAP command headerÚcoderT   ZrejZconn_reqZ	conn_respZconf_reqZ	conf_respZdisconn_reqZdisconn_respZecho_reqZ	echo_respZinfo_reqZ	info_respZconn_param_update_reqZconn_param_update_resp)rL   rM   rN   rO   rP   r>   rS   rT   rU   rV   rW   r\   r]   Úidr   rB   Nc                 C   s>   ||7 }| j d u r:|d d… t dt |ƒ¡ |dd …  }|S rš   rœ   rŸ   r0   r0   r1   r¡     s    
(zL2CAP_CmdHdr.post_buildc                 C   sT   |j | j krP| jdkrdS |jdv rP| j|jd krP|jdkrBdS | j |j¡S dS )NrL   )rM   rO   r>   rT   rV   r\   rT   r   )r¨   r§   ÚpayloadÚanswers©r-   Úotherr0   r0   r1   rª     s    

zL2CAP_CmdHdr.answers)
r3   r4   r5   r8   r	   r
   r   rI   r¡   rª   r0   r0   r0   r1   r¦   ÷   s   üù	r¦   c                   @   s.   e Zd ZdZeddddddœƒeddƒgZd	S )
ÚL2CAP_ConnReqzL2CAP Conn ReqZpsmr   ZSDPZRFCOMMztelephony control)rL   rN   rP   ÚscidN)r3   r4   r5   r8   r   r   rI   r0   r0   r0   r1   r­     s   ÿr­   c                   @   sH   e Zd ZdZeddƒeddƒeddg d¢ƒeddg d¢ƒgZd	d
„ ZdS )ÚL2CAP_ConnRespzL2CAP Conn RespÚdcidr   r®   Úresult)ÚsuccessZpendZ
cr_bad_psmZcr_sec_blockZ	cr_no_memÚreservedZcr_inval_scidZcr_scid_in_useÚstatus)Zno_infoZauthen_pendZauthor_pendr³   c                 C   s   t |tƒo| j|jkS r*   )r?   r­   r®   r«   r0   r0   r1   rª   "  s    zL2CAP_ConnResp.answersN©r3   r4   r5   r8   r   r   rI   rª   r0   r0   r0   r1   r¯     s   ýr¯   c                   @   s   e Zd ZdZeddƒgZdS )ÚL2CAP_CmdRejzL2CAP Command RejÚreasonr   N©r3   r4   r5   r8   r   rI   r0   r0   r0   r1   r¶   '  s   r¶   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚL2CAP_ConfReqzL2CAP Conf Reqr°   r   ÚflagsNr¸   r0   r0   r0   r1   r¹   -  s   ÿr¹   c                   @   s:   e Zd ZdZeddƒeddƒeddg d¢ƒgZdd„ Zd	S )
ÚL2CAP_ConfRespzL2CAP Conf Respr®   r   rº   r±   )r²   ZunacceptZrejectÚunknownc                 C   s
   t |tƒS r*   )r?   r¹   r«   r0   r0   r1   rª   ;  s    zL2CAP_ConfResp.answersNrµ   r0   r0   r0   r1   r»   4  s   þr»   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚL2CAP_DisconnReqzL2CAP Disconn Reqr°   r   r®   Nr¸   r0   r0   r0   r1   r½   @  s   ÿr½   c                   @   s,   e Zd ZdZeddƒeddƒgZdd„ ZdS )ÚL2CAP_DisconnRespzL2CAP Disconn Respr°   r   r®   c                 C   s   | j |j kS r*   )r®   r«   r0   r0   r1   rª   K  s    zL2CAP_DisconnResp.answersN)r3   r4   r5   r8   r   rI   rª   r0   r0   r0   r1   r¾   F  s
   ÿr¾   c                   @   s,   e Zd ZdZedddddœƒeddƒgZd	S )
ÚL2CAP_InfoReqzL2CAP Info Reqr‘   r   ZCL_MTUZ	FEAT_MASK)rL   rM   ÚdataÚ N)r3   r4   r5   r8   r   r   rI   r0   r0   r0   r1   r¿   O  s   ÿr¿   c                   @   s:   e Zd ZdZeddƒeddddgƒeddƒgZd	d
„ ZdS )ÚL2CAP_InfoRespzL2CAP Info Respr‘   r   r±   r²   Znot_supprÀ   rÁ   c                 C   s   | j |j kS r*   ©r‘   r«   r0   r0   r1   rª   \  s    zL2CAP_InfoResp.answersN)	r3   r4   r5   r8   r   r   r   rI   rª   r0   r0   r0   r1   rÂ   V  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 )Ú)L2CAP_Connection_Parameter_Update_Requestz)L2CAP Connection Parameter Update RequestÚmin_intervalr   Úmax_intervalZslave_latencyZtimeout_multNr¸   r0   r0   r0   r1   rÄ   `  s   ýrÄ   c                   @   s   e Zd ZdZeddƒgZdS )Ú*L2CAP_Connection_Parameter_Update_Responsez*L2CAP Connection Parameter Update ResponseZmove_resultr   Nr¸   r0   r0   r0   r1   rÇ   h  s   rÇ   c                   @   s   e Zd ZdZeddƒgZdS )ÚATT_Hdrz
ATT headerÚopcodeN©r3   r4   r5   r8   r   rI   r0   r0   r0   r1   rÈ   m  s   rÈ   c                   @   s,   e Zd ZdZeddƒeddƒgZdd„ ZdS )Ú
ATT_HandlezATT Short Handler™   r   Úvaluec                 C   s   d|fS ©Nó    r0   ©r-   Úsr0   r0   r1   Úextract_paddingw  s    zATT_Handle.extract_paddingN©r3   r4   r5   r8   r)   rI   rÑ   r0   r0   r0   r1   rË   r  s
   ÿrË   c                   @   s2   e Zd ZdZeddƒeddejd�gZdd„ ZdS )	ÚATT_Handle_UUID128zATT Handle (UUID 128)r™   r   rÌ   N©Zuuid_fmtc                 C   s   d|fS rÍ   r0   rÏ   r0   r0   r1   rÑ   €  s    z"ATT_Handle_UUID128.extract_padding)	r3   r4   r5   r8   r)   r   Ú
FORMAT_REVrI   rÑ   r0   r0   r0   r1   rÓ   {  s
   ÿrÓ   c                   @   s.   e Zd ZdZeddƒeddƒeddeƒgZdS )ÚATT_Error_ResponsezError ResponseÚrequestr   r™   ZecodeN)	r3   r4   r5   r8   r   r   r	   Ú_att_error_codesrI   r0   r0   r0   r1   rÖ   „  s
   
þrÖ   c                   @   s   e Zd ZdZeddƒgZdS )ÚATT_Exchange_MTU_RequestzExchange MTU RequestÚmtur   Nr¸   r0   r0   r0   r1   rÙ   ‹  s   rÙ   c                   @   s   e Zd ZdZeddƒgZdS )ÚATT_Exchange_MTU_ResponsezExchange MTU ResponserÚ   r   Nr¸   r0   r0   r0   r1   rÛ   �  s   rÛ   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚATT_Find_Information_RequestzFind Information RequestÚstartr   Úendéÿÿ  N©r3   r4   r5   r8   r)   rI   r0   r0   r0   r1   rÜ   •  s   ÿrÜ   c                   @   sR   e Zd ZdZeddƒeedg eƒdd„ fedg eƒdd„ fge	ddd	d
�ƒgZ
dS )ÚATT_Find_Information_ResponsezFind Information ResponseÚformatrL   Úhandlesc                 C   s
   | j dkS ©NrL   ©râ   ©r.   r0   r0   r1   Ú<lambda>¢  rÎ   z&ATT_Find_Information_Response.<lambda>c                 C   s
   | j dkS ©NrM   rå   ræ   r0   r0   r1   rç   ¤  rÎ   rÁ   r   )ÚlengthN)r3   r4   r5   r8   r   r   r   rË   rÓ   r   rI   r0   r0   r0   r1   rá   ›  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 )
ÚATT_Find_By_Type_Value_RequestzFind By Type Value RequestrÝ   rL   rÞ   rß   ÚuuidNrÀ   rÁ   ©r3   r4   r5   r8   r)   r   rI   r0   r0   r0   r1   rê   «  s   ýrê   c                   @   s   e Zd ZdZedg eƒgZdS )ÚATT_Find_By_Type_Value_ResponsezFind By Type Value Responserã   N)r3   r4   r5   r8   r   rË   rI   r0   r0   r0   r1   rí   ³  s   rí   c                   @   sB   e Zd ZdZeddƒeddƒeddƒeddƒgZedd	d
„ƒZdS )ÚATT_Read_By_Type_Request_128bitúRead By Type RequestrÝ   rL   rÞ   rß   Úuuid1NZuuid2c                 O   s   |rt |ƒdkrtS tS r=   )rB   ÚATT_Read_By_Type_Requestrî   )ÚclsÚ_pktÚargsÚkargsr0   r0   r1   Údispatch_hook¿  s    z-ATT_Read_By_Type_Request_128bit.dispatch_hook)N)	r3   r4   r5   r8   r)   r   rI   Úclassmethodrö   r0   r0   r0   r1   rî   ¸  s   ýrî   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )rñ   rï   rÝ   rL   rÞ   rß   rë   Nrà   r0   r0   r0   r1   rñ   Æ  s
   þrñ   c                   @   s@   e Zd ZdgZeddƒedddd„ d�gZdd
d„Zdd„ ZdS )ÚATT_Handle_VariableÚ
val_lengthr™   r   rÌ   c                 C   s   | j S r*   ©rù   ræ   r0   r0   r1   rç   Ò  rÎ   zATT_Handle_Variable.<lambda>©Úlength_fromrÎ   rM   c                 K   s   || _ tj| |fi |¤Ž d S r*   )rù   r   r7   )r-   ró   rù   Úkwargsr0   r0   r1   r7   Ô  s    zATT_Handle_Variable.__init__c                 C   s   d|fS rÍ   r0   rÏ   r0   r0   r1   rÑ   Ø  s    z#ATT_Handle_Variable.extract_paddingN)rÎ   rM   )	r3   r4   r5   Ú	__slots__r)   r   rI   r7   rÑ   r0   r0   r0   r1   rø   Í  s   þÿ
rø   c                   @   s8   e Zd ZdZeddƒedg dd„ d�gZedd	„ ƒZd
S )ÚATT_Read_By_Type_ResponsezRead By Type ResponserB   rO   rã   c                 G   s   | j | g|¢R Ž S r*   )Ú_next_cls_cb)r.   rô   r0   r0   r1   rç   á  s    z"ATT_Read_By_Type_Response.<lambda>)Znext_cls_cbc                 C   s&   t |ƒ|j kr"tjt|j d d�S d S )NrM   rú   )rB   Ú	functoolsÚpartialrø   )rò   r.   Úlstr    Zremainr0   r0   r1   r   å  s    þz&ATT_Read_By_Type_Response._next_cls_cbN)	r3   r4   r5   r8   r
   r   rI   r÷   r   r0   r0   r0   r1   rÿ   Ü  s   þÿrÿ   c                   @   s   e Zd ZdZeddƒgZdS )ÚATT_Read_RequestzRead RequestÚgatt_handler   Nrà   r0   r0   r0   r1   r  ï  s   r  c                   @   s   e Zd ZdZeddƒgZdS )ÚATT_Read_ResponsezRead ResponserÌ   rÁ   N©r3   r4   r5   r8   r   rI   r0   r0   r0   r1   r  ô  s   r  c                   @   s$   e Zd ZdZedg eddƒƒgZdS )ÚATT_Read_Multiple_RequestzRead Multiple Requestrã   rÁ   r   N)r3   r4   r5   r8   r   r)   rI   r0   r0   r0   r1   r  ù  s   r  c                   @   s   e Zd ZdZeddƒgZdS )ÚATT_Read_Multiple_ResponsezRead Multiple ResponseÚvaluesrÁ   Nr  r0   r0   r0   r1   r	  þ  s   r	  c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )ÚATT_Read_By_Group_Type_RequestzRead By Group Type RequestrÝ   r   rÞ   rß   rë   Nrà   r0   r0   r0   r1   r    s
   þr  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚATT_Read_By_Group_Type_ResponsezRead By Group Type Responseré   r   rÀ   rÁ   N)r3   r4   r5   r8   r   r   rI   r0   r0   r0   r1   r  
  s   ÿr  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚATT_Write_RequestúWrite Requestr  r   rÀ   rÁ   Nrì   r0   r0   r0   r1   r    s   ÿr  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚATT_Write_Commandr  r  r   rÀ   rÁ   Nrì   r0   r0   r0   r1   r    s   ÿr  c                   @   s   e Zd ZdZdS )ÚATT_Write_ResponsezWrite ResponseN©r3   r4   r5   r8   r0   r0   r0   r1   r    s   r  c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )ÚATT_Prepare_Write_RequestzPrepare Write Requestr  r   ÚoffsetrÀ   rÁ   N)r3   r4   r5   r8   r)   r   r   rI   r0   r0   r0   r1   r     s
   ýr  c                   @   s   e Zd ZdZdS )ÚATT_Prepare_Write_ResponsezPrepare Write ResponseNr  r0   r0   r0   r1   r  )  s   r  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚATT_Handle_Value_NotificationzHandle Value Notificationr  r   rÌ   rÁ   Nrì   r0   r0   r0   r1   r  -  s   ÿr  c                   @   s$   e Zd ZdZedddddœƒgZdS )ÚATT_Execute_Write_RequestzExecute Write Requestrº   rL   zCancel all prepared writesz-Immediately write all pending prepared values©r   rL   N©r3   r4   r5   r8   r	   rI   r0   r0   r0   r1   r  3  s   þÿr  c                   @   s   e Zd ZdZdS )ÚATT_Execute_Write_ResponsezExecute Write ResponseNr  r0   r0   r0   r1   r  =  s   r  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚATT_Read_Blob_RequestzRead Blob Requestr  r   r  N©r3   r4   r5   r8   r)   r   rI   r0   r0   r0   r1   r  A  s   þr  c                   @   s   e Zd ZdZeddƒgZdS )ÚATT_Read_Blob_ResponsezRead Blob ResponserÌ   rÁ   Nr  r0   r0   r0   r1   r  I  s   ÿr  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚATT_Handle_Value_IndicationzHandle Value Indicationr  r   rÌ   rÁ   Nrì   r0   r0   r0   r1   r  P  s   þr  c                   @   s   e Zd ZdZeddƒgZdS )ÚSM_Hdrz	SM headerÚ
sm_commandN©r3   r4   r5   r8   r
   rI   r0   r0   r0   r1   r  X  s   r  c                	   @   s\   e Zd ZdZedddddddd	œƒed
ddddœƒedddƒeddƒeddƒeddƒgZdS )ÚSM_Pairing_RequestzPairing RequestÚiocaprN   ÚDisplayOnlyÚDisplayYesNoÚKeyboardOnlyÚNoInputNoOutputÚKeyboardDisplay©r   rL   rM   rN   rO   Úoobr   úNot PresentúPresent (from remote device)r  ÚauthenticationrT   Úmax_key_sizerZ   Úinitiator_key_distributionÚresponder_key_distributionN©r3   r4   r5   r8   r	   r   r
   rI   r0   r0   r0   r1   r!  ]  s   
ûr!  c                	   @   s\   e Zd ZdZedddddddd	œƒed
ddddœƒedddƒeddƒeddƒeddƒgZdS )ÚSM_Pairing_ResponsezPairing Responser"  rN   r#  r$  r%  r&  r'  r(  r)  r   r*  r+  r  r,  rT   r-  rZ   r.  r/  Nr0  r0   r0   r0   r1   r1  g  s   
ûr1  c                   @   s   e Zd ZdZedddƒgZdS )Ú
SM_ConfirmzPairing ConfirmZconfirmó                   rZ   N©r3   r4   r5   r8   r   rI   r0   r0   r0   r1   r2  q  s   r2  c                   @   s   e Zd ZdZedddƒgZdS )Ú	SM_RandomzPairing RandomÚrandomr3  rZ   Nr4  r0   r0   r0   r1   r5  v  s   r5  c                   @   s   e Zd ZdZeddƒgZdS )Ú	SM_FailedzPairing Failedr·   r   NrÊ   r0   r0   r0   r1   r7  {  s   r7  c                   @   s   e Zd ZdZedddƒgZdS )ÚSM_Encryption_InformationzEncryption InformationÚltkr3  rZ   Nr4  r0   r0   r0   r1   r8  €  s   r8  c                   @   s&   e Zd ZdZeddƒedddƒgZdS )ÚSM_Master_IdentificationzMaster IdentificationÚedivr   Úrands           rT   N)r3   r4   r5   r8   r)   r   rI   r0   r0   r0   r1   r:  …  s   
ÿr:  c                   @   s   e Zd ZdZedddƒgZdS )ÚSM_Identity_InformationzIdentity InformationZirkr3  rZ   Nr4  r0   r0   r0   r1   r=  ‹  s   r=  c                   @   s*   e Zd ZdZeddddiƒeddƒgZdS )ÚSM_Identity_Address_InformationzIdentity Address InformationÚatyper   ÚpublicÚaddressN©r3   r4   r5   r8   r	   r6   rI   r0   r0   r0   r1   r>  �  s   ÿr>  c                   @   s   e Zd ZdZedddƒgZdS )ÚSM_Signing_InformationzSigning InformationZcsrkr3  rZ   Nr4  r0   r0   r0   r1   rC  –  s   rC  c                   @   s(   e Zd ZdZedddƒedddƒgZdS )ÚSM_Public_Keyz
Public KeyZkey_xs                                    rj   Zkey_yNr4  r0   r0   r0   r1   rD  ›  s   

ÿrD  c                   @   s   e Zd ZdZedddƒgZdS )ÚSM_DHKey_CheckzDHKey CheckZdhkey_checkr3  rZ   Nr4  r0   r0   r0   r1   rE  ¡  s   rE  c                /   @   sŽ   e Zd ZdZeddddd„ d�edd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4œ*ƒgZd5d6„ ZdS )7ÚEIR_Hdrz
EIR HeaderrB   NÚBc                 C   s   | d S rä   r0   )r/   r0   r0   r1   rç   ©  rÎ   zEIR_Hdr.<lambda>)ÚfmtÚadjustr‘   r   rº   Z incomplete_list_16_bit_svc_uuidsZcomplete_list_16_bit_svc_uuidsZ incomplete_list_32_bit_svc_uuidsZcomplete_list_32_bit_svc_uuidsZ!incomplete_list_128_bit_svc_uuidsZcomplete_list_128_bit_svc_uuidsZshortened_local_nameZcomplete_local_nameZtx_power_levelZclass_of_deviceZsimple_pairing_hashZsimple_pairing_randZ
sec_mgr_tkZsec_mgr_oob_flagsZslave_conn_intvl_rangeZ!list_16_bit_svc_sollication_uuidsZ"list_128_bit_svc_sollication_uuidsZsvc_data_16_bit_uuidZpub_target_addrZrand_target_addrZ
appearanceZ	adv_intvlZle_addrZle_roleZsimple_pairing_hash_256Zsimple_pairing_rand_256Z!list_32_bit_svc_sollication_uuidsZsvc_data_32_bit_uuidZsvc_data_128_bit_uuidZsec_conn_confirmZsec_conn_randÚuriZindoor_positioningZtransport_discoveryZle_supported_featuresZchannel_map_updateZmesh_pb_advZmesh_messageZmesh_beaconZ3d_informationZmfg_specific_data)*rL   rM   rN   rO   rP   r>   rS   rT   rU   rV   rY   rQ   rR   rZ   r[   r\   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   r‡   éÿ   c                 C   s
   |   d¡S )Nz
EIR %type%r’   rE   r0   r0   r1   r“   Ý  s    zEIR_Hdr.mysummary)r3   r4   r5   r8   r   r	   rI   r“   r0   r0   r0   r1   rF  ¦  s`   Òý5rF  c                   @   s$   e Zd ZdZdd„ Zedd„ ƒZdS )ÚEIR_ElementzEIR Elementc                 C   s   d|fS rÍ   r0   rÏ   r0   r0   r1   rÑ   ä  s    zEIR_Element.extract_paddingc                 C   s   | j stdƒ dS | j jd S )NzMissing an upper-layerr   rL   )Z
underlayerr"   rB   ræ   r0   r0   r1   rü   è  s    zEIR_Element.length_fromN)r3   r4   r5   r8   rÑ   Ústaticmethodrü   r0   r0   r0   r1   rL  á  s   rL  c                   @   s"   e Zd ZdZeddejd�gZdS )ÚEIR_RawzEIR RawrÀ   rÁ   rû   N©r3   r4   r5   r8   r   rL  rü   rI   r0   r0   r0   r1   rN  ñ  s   ÿrN  c                   @   s.   e Zd ZdZedddg d¢ddg  ƒgZdS )	Ú	EIR_FlagsÚFlagsrº   rM   rT   )Zlimited_disc_modeÚgeneral_disc_modeÚbr_edr_not_supportedZsimul_le_br_edr_ctrlZsimul_le_br_edr_hostrN   r³   N)r3   r4   r5   r8   r   rI   r0   r0   r0   r1   rP  ø  s   þÿÿrP  c                   @   s*   e Zd ZdZeddeddƒejd�gZdS )Ú!EIR_CompleteList16BitServiceUUIDsz%Complete list of 16-bit service UUIDsÚ	svc_uuidsNrë   r   rû   )	r3   r4   r5   r8   r   r)   rL  rü   rI   r0   r0   r0   r1   rT    s
   ÿþrT  c                   @   s   e Zd ZdZdS )Ú#EIR_IncompleteList16BitServiceUUIDsz'Incomplete list of 16-bit service UUIDsNr  r0   r0   r0   r1   rV    s   rV  c                   @   s0   e Zd ZdZeddeddejd�ejd�gZ	dS )Ú"EIR_CompleteList128BitServiceUUIDsz&Complete list of 128-bit service UUIDsrU  Nrë   rÔ   rû   )
r3   r4   r5   r8   r   r   rÕ   rL  rü   rI   r0   r0   r0   r1   rW    s   þÿrW  c                   @   s   e Zd ZdZdS )Ú$EIR_IncompleteList128BitServiceUUIDsz(Incomplete list of 128-bit service UUIDsNr  r0   r0   r0   r1   rX    s   rX  c                   @   s"   e Zd ZdZeddejd�gZdS )ÚEIR_CompleteLocalNamezComplete Local NameZ
local_namerÁ   rû   NrO  r0   r0   r0   r1   rY    s   ÿrY  c                   @   s   e Zd ZdZdS )ÚEIR_ShortenedLocalNamezShortened Local NameNr  r0   r0   r0   r1   rZ  #  s   rZ  c                   @   s   e Zd ZdZeddƒgZdS )ÚEIR_TX_Power_LevelzTX Power LevelÚlevelr   N)r3   r4   r5   r8   r   rI   r0   r0   r0   r1   r[  '  s   r[  c                   @   s>   e Zd ZdZeddƒgZi Zed
dd„ƒZdd„ Z	dd	„ Z
dS )ÚEIR_Manufacturer_Specific_DatazEIR Manufacturer Specific DataZ
company_idNc                 C   s6   |du r(t |dƒr|j}ntd |¡ƒ‚|| j|< dS )ao  
        Registers a payload type that uses magic data.

        Traditional payloads require registration of a Bluetooth Company ID
        (requires company membership of the Bluetooth SIG), or a Bluetooth
        Short UUID (requires a once-off payment).

        There are alternatives which don't require registration (such as
        128-bit UUIDs), but the biggest consumer of energy in a beacon is the
        radio -- so the energy consumption of a beacon is proportional to the
        number of bytes in a beacon frame.

        Some beacon formats side-step this issue by using the Company ID of
        their beacon hardware manufacturer, and adding a "magic data sequence"
        at the start of the Manufacturer Specific Data field.

        Examples of this are AltBeacon and GeoBeacon.

        For an example of this method in use, see ``scapy.contrib.altbeacon``.

        :param Type[scapy.packet.Packet] payload_cls:
            A reference to a Packet subclass to register as a payload.
        :param Callable[[bytes], bool] magic_check:
            (optional) callable to use to if a payload should be associated
            with this type. If not supplied, ``payload_cls.magic_check`` is
            used instead.
        :raises TypeError: If ``magic_check`` is not specified,
                           and ``payload_cls.magic_check`` is not implemented.
        NÚmagic_checkz>magic_check not specified, and {} has no attribute magic_check)Úhasattrr^  Ú	TypeErrorrâ   Úregistered_magic_payloads)rò   Zpayload_clsr^  r0   r0   r1   Úregister_magic_payload5  s    
ÿz5EIR_Manufacturer_Specific_Data.register_magic_payloadc                 C   s2   t  tj¡D ]\}}||ƒr|  S qt | |¡S r*   )r(   Ú	iteritemsr]  ra  r   Údefault_payload_class)r-   r©   rò   Úcheckr0   r0   r1   rd  ]  s    ÿ
z4EIR_Manufacturer_Specific_Data.default_payload_classc                 C   s&   t  | ¡d }|d |… ||d … fS rè   ©rL  rü   ©r-   rÐ   Úplenr0   r0   r1   rÑ   e  s    z.EIR_Manufacturer_Specific_Data.extract_padding)N)r3   r4   r5   r8   r)   rI   ra  r÷   rb  rd  rÑ   r0   r0   r0   r1   r]  ,  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 )ÚEIR_Device_IDz	Device IDZvendor_id_sourcer   Z	vendor_idZ
product_idÚversionNrà   r0   r0   r0   r1   ri  k  s   üri  c                   @   s$   e Zd ZdZeddƒgZdd„ ZdS )ÚEIR_ServiceData16BitUUIDzEIR Service Data - 16-bit UUIDZsvc_uuidNc                 C   s&   t  | ¡d }|d |… ||d … fS rè   rf  rg  r0   r0   r1   rÑ   |  s    z(EIR_ServiceData16BitUUID.extract_paddingrÒ   r0   r0   r0   r1   rk  u  s   þrk  c                   @   s8   e Zd ZdZeddƒedddd�gZdd	„ Zd
d„ ZdS )ÚHCI_Command_HdrzHCI Command headerrÉ   r   rB   NrG  ©rH  c                 C   s   dS ©NFr0   r«   r0   r0   r1   rª   ‡  s    zHCI_Command_Hdr.answersc                 C   s>   ||7 }| j d u r:|d d… t dt |ƒ¡ |dd …  }|S )NrM   rG  rN   rœ   rŸ   r0   r0   r1   r¡   Š  s    
(zHCI_Command_Hdr.post_build)	r3   r4   r5   r8   r)   r   rI   rª   r¡   r0   r0   r0   r1   rl  ‚  s   ÿrl  c                   @   s   e Zd ZdZdS )ÚHCI_Cmd_ResetZResetNr  r0   r0   r0   r1   ro  ‘  s   ro  c                   @   s"   e Zd ZdZeddddiƒgZdS )ÚHCI_Cmd_Set_Event_FilterzSet Event Filterr‘   r   ÚclearNr  r0   r0   r0   r1   rp  •  s   rp  c                   @   s   e Zd ZdZeddƒgZdS )ÚHCI_Cmd_Connect_Accept_TimeoutzConnection Attempt TimeoutÚtimeouti }  Nr¸   r0   r0   r0   r1   rr  š  s   rr  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚHCI_Cmd_LE_Host_SupportedzLE Host SupportedÚ	supportedrL   ZsimultaneousNr   r0   r0   r0   r1   rt  Ÿ  s   ÿrt  c                   @   s   e Zd ZdZedddƒgZdS )ÚHCI_Cmd_Set_Event_MaskzSet Event MaskÚmasks   ÿÿûÿø¿=rT   Nr4  r0   r0   r0   r1   rv  ¥  s   rv  c                   @   s   e Zd ZdZdS )ÚHCI_Cmd_Read_BD_AddrúRead BD AddrNr  r0   r0   r0   r1   rx  ª  s   rx  c                   @   s   e Zd ZdZeddƒgZdS )ÚHCI_Cmd_Write_Local_NamezWrite Local Namer8   rÁ   Nr  r0   r0   r0   r1   rz  ®  s   rz  c                   @   s.   e Zd ZdZeddƒedg edd„ d�gZdS )	Ú'HCI_Cmd_Write_Extended_Inquiry_ResponsezWrite Extended Inquiry ResponseZfec_requiredr   Zeir_datac                 C   s   | j S r*   ©rB   ræ   r0   r0   r1   rç   ·  rÎ   z0HCI_Cmd_Write_Extended_Inquiry_Response.<lambda>rû   N)r3   r4   r5   r8   r
   r   rF  rI   r0   r0   r0   r1   r{  ³  s   ÿÿr{  c                
   @   sP   e Zd ZdZeddddiƒeddƒeddƒedd	d	d
iƒedd	dddœƒgZdS )ÚHCI_Cmd_LE_Set_Scan_ParameterszLE Set Scan Parametersr‘   rL   ÚactiveÚintervalrZ   Úwindowr?  r   r@  ÚpolicyÚallÚ	whitelistr  N)r3   r4   r5   r8   r	   r)   rI   r0   r0   r0   r1   r}  º  s   ür}  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚHCI_Cmd_LE_Set_Scan_EnablezLE Set Scan EnableÚenablerL   Zfilter_dupsNr   r0   r0   r0   r1   r„  Ã  s   ÿr„  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚHCI_Cmd_DisconnectZ
Disconnectr™   r   r·   r]   N)r3   r4   r5   r8   r)   r
   rI   r0   r0   r0   r1   r†  É  s   ÿr†  c                   @   sŠ   e Zd ZdZeddƒeddƒeddddiƒed	dd
ddœƒeddƒeddd
ddœƒeddƒeddƒeddƒeddƒeddƒeddƒgZdS )ÚHCI_Cmd_LE_Create_ConnectionzLE Create Connectionr  é`   r€  rz   Úfilterr   rA  Úpatyper@  r6  r  ÚpaddrNr?  rÅ   rr   rÆ   r‚   Úlatencyrs  rt   Úmin_ceÚmax_ce)r3   r4   r5   r8   r   r	   r6   rI   r0   r0   r0   r1   r‡  Ï  s   õr‡  c                   @   s   e Zd ZdZdS )Ú#HCI_Cmd_LE_Create_Connection_CancelzLE Create Connection CancelNr  r0   r0   r0   r1   r�  ß  s   r�  c                   @   s   e Zd ZdZdS )ÚHCI_Cmd_LE_Read_White_List_SizeúLE Read White List SizeNr  r0   r0   r0   r1   r�  ã  s   r�  c                   @   s   e Zd ZdZdS )ÚHCI_Cmd_LE_Clear_White_ListzLE Clear White ListNr  r0   r0   r0   r1   r’  ç  s   r’  c                   @   s,   e Zd ZdZedddddœƒeddƒgZdS )	Ú#HCI_Cmd_LE_Add_Device_To_White_ListzLE Add Device to White Listr?  r   r@  r6  r  rA  NrB  r0   r0   r0   r1   r“  ë  s   ÿr“  c                   @   s   e Zd ZdZdS )Ú(HCI_Cmd_LE_Remove_Device_From_White_Listz LE Remove Device from White ListNr  r0   r0   r0   r1   r”  ñ  s   r”  c                	   @   sL   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
ƒgZdS )ÚHCI_Cmd_LE_Connection_UpdatezLE Connection Updater™   r   rÅ   rÆ   rŒ  rs  r�  rŽ  rß   Nr  r0   r0   r0   r1   r•  õ  s   úr•  c                   @   s   e Zd ZdZdS )ÚHCI_Cmd_LE_Read_Buffer_SizezLE Read Buffer SizeNr  r0   r0   r0   r1   r–     s   r–  c                   @   s   e Zd ZdZeddƒgZdS )Ú$HCI_Cmd_LE_Read_Remote_Used_FeatureszLE Read Remote Used Featuresr™   rŠ   Nr¸   r0   r0   r0   r1   r—    s   r—  c                   @   s   e Zd ZdZeddƒgZdS )ÚHCI_Cmd_LE_Set_Random_AddresszLE Set Random AddressrA  N©r3   r4   r5   r8   r6   rI   r0   r0   r0   r1   r˜  	  s   r˜  c                   @   s~   e Zd ZdZeddƒeddƒeddddd	d
ddœƒedddddœƒedddddœƒeddƒeddƒedddddddœƒgZdS )Ú%HCI_Cmd_LE_Set_Advertising_ParameterszLE Set Advertising ParametersZinterval_mini   Zinterval_maxZadv_typer   ZADV_INDZADV_DIRECT_INDZADV_SCAN_INDZADV_NONCONN_INDZADV_DIRECT_IND_LOWr(  Zoatyper@  r6  r  ZdatypeZdaddrNZchannel_maprS   Zfilter_policyzall:allzconnect:all scan:whitelistzconnect:whitelist scan:allzall:whitelist)r   rL   rM   rN   )	r3   r4   r5   r8   r   r	   r6   r
   rI   r0   r0   r0   r1   rš    s   ùrš  c                   @   s>   e Zd ZdZeddddd�eedg edd„ d	�d
dd�gZdS )ÚHCI_Cmd_LE_Set_Advertising_DatazLE Set Advertising DatarB   NrÀ   rG  ©Z	length_ofrH  c                 C   s   | j S r*   r|  ræ   r0   r0   r1   rç     rÎ   z(HCI_Cmd_LE_Set_Advertising_Data.<lambda>rû   ri   ó    )ÚalignZpadwith)	r3   r4   r5   r8   r   r   r   rF  rI   r0   r0   r0   r1   r›    s   ÿýÿr›  c                   @   s2   e Zd ZdZeddddd�edddd	„ d
�gZdS )Ú!HCI_Cmd_LE_Set_Scan_Response_DatazLE Set Scan Response DatarB   NrÀ   rG  rœ  rÁ   c                 C   s   | j S r*   r|  ræ   r0   r0   r1   rç   &  rÎ   z*HCI_Cmd_LE_Set_Scan_Response_Data.<lambda>rû   )r3   r4   r5   r8   r   r   rI   r0   r0   r0   r1   rŸ  #  s   ÿrŸ  c                   @   s   e Zd ZdZeddƒgZdS )ÚHCI_Cmd_LE_Set_Advertise_EnablezLE Set Advertise Enabler…  r   Nr   r0   r0   r0   r1   r   )  s   r   c                   @   s8   e Zd ZdZeddƒedddƒeddƒedd	d
ƒgZdS )Ú#HCI_Cmd_LE_Start_Encryption_RequestzLE Start Encryptionr™   r   r<  NrT   r;  r9  r3  rZ   ©r3   r4   r5   r8   r   r   r)   rI   r0   r0   r0   r1   r¡  .  s   

ýr¡  c                   @   s   e Zd ZdZeddƒgZdS )Ú/HCI_Cmd_LE_Long_Term_Key_Request_Negative_Replyz'LE Long Term Key Request Negative Replyr™   r   Nr¸   r0   r0   r0   r1   r£  6  s   r£  c                   @   s&   e Zd ZdZeddƒedddƒgZdS )Ú&HCI_Cmd_LE_Long_Term_Key_Request_ReplyzLE Long Term Key Request Replyr™   r   r9  r3  rZ   N)r3   r4   r5   r8   r   r   rI   r0   r0   r0   r1   r¤  ;  s   
ÿr¤  c                   @   s0   e Zd ZdZeddƒedddd�gZdd	„ ZdS )
ÚHCI_Event_HdrzHCI Event headerr§   r   rB   NrG  rm  c                 C   s   t |vrdS | j |¡S rn  )rl  r©   rª   r«   r0   r0   r1   rª   F  s    zHCI_Event_Hdr.answers)r3   r4   r5   r8   r   r   rI   rª   r0   r0   r0   r1   r¥  A  s
   ÿr¥  c                   @   s2   e Zd ZdZeddddiƒeddƒeddƒgZdS )Ú HCI_Event_Disconnection_CompletezDisconnection Completer´   r   r²   r™   r·   N)r3   r4   r5   r8   r	   r   r   rI   r0   r0   r0   r1   r¦  N  s
   þr¦  c                	   @   s<   e Zd ZdZeddddiƒeddƒeddddd	d
œƒgZdS )ÚHCI_Event_Encryption_ChangezEncryption Changer´   r   zchange has occurredr™   ÚenabledZOFFzON (LE)zON (BR/EDR))r   rL   rM   N©r3   r4   r5   r8   r	   r   rI   r0   r0   r0   r1   r§  U  s
   þr§  c                   @   s6   e Zd ZdZeddƒeddƒeddeƒgZdd„ Z	dS )	ÚHCI_Event_Command_CompletezCommand CompleteÚnumberr   rÉ   r´   c                 C   s   t |vrdS |t  j| jkS rn  ©rl  rÉ   r«   r0   r0   r1   rª   b  s    z"HCI_Event_Command_Complete.answersN)
r3   r4   r5   r8   r
   r)   r	   Ú_bluetooth_error_codesrI   rª   r0   r0   r0   r1   rª  \  s   
þrª  c                   @   s   e Zd ZdZeddƒgZdS )ÚHCI_Cmd_Complete_Read_BD_Addrry  ÚaddrNr™  r0   r0   r0   r1   r®  i  s   r®  c                   @   s$   e Zd ZdZeddƒeddƒgZdS )Ú(HCI_Cmd_Complete_LE_Read_White_List_Sizer‘  r´   r   ÚsizeNr   r0   r0   r0   r1   r°  n  s   ÿr°  c                   @   s:   e Zd ZdZeddddiƒeddƒeddƒgZdd	„ ZdS )
ÚHCI_Event_Command_StatuszCommand Statusr´   r   Úpendingr«  rÉ   Nc                 C   s   t |vrdS |t  j| jkS rn  r¬  r«   r0   r0   r1   rª   z  s    z HCI_Event_Command_Status.answers)	r3   r4   r5   r8   r	   r
   r)   rI   rª   r0   r0   r0   r1   r²  t  s   þr²  c                   @   s   e Zd ZdZeddƒgZdS )Ú%HCI_Event_Number_Of_Completed_PacketszNumber Of Completed Packetsr«  r   Nr   r0   r0   r0   r1   r´  �  s   r´  c                   @   s0   e Zd ZdZedddddddœƒgZd	d
„ ZdS )ÚHCI_Event_LE_MetazLE MetaÚeventr   Zconnection_completeZadvertising_reportZconnection_update_completeZlong_term_key_request)rL   rM   rN   rP   c                 C   s   | j s
dS | j  |¡S rn  )r©   rª   r«   r0   r0   r1   rª   �  s    zHCI_Event_LE_Meta.answersN)r3   r4   r5   r8   r	   rI   rª   r0   r0   r0   r1   rµ  †  s   ü
rµ  c                   @   sx   e Zd ZdZeddddiƒeddƒeddddiƒeddd	d
dœƒeddƒeddƒeddƒeddƒeddƒg	Zdd„ Z	dS )ÚHCI_LE_Meta_Connection_CompletezConnection Completer´   r   r²   r™   ZroleZmasterrŠ  r@  r6  r  r‹  Nr  r€   rŒ  Zsupervisionrt   Zclock_latencyrP   c                 C   s,   t |vrdS |t  j| jko*|t  j| jkS rn  )r‡  rŠ  r‹  r«   r0   r0   r1   rª   £  s
    ÿz'HCI_LE_Meta_Connection_Complete.answers)
r3   r4   r5   r8   r	   r   r6   r   rI   rª   r0   r0   r0   r1   r·  —  s   ø
r·  c                   @   sB   e Zd ZdZeddddiƒeddƒeddƒeddƒed	d
ƒgZdS )Ú&HCI_LE_Meta_Connection_Update_CompletezConnection Update Completer´   r   r²   r™   r  r€   rŒ  rs  rt   Nr©  r0   r0   r0   r1   r¸  «  s   ür¸  c                
   @   sl   e Zd ZdZedddddœƒedddd	d
œƒeddƒeddddd�edg edd„ d�e	ddƒgZ
dd„ ZdS )ÚHCI_LE_Meta_Advertising_ReportzAdvertising Reportr‘   r   Zconn_undZscan_rsp)r   rO   r?  r@  r6  r  r¯  NrB   rÀ   rG  rœ  c                 C   s   | j S r*   r|  ræ   r0   r0   r1   rç   »  rÎ   z'HCI_LE_Meta_Advertising_Report.<lambda>rû   Zrssic                 C   s   d|fS )NrÁ   r0   rÏ   r0   r0   r1   rÑ   ¾  s    z.HCI_LE_Meta_Advertising_Report.extract_padding)r3   r4   r5   r8   r	   r6   r   r   rF  r   rI   rÑ   r0   r0   r0   r1   r¹  ´  s   ÿúr¹  c                   @   s4   e Zd ZdZeddddd�eddedd„ d	�gZdS )
ÚHCI_LE_Meta_Advertising_ReportszAdvertising ReportsrB   NZreportsrG  )Zcount_ofrH  c                 C   s   | j S r*   r|  ræ   r0   r0   r1   rç   Ç  rÎ   z(HCI_LE_Meta_Advertising_Reports.<lambda>)Z
count_from)r3   r4   r5   r8   r   r   r¹  rI   r0   r0   r0   r1   rº  Â  s   þÿrº  c                   @   s.   e Zd ZdZeddƒedddƒeddƒgZdS )Ú!HCI_LE_Meta_Long_Term_Key_RequestzLong Term Key Requestr™   r   r<  NrT   r;  r¢  r0   r0   r0   r1   r»  Ê  s
   
þr»  rL   rÃ   rM   rO   i  )rÉ   i  i  i  im  iR  i	  i  i   i   i   i   i	   i
   i   i   i  i   i   i   i   i   i   i   i   i   i   i   rP   )r§   rT   rQ   rR   r]   rˆ   )r¶  rN   r>   rS   rU   rZ   rV   r`   rK  )r£   rW   r\   rX   rY   r[   ra   rb   rc   éR   re   rg   )r  c                   @   s>   e Zd ZdZeƒ eddgd� gZdd„ Zdd„ Zd	d
„ Z	dS )ÚLowEnergyBeaconHelpera  
    Helpers for building packets for Bluetooth Low Energy Beacons.

    Implementors provide a :meth:`build_eir` implementation.

    This is designed to be used as a mix-in -- see
    ``scapy.contrib.eddystone`` and ``scapy.contrib.ibeacon`` for examples.
    rR  rS  )rº   c                 C   s   t dƒ‚dS )zú
        Builds a list of EIR messages to wrap this frame.

        Users of this helper must implement this method.

        :return: List of HCI_Hdr with payloads that describe this beacon type
        :rtype: list[scapy.bluetooth.HCI_Hdr]
        Ú	build_eirN)ÚNotImplementedErrorrE   r0   r0   r1   r¾  d  s    	zLowEnergyBeaconHelper.build_eirc                 C   s   t dd|  ¡ d�S )z�
        Builds a HCI_LE_Meta_Advertising_Report containing this frame.

        :rtype: scapy.bluetooth.HCI_LE_Meta_Advertising_Report
        r   rL   )r‘   r?  rÀ   )r¹  r¾  rE   r0   r0   r1   Úbuild_advertising_reporto  s
    ýz.LowEnergyBeaconHelper.build_advertising_reportc                 C   s   t ƒ tƒ  t|  ¡ d� S )zÂBuilds a HCI_Cmd_LE_Set_Advertising_Data containing this frame.

        This includes the :class:`HCI_Hdr` and :class:`HCI_Command_Hdr` layers.

        :rtype: scapy.bluetooth.HCI_Hdr
        )rÀ   )r�   rl  r›  r¾  rE   r0   r0   r1   Úbuild_set_advertising_data|  s    ÿz0LowEnergyBeaconHelper.build_set_advertising_dataN)
r3   r4   r5   Ú__doc__rF  rP  Zbase_eirr¾  rÀ  rÁ  r0   r0   r0   r1   r½  V  s   
ÿr½  c                   @   s   e Zd ZdS )ÚBluetoothSocketErrorN©r3   r4   r5   r0   r0   r0   r1   rÃ  �  s   rÃ  c                   @   s   e Zd ZdS )ÚBluetoothCommandErrorNrÄ  r0   r0   r0   r1   rÅ  ‘  s   rÅ  c                   @   s$   e Zd ZdZdd„ Zefdd„ZdS )ÚBluetoothL2CAPSocketz.read/write packets on a connected L2CAP socketc                 C   sB   t rtdƒ d S t tjtjtj¡}| |df¡ | | _| _d S )NúNot available on Windowsr   )	r!   r"   ÚsocketÚAF_BLUETOOTHÚSOCK_RAWÚBTPROTO_L2CAPÚconnectÚinsÚouts)r-   Ú
bt_addressrÐ   r0   r0   r1   r7   ˜  s    ÿzBluetoothL2CAPSocket.__init__c                 C   s   t | j |¡ƒS r*   )r¦   rÍ  Úrecv©r-   r/   r0   r0   r1   rÐ  ¡  s    zBluetoothL2CAPSocket.recvN©r3   r4   r5   Údescr7   r    rÐ  r0   r0   r0   r1   rÆ  •  s   	rÆ  c                   @   s   e Zd ZdZddd„ZdS )ÚBluetoothRFCommSocketz/read/write packets on a connected RFCOMM socketr   c                 C   s2   t   t jt jt j¡}| ||f¡ | | _| _d S r*   )rÈ  rÉ  rÊ  ÚBTPROTO_RFCOMMrÌ  rÍ  rÎ  )r-   rÏ  ÚportrÐ   r0   r0   r1   r7   ¨  s
    ÿzBluetoothRFCommSocket.__init__N)r   )r3   r4   r5   rÂ  r7   r0   r0   r0   r1   rÔ  ¥  s   rÔ  c                   @   s&   e Zd ZdZddd„Zefdd„ZdS )	ÚBluetoothHCISocketz$read/write on a BlueTooth HCI socketé   Nc                 C   s„   t rtdƒ d S t tjtjtj¡}| tjtjd¡ | tjtj	d¡ | tjtj
t ddddd¡¡ | |f¡ | | _| _d S )NrÇ  rL   ZIIIh2xl   ÿÿ r   )r!   r"   rÈ  rÉ  rÊ  ÚBTPROTO_HCIÚ
setsockoptÚSOL_HCIÚHCI_DATA_DIRÚHCI_TIME_STAMPÚ
HCI_FILTERr�   rž   ÚbindrÍ  rÎ  )r-   Zifacer‘   rÐ   r0   r0   r1   r7   ²  s     zBluetoothHCISocket.__init__c                 C   s   t | j |¡ƒS r*   ©r�   rÍ  rÐ  rÑ  r0   r0   r1   rÐ  ¾  s    zBluetoothHCISocket.recv)rØ  NrÒ  r0   r0   r0   r1   r×  ¯  s   
r×  c                   @   s(   e Zd ZdejfdejfdejfgZdS )Úsockaddr_hciÚ
sin_familyÚhci_devÚhci_channelN)r3   r4   r5   ÚctypesZc_ushortZ_fields_r0   r0   r0   r1   rá  Â  s   ýrá  c                   @   sH   e Zd ZdZddd„Zdd„ Zefdd„Zdd	d
„Zdd„ Z	dd„ Z
dS )ÚBluetoothUserSocketz+read/write H4 over a Bluetooth user channelr   c           	      C   sè   t rtdƒ d S t t¡}tj d¡ t d¡}|j}tj	tj	tj	f|_
tj	|_|j}tj	t t¡tj	f|_
tj	|_|dddƒ}|dk r�tdƒ‚tƒ }d|_||_d|_||||ƒt|ƒƒ}|dkrÌtdƒ‚t |ddd¡ | _| _d S )	NrÇ  ú	libc.so.6ri   rN   rL   r   z"Unable to open PF_BLUETOOTH socketzUnable to bind)r!   r"   rå  ZPOINTERrá  ÚcdllÚLoadLibraryÚCDLLrÈ  Úc_intÚargtypesÚrestyperß  rÃ  râ  rã  rä  r   ÚfromfdrÍ  rÎ  )	r-   Zadapter_indexZsockaddr_hcipÚlibcZsocket_crß  rÐ   ÚsaÚrr0   r0   r1   r7   Í  s4    

þzBluetoothUserSocket.__init__c                 C   s\   |j }|  |¡ |  ¡ }|jdkr|jdkr|j |kr|jdkrRtd||jf ƒ‚|S qd S )NrO   rQ   r   zCommand %x failed with %x)rÉ   ÚsendrÐ  r‘   r§   r´   rÅ  )r-   ÚcmdrÉ   rñ  r0   r0   r1   Úsend_commandø  s    

z BluetoothUserSocket.send_commandc                 C   s   t | j |¡ƒS r*   rà  rÑ  r0   r0   r1   rÐ    s    zBluetoothUserSocket.recvc                 C   s&   t   | jgg g |¡\}}}t|ƒdkS )Nr   )ÚselectrÍ  rB   )r-   rs  rÍ  rÎ  Zfoor0   r0   r1   Úreadable  s    zBluetoothUserSocket.readablec                 C   s   |   ¡ r|  ¡  q d S r*   )rö  rÐ  rE   r0   r0   r1   Úflush	  s    zBluetoothUserSocket.flushc                 C   s®   | j r
d S tj d¡ t d¡}|j}tj|_d| _ t| dƒrzt| dƒrT| j	| j
krz| j
rztsl| j
 ¡ dkrz|| j
 ¡ ƒ t| dƒrª| j	rªtsœ| j	 ¡ dkrª|| j	 ¡ ƒ d S )Nrç  TrÎ  rÍ  r:   )Úclosedrå  rè  ré  rê  Úcloserë  rí  r_  rÍ  rÎ  r!   Úfileno)r-   rï  rù  r0   r0   r1   rù    s    


zBluetoothUserSocket.closeN)r   )r   )r3   r4   r5   rÓ  r7   rô  r    rÐ  rö  r÷  rù  r0   r0   r0   r1   ræ  Ê  s   
+

ræ  çš™™™™™¹?c                 O   sZ   d|v rt j| | d¡d�}nt j| d�}t||g|¢R d|i|¤Ž\}}| ¡  ||fS )z)send and receive using a bluetooth socketrÖ  )rÏ  rÖ  )rÏ  Úinter)r   ÚBTsocketÚpopr   rù  )rÏ  Úpktsrü  rô   rõ   rÐ   ÚaÚbr0   r0   r1   Úsrbt&  s     r  c                 O   s8   t | |g|¢R i |¤Ž\}}t|ƒdkr4|d d S dS )z2send and receive 1 packet using a bluetooth socketr   rL   N)r  rB   )rÏ  rÿ  rô   rõ   r   r  r0   r0   r1   Úsrbt12  s    r  )rû  )ÂrÂ  rå  r  rÈ  r�   rõ  r   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   r   r   r   r   r   Zscapy.supersocketr   Zscapy.sendrecvr   r    Zscapy.constsr!   Zscapy.errorr"   Zscapy.utilsr#   r$   r%   Zscapy.volatiler'   Z
scapy.libsr(   r)   r6   rG   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  r  r  r  r  r  r  r  r  r!  r1  r2  r5  r7  r8  r:  r=  r>  rC  rD  rE  rF  rL  rN  rP  rT  rV  rW  rX  rY  rZ  r[  r]  ri  rk  rl  ro  rp  rr  rt  rv  rx  rz  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	raw_layerZl2typesÚregisterr½  ÚBaseExceptionrÃ  rÅ  rÆ  rÔ  r×  Z	Structurerá  ræ  rý  Úcommandsr  r  r0   r0   r0   r1   Ú<module>   sÖ  `#ø¹Kï	
			


;
		?
			


7
W