a
    kÄ#d}2  ã                8   @   sÚ  d Z ddlmZ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 ddlmZ ddlmZ ddlmZmZ ddlmZ ddl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.dZ/dZ0dZ1d Z2d!Z3d"Z4d#Z5dZ6d	Z7d
Z8d$Z9dZ:d	Z;d
Z<d$Z=dZ>d	Z?d
Z@d$ZAG d%d&„ d&eƒZBG d'd(„ d(eƒZCed)ed*ed+ed,ed-ed.e d/e!d0e"d1e#d2e$d3e%d4e&d5e'd6e(d7e)d8e*d9e+d:e,d;e-d<e.d=e/d>e0d?e1d@e2dAe3dBe4dCe5dDiZDe6dEe7dFe8dGe9dHiZEe:dIe;dJe<dKe=dLiZFe>dMe?dNe@dOeAdPiZGedQdd	ƒedRe6d
eEƒedSdd	ƒedTdd	ƒedUdd	ƒedVe:d
eFƒgZHdWdX„ ZIdYdZ„ ZJG d[d\„ d\eƒZKG d]d^„ d^eƒZLG d_d`„ d`eƒZMG dadb„ dbeƒZNG dcdd„ ddeƒZOG dedf„ dfeƒZPG dgdh„ dheƒZQG didj„ djeƒZRG dkdl„ dleƒZSG dmdn„ dneƒZTG dodp„ dpeƒZUG dqdr„ dreƒZVG dsdt„ dteƒZWG dudv„ dveƒZXG dwdx„ dxeƒZYG dydz„ dzeƒ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ŽeƒZdG d�d�„ d�eƒZeG d‘d’„ d’eƒZfG d“d”„ d”eƒZgeeeKd•d–� eeeKd•d—� eeeKd•d•d˜� eeKeLed™� eeKeMed™� eeKeNed™� eeKeOed™� eeKePed™� eeKeQed™� eeKeRe d™� eeKeSe!d™� eeKeTe"d™� eeKeUe#d™� eeKeVe$d™� eeKeWe%d™� eeKeXe&d™� eeKeYe'd™� eeKeZe(d™� eeKe[e)d™� eeKe\e*d™� eeKe]e+d™� eeKe^e,d™� eeKe_e-d™� eeKe`e.d™� eeKeae/d™� eeKebe0d™� eeKece1d™� eeKede2d™� eeKeee3d™� eeKefe4d™� eeKege5d™� eegeKƒ dS )šz}
MQTT for Sensor Networks (MQTT-SN)

Specification:
http://www.mqtt.org/new/wp-content/uploads/2009/06/MQTT-SN_spec_v1.2.pdf
é    )ÚPacketÚbind_layersÚbind_bottom_up)
ÚBitFieldÚBitEnumFieldÚ	ByteFieldÚByteEnumFieldÚConditionalFieldÚFieldLenFieldÚ
ShortFieldÚStrFixedLenFieldÚStrLenFieldÚXByteEnumField)ÚUDP)ÚScapy_Exception)ÚchbÚorb)ÚRandNumNé   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   éþ   é   c                       s8   e Zd ZdZdd„ Zdd„ Zdd„ Z‡ fdd	„Z‡  ZS )
ÚVariableFieldLenFielda  
    MQTT-SN length field either has 1 byte for values [0x02, 0xff] or 3 bytes
    for values [0x0100, 0xffff]. If the first byte is 0x01 the length value
    comes in network byte-order in the next 2 bytes. MQTT-SN packets are at
    least 2 bytes long (length field + type field).
    c                 C   sZ   |   ||¡}|dk s|dkr.td| jj ƒ‚n(|dkrJ|d t d|¡ S |t|ƒ S d S )Nr   éÿÿ  z%s: invalid length field valueéÿ   ó   z!H)Zi2mr   Ú	__class__Ú__name__ÚstructÚpackr   )ÚselfÚpktÚsÚval© r<   úK/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/mqttsn.pyÚaddfieldS   s    ÿzVariableFieldLenField.addfieldc                 C   sp   t |d ƒdkrTt|ƒdk r,td| jj ƒ‚|dd … t |d ƒd> t |d ƒB fS |dd … t |d ƒfS d S )Nr   r   r/   z%s: malformed length fieldr   r   )r   Úlenr   r4   r5   )r8   r9   r:   r<   r<   r=   Úgetfield]   s    ÿ(zVariableFieldLenField.getfieldc                 C   s   t ƒ S ©N)ÚRandVariableFieldLen©r8   r<   r<   r=   Úrandvalf   s    zVariableFieldLenField.randvalc                    s   t t| ƒj|i |¤Ž d S rA   )Úsuperr0   Ú__init__)r8   ÚargsÚkwargs©r4   r<   r=   rF   i   s    zVariableFieldLenField.__init__)	r5   Ú
