
    hG                        d Z ddlmZ ddlZddlZddlZddlZddlZddl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mZmZmZmZmZmZmZmZmZmZ er	 ddlZn# e $ r Y nw xY wddl!m"Z"  ed          Z# G d	 d
ee#                   Z$d Z% G d de$e#                   Z& G d de'          Z(d#de'dee         de(fdZ) G d de$e'                   Z* G d de$e'                   Z+ G d de,          Z- G d de,          Z.e.Z/ G d de$d                   Z0 G d d e$e#                   Z1 G d! d"e2          Z3dS )$z%
Generators and packet meta classes.
    )reduceN)Scapy_Exception)WINDOWS)AnyDictGenericIteratorListOptionalTupleTypeTypeVarUnioncastTYPE_CHECKING)Packet_Tc                       e Zd Zg Zd Zd ZdS )Genc                      t          g           S N)iterselfs    V/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/base_classes.py__iter__zGen.__iter__;   s    Bxx    c                 N    t          d t          |           D                       S )Nc              3      K   | ]}d V  dS )   N ).0_s     r   	<genexpr>z"Gen.__iterlen__.<locals>.<genexpr>A   s"      ))1))))))r   )sumr   r   s    r   __iterlen__zGen.__iterlen__?   s%    ))d4jj))))))r   N)__name__
__module____qualname__	__slots__r   r&   r!   r   r   r   r   8   s7        I  * * * * *r   r   c           	      H   t          | t                    rdt          |           cxk    rdk    rrn not          d | D                       rVt	          t          | d                   t          | d                   dz   ft          d | dd         D                       z    S | S )zUGenerate a range object from (start, stop[, step]) tuples, or
    return value.

          c              3   6   K   | ]}t          |d           V  dS )__int__N)hasattr)r"   is     r   r$   z_get_values.<locals>.<genexpr>K   s,      55!9%%555555r   r   r    c              3   4   K   | ]}t          |          V  d S r   )int)r"   vs     r   r$   z_get_values.<locals>.<genexpr>O   s(      77SVV777777r   N)
isinstancetuplelenallranger3   )values    r   _get_valuesr;   D   s     	5%   :a3u::&:&:&:&:&:&:&:&:&:55u55555 '; E!Hs58}}q'8977U122Y777778 : 	:Lr   c                   (    e Zd ZddZd Zd Zd ZdS )SetGenr    c                     || _         t          |t          t          f          rd |D             | _        d S t          |          g| _        d S )Nc                 ,    g | ]}t          |          S r!   )r;   )r"   vals     r   
<listcomp>z#SetGen.__init__.<locals>.<listcomp>X   s     >>>;s++>>>r   )_iterpacketr5   listBasePacketListvaluesr;   )r   rE   rB   s      r   __init__zSetGen.__init__T   sP    &ft^455 	0>>v>>>DKKK&v../DKKKr   c              #      K   | j         D ]b}t          |t                    r| j        s6t          |t                    r!t          |t
          t          j        f          r
|D ]}|V  ^|V  cd S r   )rE   r5   r   rB   
BasePacketr9   typesGeneratorType)r   r1   js      r   r   zSetGen.__iter__\   s       	 	A1c"" !)3Az)B)Bq5%*=">??   AGGGG 	 	r   c                 *    |                                  S r   )r&   r   s    r   __len__zSetGen.__len__g   s    !!!r   c                     d| j         z  S )Nz<SetGen %r>)rE   r   s    r   __repr__zSetGen.__repr__k   s    t{**r   N)r    )r'   r(   r)   rF   r   rM   rO   r!   r   r   r=   r=   S   sU        0 0 0 0	 	 	" " "+ + + + +r   r=   c                   >     e Zd ZdZdgZdeddfdZdef fdZ xZS )	_ScopedIPz1
    A str that also holds extra attributes.
    scoper#   returnNc                     d | _         d S r   rR   )r   r#   s     r   rF   z_ScopedIP.__init__v   s    


