a
    kÄ#d  ã                   @   sn  d Z ddlZddlmZmZmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZ 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"œZd#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2œd3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBœfZdCdD„ ZdEdF„ ZdGdH„ ZdIdJ„ ZdKdL„ ZG dMdN„ dNeƒZG dOdP„ dPeƒZG dQdR„ dReƒZG dSdT„ dTeƒZeeedUdV� eeedUdW� dS )XzD
RFC 7252 - Constrained Application Protocol (CoAP) layer for Scapy
é    N)ÚBitEnumFieldÚBitFieldÚBitFieldLenFieldÚByteEnumFieldÚ
ShortFieldÚStrFieldÚStrLenField)ÚUDP)ÚPacketÚbind_layers©Úwarning)ÚrawÚEmptyÚGETÚPOSTÚPUTÚDELETEz2.01 Createdz2.02 Deletedz
2.03 Validz2.04 Changedz2.05 Contentz4.00 Bad Requestz4.01 Unauthorizedz4.02 Bad Optionz4.03 Forbiddenz4.04 Not Foundz4.05 Method Not Allowedz4.06 Not Acceptablez4.12 Precondition Failedz4.13 Request Entity Too Largez4.15 Unsupported Content-Formatz5.00 Internal Server Errorz5.01 Not Implementedz5.02 Bad Gatewayz5.03 Service Unavailablez5.04 Gateway TimeoutzProxying Not Supported)r   é   é   é   é   éA   éB   éC   éD   éE   é€   é�   é‚   éƒ   é„   é…   é†   éŒ   é�   é�   é    é¡   é¢   é£   é¤   é¥   úIf-MatchúUri-HostÚETagúIf-None-MatchúUri-PortúLocation-PathúUri-PathúContent-FormatúMax-Ageú	Uri-QueryÚAcceptúLocation-Queryú	Proxy-UriúProxy-SchemeÚSize1)r   r   r   é   é   é   é   é   é   é   é   é   é#   é'   é<   r   r   r   r<   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   )r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   c                 C   s,   | dkrt dƒ | dkrdS | dkr(dS dS )NrB   zInvalid Option Delta or LengthrA   r   é   r   r   r   ©Úval© rK   úI/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/contrib/coap.pyÚ_get_ext_field_sizeX   s    rM   c                 C   s
   t | jƒS ©N)rM   Údelta©ÚpktrK   rK   rL   Ú_get_delta_ext_sizeb   s    rR   c                 C   s
   t | jƒS rN   )rM   ÚlenrP   rK   rK   rL   Ú_get_len_ext_sizef   s    rT   c                 C   sP   | dkrt d|  ƒ | dkr0dt d|¡d  S | dkrLdt d|¡d  S | S )	NrB   z!Invalid Option Length or Delta %drA   é  ÚHr   rH   ÚB)r   ÚstructÚunpack)rJ   Zext_valrK   rK   rL   Ú_get_abs_valj   s    rZ   c                 C   s   t | j| jƒS rN   )rZ   rS   Úlen_extrP   rK   rK   rL   Ú_get_opt_val_sizet   s    r\   c                	   @   sd   e Zd Zedddƒedddƒedded�edded�ed	ded�gZe	d