__module__Ú__qualname__Ú__doc__r>   r@   rD   rF   Ú__classcell__r<   r<   rI   r=   r0   L   s
   
	r0   c                       s   e Zd Z‡ fdd„Z‡  ZS )rB   c                    s   t t| ƒ dd¡ d S )Nr   r1   )rE   rB   rF   rC   rI   r<   r=   rF   n   s    zRandVariableFieldLen.__init__)r5   rJ   rK   rF   rM   r<   r<   rI   r=   rB   m   s   rB   Ú	ADVERTISEÚSEARCHGWÚGWINFOÚCONNECTÚCONNACKÚWILLTOPICREQÚ	WILLTOPICÚ
WILLMSGREQÚWILLMSGÚREGISTERÚREGACKÚPUBLISHÚPUBACKÚPUBCOMPÚPUBRECÚPUBRELÚ	SUBSCRIBEÚSUBACKÚUNSUBSCRIBEÚUNSUBACKÚPINGREQÚPINGRESPÚ
DISCONNECTÚWILLTOPICUPDÚWILLTOPICRESPÚ
WILLMSGUPDÚWILLMSGRESPzEncapsulated messagezFire and ForgetzAcknowledged deliverzAssured DeliveryzNo Connection requiredz	Normal IDzPre-defined IDzShort Topic NameÚReservedÚAcceptedzRejected: congestionzRejected: invalid topic IDzRejected: not supportedÚdupZqosÚretainZwillZ	cleansessÚtid_typec                    s   ‡ fdd„}|S )Nc                    sb   t | jdƒrP| jjdkr(| jjˆ  d S | jjdkrP| jjdk rP| jjˆ  d S t| jƒˆ  d S )Nr?   r2   r   r   r1   r   )ÚhasattrÚ
underlayerr?   Úpayload©r9   ©Ú
size_untilr<   r=   Úfun¶   s    z _mqttsn_length_from.<locals>.funr<   )rs   rt   r<   rr   r=   Ú_mqttsn_length_fromµ   s    ru   c                 C   sx   |t | jƒ }| jtkr4t| jdd ƒd u r4|d8 }n0| jtkrdt| jdd ƒd urd|t | jjƒ d }|dkrt|d7 }|S )NÚdurationr   Ú	w_node_idr   r2   )r?   rp   Útyperd   ÚgetattrÚ
ENCAPS_MSGrw   )r9   ÚxÚresr<   r<   r=   Ú_mqttsn_len_adjustÁ   s    
ÿ

