a
    kÄ#d‹  ã                   @   sú  d Z ddlZddlZddlmZ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 dZ dd	d
ddœZ!dd	iZ"dd„ e #e" $¡ e! $¡ ¡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)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&ƒZ0G d%d&„ d&e&ƒZ1e'e(e-e.e)e/e0e1d'œZ2d	d(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7œZ3G d8d9„ d9e	ƒZ4e
ee4d:d;� e
ee4d:d;� dS )<z¦
    STUN (RFC 8489)

    TLV code derived from the DTP implementation:
      Thanks to Nicolas Bareil,
                Arnaud Ebalard,
                Jochen Bartl.
é    N)ÚUDPÚTCP)Úconf)ÚPacketÚbind_layers)Ú	inet_ntoaÚ	inet_aton)ÚBitFieldÚBitEnumFieldÚLenFieldÚIntFieldÚPadFieldÚStrLenFieldÚPacketListFieldÚXShortFieldÚFieldLenFieldÚ
ShortFieldÚByteEnumFieldÚ	ByteFieldÚXNBytesFieldÚ
XLongFieldÚ	XIntFieldÚ	XBitFieldÚIPFieldiB¤!é   é   é   )ÚrequestZ
indicationzsuccess responsezerror responseZBindingc                 C   sZ   i | ]R\\}}\}}d   ||¡|d@ |d@ d> B |d@ d> B |d@ d> B |d@ d	> B “qS )
z{} {}é   r   é   ép   é   r   é   i€  é	   )Úformat)Ú.0ÚmethodZmethod_codeÚclass_Z
class_code© r(   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/stun.pyÚ
<dictcomp>;   s   ú

ÿ
þ
ý
ür*   c                   @   sV   e Zd ZdZeddƒedddd�eeddd	d
„ d�dd�gZe	ddd„ƒZ
dd„ ZdS )ÚSTUNGenericTlvzSTUN Generic TLVÚtyper   ÚlengthNÚvalue©Z	length_ofÚ c                 C   s   | j S ©N©r-   ©Úpktr(   r(   r)   Ú<lambda>N   ó    zSTUNGenericTlv.<lambda>©Zlength_fromr   ©Úalignc                 O   s8   |r4t |ƒdkr4t d|d d… ¡d }t || ¡S | S )Nr   z!Hr   )ÚlenÚstructÚunpackÚ_stun_tlv_classÚget)ÚclsZ_pktÚargsÚkwargsÚtr(   r(   r)   Údispatch_hookQ   s    zSTUNGenericTlv.dispatch_hookc                 C   s   t jS r1   )r   Zpadding_layer)ÚselfÚpayloadr(   r(   r)   Úguess_payload_classX   s    z"STUNGenericTlv.guess_payload_class)N)Ú__name__Ú
__module__Ú__qualname__Únamer   r   r   r   Úfields_descÚclassmethodrC   rF   r(   r(   r(   r)   r+   H   s   ýr+   c                   @   sB   e Zd ZdZeddƒedddd�eeddd	d
„ d�ddd�gZdS )ÚSTUNUsernamezSTUN Usernamer,   é   r-   NÚusernamer/   r0   c                 C   s   | j S r1   r2   r3   r(   r(   r)   r5   c   r6   zSTUNUsername.<lambda>r7   r   ó    )r9   Zpadwith©	rG   rH   rI   rJ   r   r   r   r   rK   r(   r(   r(   r)   rM   \   s   þýrM   c                   @   s6   e Zd ZdZeddƒeddƒedddƒgZdd	„ Zd
S )ÚSTUNMessageIntegrityzSTUN Message Integrityr,   é   r-   é   Z	hmac_sha1r   c                 C   s   ||7 }|S r1   r(   )rD   r4   Úpayr(   r(   r)   Ú
post_buildr   s    zSTUNMessageIntegrity.post_buildN)	rG   rH   rI   rJ   r   r   r   rK   rV   r(   r(   r(   r)   rR   i   s   
ýrR   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )	ÚSTUNPriorityzSTUN Priorityr,   é$   r-   r   Úpriorityr   N)rG   rH   rI   rJ   r   r   r   rK   r(   r(   r(   r)   rW   w   s
   ýrW   )ZIPv4ZIPv6c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚXorPortc                 C   s   |t d? A S ©Né   ©ÚMAGIC_COOKIE©rD   r4   Úxr(   r(   r)   Úm2i‰   s    zXorPort.m2ic                 C   s   |t d? A S r[   r]   r_   r(   r(   r)   Úi2mŒ   s    zXorPort.i2mN©rG   rH   rI   ra   rb   r(   r(   r(   r)   rZ   ‡   s   rZ   c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚXorIpc                 C   s    t t dt d|¡d tA ¡ƒS )Nú>ir   )r   r;   Úpackr<   r^   r_   r(   r(   r)   ra   ’   s    z	XorIp.m2ic                 C   s(   |d u rdS t  dt  dt|ƒ¡tA ¡S )Ns       re   )r;   rf   r<   r   r^   r_   r(   r(   r)   rb   •   s    z	XorIp.i2mNrc   r(   r(   r(   r)   rd   �   s   rd   c                   @   sF   e Zd ZdZeddƒeddƒeddƒedd	eƒe	d
dƒe
ddƒgZdS )ÚSTUNXorMappedAddresszSTUN XOR Mapped Addressr,   é    r-   rS   ÚRESERVEDr   Úaddress_familyr   ZxportZxipN)rG   rH   rI   rJ   r   r   r   r   Ú_xor_mapped_address_familyrZ   rd   rK   r(   r(   r(   r)   rg   ›   s   
úrg   c                   @   s@   e Zd ZdZeddƒedddd�eeddd	d
„ d�dd�gZdS )ÚSTUNUseCandidatezSTUN Use Candidater,   é%   r-   r   r.   r/   r0   c                 C   s   | j S r1   r2   r3   r(   r(   r)   r5   ®   r6   zSTUNUseCandidate.<lambda>r7   r   r8   NrQ   r(   r(   r(   r)   rl   ¨   s
   ýrl   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )ÚSTUNFingerprintzSTUN Fingerprintr,   é(€  r-   r   Zcrc_32N)rG   rH   rI   rJ   r   r   r   rK   r(   r(   r(   r)   rn   ²   s
   ýrn   c                   @   s,   e Zd ZdZeddƒeddƒeddƒgZdS )ÚSTUNIceControllingzSTUN ICE-controllingr,   é*€  r-   rS   Ztie_breakerN)rG   rH   rI   rJ   r   r   r   rK   r(   r(   r(   r)   rp   ¼   s
   ýrp   c                   @   s4   e Zd ZdZeddƒeddƒeddƒedd	ƒgZd
S )ÚSTUNGoogNetworkInfozSTUN Google Network Infor,   éWÀ  r-   r   Z
network_idr   Znetwork_costiç  N)rG   rH   rI   rJ   r   r   rK   r(   r(   r(   r)   rr   Æ   s   ürr   )rN   rS   rh   rm   rX   ro   rq   rs   rN   rS   r#   é
   rT   é   rh   rX   rm   i"€  i#€  ro   i)€  rq   rs   )zMAPPED-ADDRESSÚUSERNAMEzMESSAGE-INTEGRITYz
ERROR-CODEzUNKNOWN-ATTRIBUTESZREALMZNONCEzXOR-MAPPED-ADDRESSZPRIORITYzUSE-CANDIDATEZSOFTWAREzALTERNATE-SERVERZFINGERPRINTzICE-CONTROLLEDzICE-CONTROLLINGzGOOG-NETWORK-INFOc                	   @   s\   e Zd ZdZedddd�edddeƒed	dd
d�ede	ƒe
dddƒedg eƒgZdd„ ZdS )ÚSTUNr0   ri   r   r   )ÚsizeZstun_message_typeNé   r-   ú!h)ÚfmtZmagic_cookieZtransaction_idé`   Ú
attributesc                 C   sX   ||7 }| j d u r>|d d… t dt|ƒd ¡ |dd …  }| jD ]}t|tƒrDqD|S )Nr   rz   rT   r   )r-   r;   rf   r:   ZtlvlistÚ
isinstancerR   )rD   r4   rU   Úattrr(   r(   r)   rV   ü   s    
,

zSTUN.post_build)rG   rH   rI   Údescriptionr	   r
   Ú_stun_message_typer   r   r^   r   r   r+   rK   rV   r(   r(   r(   r)   rw   ð   s   

ú	rw   i–  )Údport)5Ú__doc__r;   Ú	itertoolsZscapy.layers.inetr   r   Zscapy.configr   Zscapy.packetr   r   Zscapy.utilsr   r   Zscapy.fieldsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r^   Z_stun_classZ_stun_methodÚproductÚitemsr�   r+   rM   rR   rW   rk   rZ   rd   rg   rl   rn   rp   rr   r=   Z_stun_tlv_attribute_typesrw   r(   r(   r(   r)   Ú<module>
   sz   Lüÿøþ	


øð