r   c                     t          t          |                                           }| j        d|dt	          | j                  dS |S )Nz	ScopedIP(z, scope=))superrQ   rO   rR   repr)r   r@   	__class__s     r   rO   z_ScopedIP.__repr__y   sM    It$$--//:!!/2ssD4D4D4D4DEE
r   )	r'   r(   r)   __doc__r*   strrF   rO   __classcell__)rZ   s   @r   rQ   rQ   p   sy          	I# $    #          r   rQ   netrR   rS   c                    d| v r8	 |                      dd          \  } }n# t          $ r t          d          w xY w|wddlm}m}m} 	  |t          |                    }n"# t          t          f$ r  ||          }Y nw xY w|	                                st          d|z             ||          }t          |           }||_        |S )z
    An str that also holds extra attributes.

    Examples::

        >>> ScopedIP("224.0.0.1%eth0")  # interface 'eth0'
        >>> ScopedIP("224.0.0.1%1")  # interface index 1
        >>> ScopedIP("224.0.0.1", scope=conf.iface)
    %r    z+Scope identifier can only be present once !Nr   )resolve_ifacenetwork_namedev_from_indexzJRFC6874 scope identifier '%s' could not be resolved to a valid interface !)split
ValueErrorr   scapy.interfacesra   rb   rc   r3   	TypeErroris_validrQ   rR   )r^   rR   ra   rb   rc   ifacexs          r   ScopedIPrk      s&    czz	Q3**JC 	Q 	Q 	Q!"OPPP	QPPPPPPPPPP	)"N3u::..EEI& 	) 	) 	)!M%((EEE	)~~ 	!$&+,   U###AAGHs     :
A# #BBc                       e Zd ZdZd Zej        ZdZe	d             Z
e	d             Zed             ZddZd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZdS )Neta  
    Network object from an IP address or hostname and mask

    Examples:

        - With mask::

            >>> list(Net("192.168.0.1/24"))
            ['192.168.0.0', '192.168.0.1', ..., '192.168.0.255']

        - With 'end'::

            >>> list(Net("192.168.0.100", "192.168.0.200"))
            ['192.168.0.100', '192.168.0.101', ..., '192.168.0.200']

        - With 'scope' (for multicast)::

            >>> Net("224.0.0.1%lo")
            >>> Net("224.0.0.1", scope=conf.iface)
        c                      	 t           fdt          j        |d  j                  D                       S # t          j        $ r. t          j        d|          t          d j        z             w xY w)Nc              3   J   K   | ]\  }}}}}|j         k    |d          V  dS )r   N)family)r"   rq   r#   	addr_portclss       r   r$   z Net.name2addr.<locals>.<genexpr>   sL        .FAq!YSZ'' ! ('''	 r   z(^|\.)[0-9]+-[0-9]+($|\.)z%Ranges are no longer accepted in %s())	nextsocketgetaddrinforq   errorresearchr   r'   )rs   names   ` r   	name2addrzNet.name2addr   s    	     "4sz::      | 	 	 	y6==I%&M&)l'3 4 4 4		s	   37 =A4c                     t          t          t          j        dt	          j        |                     |                              d                   S )N!Ir   )r   r3   structunpackru   	inet_atonr{   )rs   addrs     r   ip2intz
Net.ip2int   sJ     C&"3==#6#677
 

   	r   c                 P    t          j        t          j        d|                     S )Nr}   )ru   	inet_ntoar~   pack)r@   s    r   int2ipz