ÿr}   c                   @   s,   e Zd ZdZeddded�eddeƒgZdS )ÚMQTTSNzMQTT-SN headerr?   N)Z	length_ofÚadjustrx   r   )	r5   rJ   rK   Únamer0   r}   r   ÚPACKET_TYPEÚfields_descr<   r<   r<   r=   r~   Î   s   ÿ
úr~   c                   @   s$   e Zd ZdZeddƒeddƒgZdS )ÚMQTTSNAdvertisezMQTT-SN advertise gatewayÚgw_idr   rv   N)r5   rJ   rK   r€   r   r   r‚   r<   r<   r<   r=   rƒ   Ú   s   þrƒ   c                   @   s   e Zd ZdZeddƒgZdS )ÚMQTTSNSearchGWzMQTT-SN search gatewayÚradiusr   N)r5   rJ   rK   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dƒd�gZdS )	ÚMQTTSNGwInfozMQTT-SN gateway infor„   r   Zgw_addrÚ r   ©Zlength_fromN)r5   rJ   rK   r€   r   r   ru   r‚   r<   r<   r<   r=   r‡   é   s   þr‡   c                   @   s8   e Zd ZdZeeddƒeddƒeddedƒd	�g Z	d
S )ÚMQTTSNConnectzMQTT-SN connect commandZprot_idr   rv   r   Ú	client_idrˆ   r   r‰   N)
r5   rJ   rK   r€   ÚFLAG_FIELDSr   r   r   ru   r‚   r<   r<   r<   r=   rŠ   ñ   s   ýrŠ   c                   @   s   e Zd ZdZedeeƒgZdS )ÚMQTTSNConnackzMQTT-SN connect ACKÚreturn_codeN©r5   rJ   rK   r€   r   ÚACCEPTEDÚRETURN_CODESr‚   r<   r<   r<   r=   r�   ú   s   
ÿr�   c                   @   s   e Zd ZdZdS )ÚMQTTSNWillTopicReqzMQTT-SN will topic requestN©r5   rJ   rK   r€   r<   r<   r<   r=   r’     s   r’   c                   @   s(   e Zd ZdZeeddedƒd�g ZdS )ÚMQTTSNWillTopiczMQTT-SN will topicÚ
will_topicrˆ   r   r‰   N©r5   rJ   rK   r€   rŒ   r   ru   r‚   r<   r<   r<   r=   r”     s   ÿr”   c                   @   s   e Zd ZdZdS )ÚMQTTSNWillMsgReqzMQTT-SN will message requestNr“   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 )ÚMQTTSNWillMsgzMQTT-SN will messageÚwill_msgrˆ   r   r‰   N©r5   rJ   rK   r€   r   ru   r‚   r<   r<   r<   r=   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 )
ÚMQTTSNRegisterzMQTT-SN registerÚtidr   ÚmidÚ
topic_namerˆ   r   r‰   N)r5   rJ   rK   r€   r   r   ru   r‚   r<   r<   r<   r=   r›     s
   ýr›   c                   @   s.   e Zd ZdZeddƒeddƒedeeƒgZdS )ÚMQTTSNRegackzMQTT-SN register ACKrœ   r   r�   rŽ   N©	r5   rJ   rK   r€   r   r   r�   r‘   r‚   r<   r<   r<   r=   rŸ      s
   
ýrŸ   c                   @   s8   e Zd ZdZeeddƒeddƒeddedƒd�g Zd	S )
ÚMQTTSNPublishzMQTT-SN publish messagerœ   r   r�   Údatarˆ   r   r‰   N)	r5   rJ   rK   r€   rŒ   r   r   ru   r‚   r<   r<   r<   r=   r¡   )  s   ýr¡   c                   @   s.   e Zd ZdZeddƒeddƒedeeƒgZdS )ÚMQTTSNPubackzMQTT-SN publish ACKrœ   r   r�   rŽ   Nr    r<   r<   r<   r=   r£   2  s
   
ýr£   c                   @   s   e Zd ZdZeddƒgZdS )ÚMQTTSNPubcompzMQTT-SN publish completer�   r   N©r5   rJ   rK   r€   r   r‚   r<   r<   r<   r=   r¤   ;  s   ÿr¤   c                   @   s   e Zd ZdZeddƒgZdS )ÚMQTTSNPubreczMQTT-SN publish receivedr�   r   Nr¥   r<   r<   r<   r=   r¦   B  s   ÿr¦   c                   @   s   e Zd ZdZeddƒgZdS )ÚMQTTSNPubrelzMQTT-SN publish releaser�   r   Nr¥   r<   r<   r<   r=   r§   I  s   ÿr§   c                
   @   sb   e Zd ZdZeeddƒeeddƒdd„ ƒeeddd	d
�dd„ ƒeedde	dƒd�dd„ ƒg Z
dS )ÚMQTTSNSubscribezMQTT-SN subscribe requestr�   r   rœ   Nc                 C   s
   | j dkS ©Nr   ©rm   rq   r<   r<   r=   Ú<lambda>U  ó    zMQTTSNSubscribe.<lambda>Úshort_topicr   ©Úlengthc                 C   s
   | j dkS ©Nr   rª   rq   r<   r<   r=   r«   W  r¬   rž   r/   r‰   c                 C   s
   | j dvS ©N)r   r   rª   rq   r<   r<   r=   r«   Z  r¬   ©r5   rJ   rK   r€   rŒ   r   r	   r   r   ru   r‚   r<   r<   r<   r=   r¨   P  s   
