
    h                        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 i 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.d/d0d1d2	Zd3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBd	dddCdDdEdFdGdHdIdJdKdLdMdNdOfZdP ZdQ ZdR ZdS ZdT Z G dU dVe          Z G dW dXe          Z G dY dZe          Z G d[ d\e          Z eeed]^            eeed]_           dS )`zD
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   DELETEA   z2.01 CreatedB   z2.02 DeletedC   z
2.03 ValidD   z2.04 ChangedE   z2.05 Content   z4.00 Bad Request   z4.01 Unauthorized   z4.02 Bad Option   z4.03 Forbidden   z4.04 Not Found   z4.05 Method Not Allowed   z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)	                           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@   rA   rB   rC   rD   rE   rF   rG   rH   )r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   c                 P    | dk    rt          d           | dk    rdS | dk    rdS dS )NrC   zInvalid Option Delta or LengthrB   r      r   r   r   vals    V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/coap.py_get_ext_field_sizerN   X   s;    
byy0111
byyq
byyq1    c                 *    t          | j                  S N)rN   deltapkts    rM   _get_delta_ext_sizerU   b   s    sy)))rO   c                 *    t          | j                  S rQ   )rN   lenrS   s    rM   _get_len_ext_sizerX   f   s    sw'''rO   c                     | dk    rt          d| z             | dk    rdt          j        d|          d         z   S | dk    rdt          j        d|          d         z   S | S )	NrC   z!Invalid Option Length or Delta %drB     !Hr   rJ   B)r   structunpack)rL   ext_vals     rM   _get_abs_valr`   j   sn    
byy3c9:::
byyV]411!444
byyFM#w//222JrO   c                 6    t          | j        | j                  S rQ   )r`   rW   len_extrS   s    rM   _get_opt_val_sizerc   t   s    ---rO   c            	           e Zd Z eddd           eddd           edde           edde           ed	de          gZe	d
             Z
d Zd ZdS )_CoAPOptrR   r   r   rW   	delta_ext length_fromrb   opt_valc                     | dk    rt          j        d| dz
            dfS | dk    rt          j        d| dz
            dfS d | fS )NrZ   r[   rB   rJ   r\   )r]   packrK   s    rM   _populate_extendedz_CoAPOpt._populate_extended   sT    #::;tS3Y//33"99;sC"H--r11SyrO   c                     |                      | j                  \  | _        | _        |                      t          | j                            \  | _        | _        t          j        |           S rQ   )rm   rR   rf   rW   rj   rb   r   do_build)selfs    rM   ro   z_CoAPOpt.do_build   sV    %)%<%<TZ%H%H"