Net.int2ip   s!     D# 6 6777r   Nc                    d|v rt          d| j        j        z            d | _        d|v rt	          |          }t          |t                    r|j        | _        |	 |                    dd          \  }}t          |          | _	        n# t          $ r | j        | _	        Y nw xY w|| _        | j        | j	        z
  }|                     |          |z	  |z  | _        d|z  | _        | j        | j        z   dz
  | _        d S |                     |          | _        |                     |          | _        | j        | j        z
  dz   | _        d x| _        | _	        d S )N*z(Wildcards are no longer accepted in %s()r`   /r    )r   rZ   r'   rR   rk   r5   rQ   rd   r3   maskre   max_maskr^   r   startcountstop)r   r^   r   rR   r   inv_masks         r   rF   zNet.__init__   sd   #::!"L"&."9#: ; ; ;
#::3--Cc9%% 	#DJ<&IIc1--	T  II		  * * * M			* DH}ty0HS))X5ADJhDJ
TZ/!3DIIIS))DJD))DITZ/!3DJ#''DHtyyys   B B&%B&c                 <    t          t          |           d          S )N )rt   r   r   s    r   __str__zNet.__str__   s    DJJ###r   c              #      K   t          | j                  D ]5}t          |                     | j        |z             | j                  V  6d S NrU   )r9   r   rk   r   r   rR   )r   r1   s     r   r   zNet.__iter__   sk       tz"" 	 	ADJN++j      	 	r   c                     | j         S r   )r   r   s    r   rM   zNet.__len__   s
    zr   c                      t          |           S r   )r7   r   s    r   r&   zNet.__iterlen__  s     4yyr   c                     t          |                     t          j        | j        | j                            | j                  S r   )rk   r   randomrandintr   r   rR   r   s    r   choicez
Net.choice  s=    KKtz49==>>*
 
 
 	
r   c                    d}| j         rdt          | j                   z  }| j        d| j        j        | j        | j        |fz  S | j        j        d|                     | j                  d|                     | j                  d|dS )Nr   z
, scope=%sz%s("%s/%d"%s)z("z", ""rW   )	rR   rY   r   rZ   r'   r^   r   r   r   )r   scope_id_reprs     r   rO   zNet.__repr__  s    : 	<(4
+;+;;M9 "'		&   N###KK
####KK	""""MM	
 	
r   c                     t          |t                    r| |                     |          k    S t          |t                    sdS | j        |j        k    rdS | j        |j        k    o| j        |j        k    S NF)r5   r\   rZ   rm   rq   r   r   r   others     r   __eq__z
Net.__eq__!  ss    eS!! 	14>>%0000%%% 	5;%,&&5
ek)H	UZ0GHr   c                     | |k     S r   r!   r   s     r   __ne__z
Net.__ne__+  s     5=  r   c                 R    t          d| j        | j        | j        | j        f          S )Nz	scapy.Net)hashrq   r   r   rR   r   s    r   __hash__zNet.__hash__0  s#    [$+tz49djQRRRr   c                 >   t          |t                    r| j        |cxk    o
| j        k    nc S t          |t                    r|                     |          | v S t          |          | j        urdS | j        |j        cxk    o|j        cxk    o
| j        k    nc S r   )r5   r3   r   r   r\   rZ   typer   s     r   __contains__zNet.__contains__4  s    eS!! 	4:3333$)33333eS!! 	1>>%((D00;;dn,,5zU[CCCCEJCCCC$)CCCCCr   )NN)r'   r(   r)   r[   rz   ru   AF_INETrq   r   classmethodr{   r   staticmethodr   rF   r   r   rM   r&   r   rO   r   r   r   r   r!   r   r   rm   rm      s5        ( D^FH  [   [ 8 8 \8( ( ( (8$ $ $      

 
 

 
 
&I I I! ! !
S S SD D D D Dr   rm   c                   *    e Zd Zd Zd Zd Zd Zd ZdS )OIDc                    || _         g | _        g }|                    d          D ]~}d|v rc|                    d           | j                            t	          t          t          |                    d                                         i|                    |           d                    |          | _        d S )N.-z%i)	oidcmptrd   appendr6   mapr3   joinfmt)r   r   r   r1   s       r   rF   zOID.__init__B  s    	3 	 	Aaxx

4   	  s3'='=!>!>????

188C==r   c                     d| j         z  S )NzOID(%r))r   r   s    r   rO   zOID.__repr__O  s    48##r   c              #   "  K   d | j         D             }	 | j        t          |          z  V  d}	 |t          |          k    rd S ||         | j         |         d         k     r||xx         dz  cc<   n| j         |         d         ||<   |dz  }_|)Nc                     g | ]
}|d          S )r   r!   )r"   ks     r   rA   z OID.__iter__.<locals>.<listcomp>U  s    &&&qad&&&r   Tr   r    )r   r   r6   r7   )r   iir1   s      r   r   zOID.__iter__S  s      &&DI&&&	(U2YY&&&&AB<<Fa549Q<?**qEEEQJEEE IaLOBqEQ	r   c                 V    t          t          j        d | j        D             d          S )Nc              3   H   K   | ]\  }}t          ||z
  d           dz   V  dS )r   r    N)max)r"   rj   ys      r   r$   z"OID.__iterlen__.<locals>.<genexpr>e  s7      $O$O6AqSQ]]Q%6$O$O$O$O$O$Or   r    )r   operatormulr   r   s    r   r&   zOID.__iterlen__c  s(    hl$O$OTY$O$O$OQRSSSr   N)r'   r(   r)   rz   rF   rO   r   r&   r!   r   r   r   r   ?  sZ        D! ! !$ $ $   T T T T Tr   r   c                   2    e Zd Zdee         fdZd Zd ZdS )Packet_metaclassrs   c           	         d|v rZ|d         }g }|D ]L}t          |t                    r |j        D ]}|                    |           7|                    |           Mn g }|D ]}t	          |d          r	|j        } n|rg }	g }
|D ]}|j        |
v r(d|d|j        d}t          j        |t                     |
                    |j                   |j        |v r.|	                                }||j                 |_
        ||j        = |	                    |           |	|d<   |                    dg            dD ].}	 |                    |          |d|z  <   # t          $ r Y +w xY w	 dd l                                        d	j        j                  gfd
|d         D             z             |d<   n# t$          t&          t          f$ r Y nw xY wt)          t*          d         t,                              | |||                    }t1          d |j        D                       |_        |gt7          |dg           z   |_        t	          |d          r|                                 |j        D ]'}t	          |d          r|                    |           (|j        d         dk    r%ddl m!} |j"        j#        $                    |           |S )Nfields_desczPacket 'z' has a duplicated 'z' field ! If you are using several ConditionalFields, have a look at MultipleTypeField instead ! This will become a SyntaxError in a future version of Scapy !r*   )rz   overload_fieldsz_%sr   _pktc                 h    g | ].}                     |j        j         j        |j                   /S ))default)	Parameterrz   KEYWORD_ONLYr   )r"   finspects     r   rA   z,Packet_metaclass.__new__.<locals>.<listcomp>  sR         !!!&")"3"@*+) " 5 5  r   __signature__r   c              3   N   K   | ] }t          |d           |j        D ]}|V  !dS )r*   N)r0   r*   )r"   rs   attrs      r   r$   z+Packet_metaclass.__new__.<locals>.<genexpr>  sb       #
 #
k)B)B#
 #
 #
  #
 #
 #
 #
 #
 #
 #
r   
aliastypesregister_variantregister_ownerr#   config)%r5   r   r   r   r0   rz   warningswarnSyntaxWarningcopyr   
setdefaultpopKeyErrorr   	Signaturer   POSITIONAL_ONLYImportErrorAttributeErrorr   r   r   __new__set__mro____all_slots__getattrr   r   r   r'   scapyr   conflayersregister)rs   rz   basesdctcurrent_fldresolved_fld
fld_or_pktpkt_fldb	final_fldnamesr   war_msgr   newcls_fr   r   s                    @r   r   zPacket_metaclass.__new__m  s    Cm,KL) 4 4
j*:;; 4#-#9 5 5$++G44445 !''
33334 L  1m,, #$=LE  	+IE! $ $6U??? !DD!&&&  M'=999QV$$$6S==A #AFAIAF  ####!*C{B'''/ 	 	D$'GGDMMEDL!!   	NNN#*#4#4!!&'*;*KLL6    ]+	  6 $ $C   ^X6 	 	 	D	d8ndll3eS&I&IJJ  # #
 #
~#
 #
 #
  
  
 Hwv|R888 	 6-.. 	&##%%%$ 	* 	*Br+,, *!!&)))?1$$$$$$$$K''///s%   E
E+*E+/AG   GGc                 R    | j         D ]}|j        |k    r|c S t          |          r   )r   rz   r   )r   r   r   s      r   __getattr__zPacket_metaclass.__getattr__  s;    ! 	 	Av~~ T"""r   c                     d| j         v r>	  | j        |i |} n/# t          $ r" ddlm} |j        j        r |j        j        } Y nw xY w|                     | | j	        | j
        | j                   } |j        |i | |S )Ndispatch_hookr   r   )__dict__r   	Exceptionr   r   r   debug_dissector	raw_layerr   r'   	__bases__rF   )rs   argskargsr   r1   s        r   __call__zPacket_metaclass.__call__  s    
 cl**,'c'777 , , ,((((((;. k+	,
 KKLML	
 
 	
D"E"""s    )AAN)r'   r(   r)   r   r   r   r   r  r!   r   r   r   r   l  sW        XT"X X X X Xt# # #    r   r   c                   &    e Zd Zdee         fdZdS )Field_metaclassrs   c                 l    |                     dg            t                              | |||          }|S )Nr*   )r   r   r   )rs   rz   r   r   r   s        r   r   zField_metaclass.__new__  s4     	{B'''c444r   N)r'   r(   r)   r   r   r   r!   r   r   r  r    s3        T"X      r   r  c                       e Zd Zg ZdS )rH   Nr'   r(   r)   r*   r!   r   r   rH   rH             IIIr   rH   r   c                       e Zd Zg ZdS )rD   Nr  r!   r   r   rD   rD     r	  r   rD   c                   H    e Zd Zej        dd            Zd	dZd	dZd	dZdS )
_CanvasDumpExtendedr   r    c                     d S r   r!   )r   layer_shiftrebuilds      r   canvas_dumpz_CanvasDumpExtended.canvas_dump  s	     	r   Nc                    ddl m} ddlm}m}  | j        di |}| ||                    dd                    }|                    |           t          r!|j	        j
        st          j        |           nc ||j	        j
                  5  t          j        |j	        j
        |g           ddd           n# 1 swxY w Y   n|                    |           t                       dS )	z
        psdump(filename=None, layer_shift=0, rebuild=1)

        Creates an EPS file describing a packet. If filename is not provided a
        temporary file is created and gs is called.

        :param filename: the file's filename
        r   r   get_temp_fileContextManagerSubprocessNsuffixz.epsautoextr!   )scapy.configr   scapy.utilsr  r  r  getwriteEPSfiler   progpsreaderos	startfile
subprocessPopenprintr   filenamer  r   r  r  canvasfnames           r   psdumpz_CanvasDumpExtended.psdump  sd    	&%%%%%GGGGGGGG!!**E**!M%))Hf*E*EFFFE&&& Bty1 BU####--di.@AA B B$di&8%%@AAAB B B B B B B B B B B B B B B )))   !B==CCc                    ddl m} ddlm}m}  | j        di |}| ||                    dd                    }|                    |           t          r!|j	        j
        st          j        |           nc ||j	        j
                  5  t          j        |j	        j
        |g           ddd           n# 1 swxY w Y   n|                    |           t                       dS )	z
        pdfdump(filename=None, layer_shift=0, rebuild=1)

        Creates a PDF file describing a packet. If filename is not provided a
        temporary file is created and xpdf is called.

        :param filename: the file's filename
        r   r  r  Nr  z.pdfr  r!   )r  r   r  r  r  r  r  writePDFfiler   r  	pdfreaderr  r   r!  r"  r#  r$  s           r   pdfdumpz_CanvasDumpExtended.pdfdump!  d    	&%%%%%GGGGGGGG!!**E**!M%))Hf*E*EFFFE&&& Cty2 CU####--di.ABB C C$di&95%ABBBC C C C C C C C C C C C C C C )))r)  c                    ddl m} ddlm}m}  | j        di |}| ||                    dd                    }|                    |           t          r!|j	        j
        st          j        |           nc ||j	        j
                  5  t          j        |j	        j
        |g           ddd           n# 1 swxY w Y   n|                    |           t                       dS )	z
        svgdump(filename=None, layer_shift=0, rebuild=1)

        Creates an SVG file describing a packet. If filename is not provided a
        temporary file is created and gs is called.

        :param filename: the file's filename
        r   r  r  Nr  z.svgr  r!   )r  r   r  r  r  r  r  writeSVGfiler   r  	svgreaderr  r   r!  r"  r#  r$  s           r   svgdumpz_CanvasDumpExtended.svgdump:  r.  r)  )r   r    r   )	r'   r(   r)   abcabstractmethodr  r(  r-  r2  r!   r   r   r  r    sr              2   2     r   r  r   )4r[   	functoolsr   r3  r   r  r   rx   ru   r~   r!  rI   r   r   scapy.errorr   scapy.constsr   typingr   r   r   r	   r
   r   r   r   r   r   r   r   pyxr   scapy.packetr   r   r   r;   r=   r\   rQ   rk   rm   r   r   r   r  PacketList_metaclassrH   rD   objectr  r!   r   r   <module>r=     s          



  				  				          ' ' ' ' ' '                                         $



   ######WT]]	* 	* 	* 	* 	*'"+ 	* 	* 	*  + + + + +SW + + +:         # hsm y    @\D \D \D \D \D#c( \D \D \D~&T &T &T &T &T#c( &T &T &TZv v v v vt v v vv	 	 	 	 	d 	 	 	 '     X       SW   O O O O O& O O O O Os    A% %A-,A-