ÿÿÿþúr¨   c                   @   s2   e Zd ZdZeeddƒeddƒedeeƒg Z	dS )ÚMQTTSNSubackzMQTT-SN subscribe ACKrœ   r   r�   rŽ   N)
r5   rJ   rK   r€   rŒ   r   r   r�   r‘   r‚   r<   r<   r<   r=   r³   ^  s   
ýr³   c                
   @   sb   e Zd ZdZeeddƒeeddƒdd„ ƒeeddd	d
�dd„ ƒeedde	dƒd�dd„ ƒg Z
dS )ÚMQTTSNUnsubscribezMQTT-SN unsubscribe requestr�   r   rœ   Nc                 C   s
   | j dkS r©   rª   rq   r<   r<   r=   r«   l  r¬   zMQTTSNUnsubscribe.<lambda>r­   r   r®   c                 C   s
   | j dkS r°   rª   rq   r<   r<   r=   r«   n  r¬   rž   r/   r‰   c                 C   s
   | j dvS r±   rª   rq   r<   r<   r=   r«   q  r¬   r²   r<   r<   r<   r=   r´   g  s   
ÿÿÿþúr´   c                   @   s   e Zd ZdZeddƒgZdS )ÚMQTTSNUnsubackzMQTT-SN unsubscribe ACKr�   r   Nr¥   r<   r<   r<   r=   rµ   u  s   ÿrµ   c                   @   s$   e Zd ZdZeddedƒd�gZdS )ÚMQTTSNPingReqzMQTT-SN ping requestr‹   rˆ   r   r‰   Nrš   r<   r<   r<   r=   r¶   |  s   ÿr¶   c                   @   s   e Zd ZdZdS )ÚMQTTSNPingRespzMQTT-SN ping responseNr“   r<   r<   r<   r=   r·   ƒ  s   r·   c                   @   s&   e Zd ZdZeeddƒdd„ ƒgZdS )ÚMQTTSNDisconnectzMQTT-SN disconnect requestrv   Nc                 C   s$   t | jdƒo"| jjd u p"| jjdkS )Nr?   r   )rn   ro   r?   rq   r<   r<   r=   r«   Œ  s   zMQTTSNDisconnect.<lambda>)r5   rJ   rK   r€   r	   r   r‚   r<   r<   r<   r=   r¸   ‡  s   þÿr¸   c                   @   s(   e Zd ZdZeeddedƒd�g ZdS )ÚMQTTSNWillTopicUpdzMQTT-SN will topic updater•   rˆ   r   r‰   Nr–   r<   r<   r<   r=   r¹   ’  s   ÿr¹   c                   @   s   e Zd ZdZedeeƒgZdS )ÚMQTTSNWillTopicRespzMQTT-SN will topic responserŽ   Nr�   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 )ÚMQTTSNWillMsgUpdzMQTT-SN will message updater™   rˆ   r   r‰   Nrš   r<   r<   r<   r=   r»      s   ÿr»   c                   @   s   e Zd ZdZedeeƒgZdS )ÚMQTTSNWillMsgRespzMQTT-SN will message responserŽ   Nr�   r<   r<   r<   r=   r¼   §  s   
ÿr¼   c                   @   s8   e Zd ZdZedddƒedddƒedded	ƒd
�gZdS )ÚMQTTSNEncapszMQTT-SN encapsulated messageZresvdr   r   r†   r   rw   rˆ   r   r‰   N)r5   rJ   rK   r€   r   r   ru   r‚   r<   r<   r<   r=   r½   ®  s   

þýr½   i[  )Úsport)Údport)r¿   r¾   )rx   )hrL   Zscapy.packetr   r   r   Zscapy.fieldsr   r   r   r   r	   r
   r   r   r   r   Zscapy.layers.inetr   Zscapy.errorr   Zscapy.compatr   r   Zscapy.volatiler   r6   rN   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r\   r]   r^   r_   r`   ra   rb   rc   rd   re   rf   rg   rh   rz   ZQOS_0ZQOS_1ZQOS_2ZQOS_NEG1Z
TID_NORMALZ
TID_PREDEFZ	TID_SHORTZ	TID_RESVDr�   ZREJ_CONJZREJ_TIDZ
REJ_NOTSUPr0   rB   r�   Z
QOS_LEVELSZTOPIC_ID_TYPESr‘   rŒ   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=   Ú<module>   sF  0!ä!ü	ü	ü	



ú
						