!%!8!8T\9J9J!K!Kdht$$$rO   c                 V    |d d         dk    rt           S t          j        | |          S )Nr      )re   r   guess_payload_class)rp   payloads     rM   rs   z_CoAPOpt.guess_payload_class   s-    2A2;'!!O-dG<<<rO   N)__name__
__module____qualname__r   r	   rU   rX   rc   fields_descstaticmethodrm   ro   rs    rO   rM   re   re   x   s        8GQ**8E1a((;{B<OPPP;y":KLLL;y":KLLL	NK   \% % %= = = = =rO   re   c                   *    e Zd ZdZd Zd Zd Zd ZdS )_CoAPOptsFieldr   c                     d |D             S )Nc                 ~    g | ]:}|d          t           d          v r!t           d          |d                   |d         fn|;S )r   r   )coap_options.0os     rM   
<listcomp>z&_CoAPOptsField.i2h.<locals>.<listcomp>   sF    [[[TU1a1H1Ha1&!--a[[[rO   rz   rp   rT   xs      rM   i2hz_CoAPOptsField.i2h   s    [[YZ[[[[rO   c                 ~    |                      ||          }d}|D ]}||d         z  }||d          d |D             fS )Nr   c                 .    g | ]}|d          |d         fS )r   r   rz   r   s     rM   r   z+_CoAPOptsField.getfield.<locals>.<listcomp>   s$    55511Q41,555rO   m2i)rp   rT   soptsusedr   s         rM   getfieldz_CoAPOptsField.getfield   sZ    xxQ 	 	AAaDLDDx5555555rO   c                    g }t          |          }d}t          |t                     r|t          |j        |j                  z  }dt          |j                  z   t          |j                  z   t          |j                  z   }|                    |||j        f           |j	        }t          |t                     |S )Nr   r   )
re   
isinstancer`   rR   rf   rW   rj   rb   appendrt   )rp   rT   r   r   r   	cur_deltaus          rM   r   z_CoAPOptsField.m2i   s    QKK	H%% 	agq{;;;IC	NN"S%5%55AIFAKKIqy1222	A H%% 	 rO   c                    |sdS g }|D ]g}t          |d         t                    r5|                    t          d         |d                  |d         f           R|                    |           h|                    d            t          |d         d         |d         d                   }|d         d         }|dd          D ]-}|t          |d         |z
  |d                   z  }|d         }.t          |          S )NrO   r   r   c                     | d         S )Nr   rz   )r   s    rM   <lambda>z$_CoAPOptsField.i2m.<locals>.<lambda>   s
    1Q4 rO   )key)rR   rj   )r   strr   r   sortre   r   )rp   rT   r   opt_lstr   r   high_opts          rM   i2mz_CoAPOptsField.i2m   s    	3 	" 	"A!A$$$ "Q! 5qt<====q!!!!(((gajmWQZ]CCC1:a= 	 	A(1!A$GGGGDtHH4yyrO   N)ru   rv   rw   islistr   r   r   r   rz   rO   rM   r|   r|      sX        F\ \ \6 6 6
 
 
    rO   r|   c                   &    e Zd Zd Zd Zd Zd ZdS )_CoAPPaymarkc                     |S rQ   rz   r   s      rM   r   z_CoAPPaymark.i2h       rO   c                 L    |                      ||          \  }}||d          |fS rQ   r   )rp   rT   r   r   ms        rM   r   z_CoAPPaymark.getfield   s*    #q!!AuaxrO   c                 L    t          |          dk    r|d d         dk    rdS dS )Nr   r   rr   )r   rr   )r   rO   )rW   r   s      rM   r   z_CoAPPaymark.m2i   s-    q66A::!BQB%7**:vrO   c                     |S rQ   rz   r   s      rM   r   z_CoAPPaymark.i2m   r   rO   N)ru   rv   rw   r   r   r   r   rz   rO   rM   r   r      sP              
    rO   r   c                       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           edde	           e
dd           eddd            edg            edd          gZd Zd ZdS )CoAPcontent_formatverr   r   typer   CONNONACKRST)r   r   r   r   tklNr   token)	length_ofcodemsg_idrg   c                     | j         S rQ   )r   rS   s    rM   r   zCoAP.<lambda>   s    CG rO   rh   optionspaymarkrO   c                 T    t          | |          }|r|S t          j        | |          S rQ   )getattrr   getfieldval)rp   attrvs      rM   r   zCoAP.getfieldval   s1    D$ 	H!$---rO   c                 L    | j         D ]}|d         dk    r|d         | _        |S )Nr   r5   r   )r   r   )rp   payks      rM   post_dissectzCoAP.post_dissect   s5     	+ 	+At'''&'d#
rO   )ru   rv   rw   	__slots__namer   r   r   r   
coap_codesr   r	   r|   r   rx   r   r   rz   rO   rM   r   r      s        !"ID8E1a((<1%EePU.V.VWW##E4gFFF =J77:h**;w8K8KLLL!>)R00<	3//K. . .    rO   r   i3  )sport)dport)__doc__r]   scapy.fieldsr   r   r   r   r   r   r	   scapy.layers.inetr
   scapy.packetr   r   scapy.errorr   scapy.compatr   r   r   rN   rU   rX   r`   rc   re   r|   r   r   rz   rO   rM   <module>r      sj    5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 ! ! ! ! ! ! , , , , , , , ,            #w# u# v	#
 u# x# # # # # # 	# 	# 	#  	!#" 	##$ 	"%#& 	'#( 
$	(	*	%			#		!9# # #
>  $  #!H  * * *( ( (  . . .= = = = =v = = =8+ + + + +X + + +\    8   $    6   6 CT " " " " CT " " " " " "rO   