d„ ƒZ
dd„ Zdd„ ZdS )Ú_CoAPOptrO   r   r   rS   Ú	delta_extN©Zlength_fromr[   Úopt_valc                 C   s@   | dkrt  d| d ¡dfS | dkr8t  d| d ¡dfS d | fS )NrU   rV   rA   rH   rW   )rX   ÚpackrI   rK   rK   rL   Ú_populate_extended   s
    z_CoAPOpt._populate_extendedc                 C   s6   |   | j¡\| _| _|   t| jƒ¡\| _| _t | ¡S rN   )rb   rO   r^   rS   r`   r[   r
   Údo_build)ÚselfrK   rK   rL   rc   ‡   s    z_CoAPOpt.do_buildc                 C   s$   |d d… dkrt S t | |¡S d S )Nr   ó   ÿ)r]   r
   Úguess_payload_class)rd   ÚpayloadrK   rK   rL   rf   �   s    z_CoAPOpt.guess_payload_class)Ú__name__Ú
__module__Ú__qualname__r   r   rR   rT   r\   Úfields_descÚstaticmethodrb   rc   rf   rK   rK   rK   rL   r]   x   s   

ü
r]   c                   @   s0   e Zd ZdZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )Ú_CoAPOptsFieldr   c                 C   s   dd„ |D ƒS )Nc                 S   s8   g | ]0}|d  t d  v r0t d  |d   |d fn|‘qS )r   r   )Úcoap_options©Ú.0ÚorK   rK   rL   Ú
<listcomp>˜   ó    z&_CoAPOptsField.i2h.<locals>.<listcomp>rK   ©rd   rQ   ÚxrK   rK   rL   Úi2h—   s    z_CoAPOptsField.i2hc                 C   s@   |   ||¡}d}|D ]}||d 7 }q||d … dd„ |D ƒfS )Nr   c                 S   s   g | ]}|d  |d f‘qS )r   r   rK   ro   rK   rK   rL   rr       rs   z+_CoAPOptsField.getfield.<locals>.<listcomp>©Úm2i)rd   rQ   ÚsÚoptsÚusedrq   rK   rK   rL   Úgetfield›   s
    z_CoAPOptsField.getfieldc                 C   sl   g }t |ƒ}d}t|t ƒrh|t|j|jƒ7 }dt|jƒ t|jƒ t|jƒ }| |||jf¡ |j	}q|S )Nr   r   )
r]   Ú
isinstancerZ   rO   r^   rS   r`   r[   Úappendrg   )rd   rQ   ru   rz   rq   Z	cur_deltaÚurK   rK   rL   rx   ¢   s    
"z_CoAPOptsField.m2ic                 C   sÄ   |sdS g }|D ]<}t |d tƒrB| td |d  |d f¡ q| |¡ q|jdd„ d� t|d d |d d d�}|d d }|dd … D ](}|t|d | |d d� }|d }q’t|ƒS )Nrs   r   r   c                 S   s   | d S )Nr   rK   )rq   rK   rK   rL   Ú<lambda>·   rs   z$_CoAPOptsField.i2m.<locals>.<lambda>)Úkey)rO   r`   )r}   Ústrr~   rn   Úsortr]   r   )rd   rQ   ru   Zopt_lstrq   rz   Zhigh_optrK   rK   rL   Úi2m®   s     
z_CoAPOptsField.i2mN)rh   ri   rj   Zislistrv   r|   rx   r„   rK   rK   rK   rL   rm   ”   s
   rm   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_CoAPPaymarkc                 C   s   |S rN   rK   rt   rK   rK   rL   rv   Ä   s    z_CoAPPaymark.i2hc                 C   s    |   ||¡\}}||d … |fS rN   rw   )rd   rQ   ry   r   ÚmrK   rK   rL   r|   Ç   s    z_CoAPPaymark.getfieldc                 C   s$   t |ƒdkr |d d… dkr dS dS )Nr   r   re   )r   re   )r   rs   )rS   rt   rK   rK   rL   rx   Ë   s    z_CoAPPaymark.m2ic                 C   s   |S rN   rK   rt   rK   rK   rL   r„   Ð   s    z_CoAPPaymark.i2mN)rh   ri   rj   rv   r|   rx   r„   rK   rK   rK   rL   r…   Â   s   r…   c                
   @   sŠ   e Zd ZdgZd Zedddƒedddddd	d
dœƒeddddd�edde	ƒe
ddƒedddd„ d�edg ƒeddƒgZdd„ Zdd„ ZdS )ÚCoAPÚcontent_formatÚverr   r   Útyper   ÚCONZNONZACKZRST)r   r   r   r   ÚtklNr   Útoken)Z	length_ofÚcodeZmsg_idÚ c                 C   s   | j S rN   )rŒ   rP   rK   rK   rL   r€   Ý   rs   zCoAP.<lambda>r_   ÚoptionsZpaymarkrs   c                 C   s   t | |ƒ}|r|S t | |¡S rN   )Úgetattrr
   Úgetfieldval)rd   ÚattrÚvrK   rK   rL   r’   â   s    
zCoAP.getfieldvalc                 C   s&   | j D ]}|d dkr|d | _q|S )Nr   r4   r   )r�   rˆ   )rd   ZpayÚkrK   rK   rL   Úpost_dissectè   s    
zCoAP.post_dissect)rh   ri   rj   Ú	__slots__Únamer   r   r   r   Ú
coap_codesr   r   rm   r…   rk   r’   r–   rK   rK   rK   rL   r‡   Ô   s   

ù
r‡   i3  )Zsport)Údport)Ú__doc__rX   Zscapy.fieldsr   r   r   r   r   r   r   Zscapy.layers.inetr	   Zscapy.packetr
   r   Zscapy.errorr   Zscapy.compatr   r™   rn   rM   rR   rT   rZ   r\   r]   rm   r…   r‡   rK   rK   rK   rL   Ú<module>	   sš   $äññï$

.