
    hW                        d 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
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mZmZmZmZ ddlmZmZm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,m-Z-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6m7Z7m8Z8 ddl9m:Z: ddl;m<Z<m=Z= ddl>m?Z? ddl@mAZAmBZBmCZC ddlDmEZEmFZF ddlGmHZH ddlImJZJ ddlKmLZL ddlMmNZNmOZOmPZPmQZQmRZR ddlSmTZT ddlUmVZVmWZWmXZXmYZYmZZZm[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/d0d1d2d3d4d5d6i d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXi dYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzi d{d|d}d~ddddddddddddddddddddddddddddddi ddddddddddddddddddddddddddddddddddddiZ\ddddddŜZ]e]^                    e\           dddddd˜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֓d1dדd3dؓd5dٓdddddݜZ`ddddddZadddZbddZcd ZdddZed Zfd Zg G d de          Zh G d de5          Zi G d de5          ZjddddddddddddZk G d de          Zl G d del          Zm G d d e          Zn G d del          Zo G d del          Zp G d del          Zq G d del          Zr G d	 d
e5          Zs G d des          Zt G d del          Zu G d del          Zvi 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d1dd3d d5d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/Zw G d0 d1el          Zxeoepeqereuevexd2Zyd3 Zzd4 Z{ G d5 d6e4          Z| G d7 d8e          Z} G d9 d:e}          Z~ G d; d<e}          Z G d= d>e}          Z G d? d@e}          Z G dA dBe}          Z G dC dDe}          Z G dE dFe}          Z G dG dHe          Z G dI dJe}          Z G dK dLe}          ZdMdNdOdPdQdRdSdTdUdV	Z G dW dXe          Z G dY dZe}          Z G d[ d\e}          Z G d] d^e}          Zd5d=d_Z G d` dae(eef                   Z G db dce}          Z G dd dee}          Zi d!ed/e~d3edWed[edgendkedqedseduedyed{ededededeZ G df dge          Zdh Z G di dje          Z G dk dle1          Z G dm dneh          Z e eQedop            e eQedoq            e eQedp            e eQedq            eOj        eQdrdop           ej        rddslSmZ  ej        eQdtdop            e eRedp            e eRedq            e            e_        ej                            dudv          Zej        j        ddw            Zej        j        ddx            Zej        j        ddy            Z G dz d{e          Z G d| d}e          Z G d~ deA          Zej        j        dej        d.dddfd            ZdS (  z
DNS: Domain Name System

This implements:
- RFC1035: Domain Names
- RFC6762: Multicast DNS
- RFC6763: DNS-Based Service Discovery
    N)get_if_addrget_if_addr6read_nameservers)AnsweringMachine)NetScopedIP)conf)orbrawchbbytes_encode	plain_str)log_runtimewarningScapy_Exception)Packetbind_layersRaw)BitEnumFieldBitFieldByteEnumField	ByteFieldConditionalFieldFieldFieldLenFieldFieldListField
FlagsFieldIIP6FieldIntFieldMACFieldMultipleTypeFieldPacketListFieldShortEnumField
ShortFieldStrFieldStrLenFieldUTCTimeFieldXStrFixedLenFieldXStrLenField)resolve_iface)sr1sr)StreamSocket)
SndRcvList_PacketListQueryAnswer)	inet_ntop	inet_pton)pretty_list)	RandShort)Ether)IPDestIPFieldIPFieldUDPTCPIPv6)AnyListOptionalTupleTypeUnionRESERVED   A   NS   MD   MF   CNAME   SOA   MB   MG	   MR
   NULL   WKS   PTR   HINFO   MINFO   MX   TXT   RP   AFSDB   X25   ISDN   RT   NSAP   zNSAP-PTR   SIG   KEY   PX   GPOS   AAAA   LOC   NXT   EID    NIMLOC!   SRV"   ATMA#   NAPTR$   KX%   CERT&   A6'   DNAME(   SINK)   OPT*   APL+   DS,   SSHFP-   IPSECKEY.   RRSIG/   NSEC0   DNSKEY1   DHCID2   NSEC33   
NSEC3PARAM4   TLSA5   SMIMEA7   HIP8   NINFO9   RKEY:   TALINK;   CDS<   CDNSKEY=   
OPENPGPKEY>   CSYNC?   ZONEMD@   SVCBA   HTTPSc   SPFd   UINFOe   UIDf   GIDg   UNSPECh   NIDi   L32j   L64k   LPl   EUI48m   EUI64   TKEY   TSIG   URIi  CAAi  AVCi  DOAi  AMTRELAY   TA  DLV  IXFRAXFRMAILBMAILAALL)               INCSCHHSANY)rE   rG   rI   rK   r   ReservedzRSA/MD5zDiffie-Hellmanz	DSA/SHA-1z	RSA/SHA-1zDSA-NSEC3-SHA1zRSASHA1-NSEC3-SHA1zRSA/SHA-256zRSA/SHA-512zGOST R 34.10-2001zECDSA Curve P-256 with SHA-256zECDSA Curve P-384 with SHA-384Ed25519Ed448zReserved for Indirect Keysz Private algorithms - domain namezPrivate algorithms - OID)r   r   r   r   zSHA-1zSHA-256zGOST R 34.11-94zSHA-384)r   rE   rG   rI   rK   )r   rE   Fc                    t          |           }d}d}g }d}d}d}		 t          |	          |k    r$t          j        d|	t          |                      n| |	         }
|	dz  }	|
dz  r||	dz   }|r|	dz  }	Y|	|k    rt          j        d	|	           n|st	          d
          |
dz  dz  | |	         z   }	|	|v rt          d           n{t          |          dk    rt          d           nX|s| |d         }|} t          |           }d}|                    |	           |
dk    r|| |	|	|
z            dz   z  }|	|
z  }	nn%||}	|
| |	d         }|pd|fS )zThis function decompresses a string s, starting
    from the given pointer.

    :param s: the string to decompress
    :param full: (optional) the full packet (used for decompression)

    :returns: (decoded_string, end_index, left_string)
        NFr   Tz&DNS RR prematured end (ofs=%i, len=%i)rE      z%DNS incomplete jump token at (ofs=%i)z.DNS message can't be compressed at this point!i?rS   zDNS decompression loop detectedrk   zIMore than 20 jumps in a single DNS decompression ! Dropping (evil packet)   .)lenabsr   infor   r   append)sfull_ignore_compression
max_lengthnameafter_pointerprocessed_pointers
bytes_left_fullpacketpointercurs              T/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/layers/dns.pydns_get_strr  |   s
    QJDMJKG0w<<:%%8'3q66   j1: (	$ !(!" 1*$$ ;W    8% '7 8 8 8 e)QwZ7G,,,9:::%&&",, 1 2 2 2 # }~~.
 VV
"%%g...1WWAggm+,t33DsNGGa0b  wxx[
<4##r   c                     d| voI| rt          | d                   dk    p.t          |           dk    ot          | d                   dz  dk    S )Nr   r   rG   r   )r
   r   xs    r  _is_ptrr     sT    q= 	
	s1R5zzQ 	6	Q1	4#ae**t+4r   c                     | r| dk    rdS |rt          |           r| S d                    d d |                     d          D             D                       } | dd         dk    r| dz  } | S )zEncodes a bytes string into the DNS format

    :param x: the string
    :param check_built: detect already-built strings and ignore them
    :returns: the encoded bytes string
    r       r   c              3   T   K   | ]#}t          t          |                    |z   V  $d S N)r   r   ).0ys     r  	<genexpr>zdns_encode.<locals>.<genexpr>   s2      JJQSVVqJJJJJJr   c              3   *   K   | ]}|d d         V  d S )Nr    )r  ks     r  r  zdns_encode.<locals>.<genexpr>   s*      *I*Ia1SbS6*I*I*I*I*I*Ir   r  N)r  joinsplit)r  check_builts     r  
dns_encoder#     s      T		w wqzz  	JJ*I*I1774==*I*I*IJJJJJAv	WHr   c                  ^    t          j        dt                     t          | i |dd         S )zLegacy function. Deprecatedz1DNSgetstr is deprecated. Use dns_get_str instead.Nr  )warningswarnDeprecationWarningr  )argskwargss     r  	DNSgetstrr*     s:    M;   ''',,r   c           	      .   t           | vrt          d          |                                 } |                     t                     }|                                 t          |          }d }d }i } ||          D ]\  }}} ||          D ]}	t          |	d          }
|	|vrU|                    |
          }|dz	  dz  }|d|dz
  z  z
  }t          |          t          |          z   }||||d	z   fg||	<   l||	         	                    ||f           ||	         d
         d         }|d|         ||d         
                    |
dd	          z   } |D ]}||         }|                    d
          d         }|D ]}|d
                             |d	                   }|                    |          sJ t          |dt          |                    d          dd         }||z   }|d
                             |d	         |           	 |d
         `# t"          $ r Y w xY wt%          | t                     sU|                     t                     j        r6|                     t                     j                                         | |z  S |S )zJThis function compresses a DNS packet according to compression rules.
    zCan only compress DNS layersc              3     K   | j         | j        | j        | j        fD ]m}|s|D ]e}|j        D ][}t          |t                    st          |t                    r/|j        dv r&|	                    |j
                  }||j
        |fV  \fndS )z7Iterates through all DNS strings that can be compressed)rG   rI   rK   rM   r[   ra   r   r   N)qdannsarfields_desc
isinstanceDNSStrFieldr"   typegetfieldvalr  )dns_pktlaycurrentfielddats        r  	field_genzdns_compress.<locals>.field_gen   s      J
GJ
C 
	7 
	7C  7 7$0 7 7E!%55 7#E+<==7 )EEE%11%*==%uz3666677
	7 
	7r   c              3      K   | dk    rdS | V  t          d|                     d                    D ] }|                     d|          |         V  !dS )z?Iterates through all possible compression parts in a DNS stringr   NrE   )rangecountr!  )r:  r  s     r  possible_shortensz'dns_compress.<locals>.possible_shortens  sl      $;;F			q#))D//** 	( 	(A))D!$$Q'''''	( 	(r   Tr"  rS   r   r   rE   r   rI   Ns     rG   r  )DNSr   copygetlayerclear_cacher   r#  indexr   r  replacepopr5  endswithr   setfieldvalrdlenAttributeErrorr2  
underlayerremove_payload)pktr6  	build_pktr;  r?  datar8  r  r:  partencodedrE  fb_indexsb_indexr  _inckreplacementsreplace_pointerrepvalkept_stringnew_vals                          r  dns_compressr]     s    #~~<===
((**Cll3GGI7 7 7( ( ( D'i00  s%%c** 	 	D 4888G4 "00"aZ4/ C8d?$;<h--#h--7&guqyABT

 T
!!7D/2224jmA&%dsdOio.E.E/ / 	
   Bx '**1--a0   
	 
	Ca&$$SV,,C<<#####$S3r77(^FFFssKK!O3GFs1vw///FLL!   
	 c3 CLL$5$5$@ S$33555W}Ns   H
H'&H'c                   2    e Zd ZdZej        d             ZdS )DNSCompressedPacketzS
    Class to mark that a packet contains DNSStrField and supports compression
    c                     d S r  r  selfs    r  get_fullzDNSCompressedPacket.get_fullG  s    r   N)__name__
__module____qualname____doc__abcabstractmethodrc  r  r   r  r_  r_  C  s=          	    r   r_  c                   D     e Zd ZdZ fdZd Zd Zd Zd Z fdZ	 xZ
S )r3  z
    Special StrField that handles DNS encoding/decoding.
    It will also handle DNS decompression.
    (may be StrLenField if a length_from is passed),
    c                      |r$t          |t                    r fd|D             S t          t                                         |          S )Nc                 <    g | ]}                     |          S r  )h2i)r  r  rN  rb  s     r  
<listcomp>z%DNSStrField.any2i.<locals>.<listcomp>T  s'    000DHHS!$$000r   )r2  listsuperr3  any2irb  rN  r  	__class__s   `` r  rq  zDNSStrField.any2iR  s[     	1At$$ 	100000a0000[$''--c1555r   c                     |r?t          |j        t                    r%|j        j        r|j                                         |sdS t          |          }|dd          dk    rt          |          s|dz   S |S )Nr   r  )r2  parentr_  raw_packet_cacherD  r   r  rb  rN  r  s      r  rm  zDNSStrField.h2iW  s     	%sz#677	% J'	%
 J""$$$ 	4OORSS6T>>'!**>t8Or   c                 $    t          |d          S )NTr@  )r#  rw  s      r  i2mzDNSStrField.i2mf  s    !....r   c                 H    t          |                     ||                    S r  r   ry  rw  s      r  i2lenzDNSStrField.i2leni      488C##$$$r   c                     |r:t          |t                    s%|j        p|j        }|rt          |t                    %|sd S |                                S r  )r2  r_  ru  rL  rc  )rb  rN  s     r  rc  zDNSStrField.get_fulll  sa     	/*S*=>> 	/*.C  	/*S*=>> 	/ 	4||~~r   c                     d}| j         r,t          t          |                               ||          \  }}t	          ||                     |                    \  }}||z   |fS )Nr   )r  )length_fromrp  r3  getfieldr  rc  )rb  rN  r  remaindecodedleftrs  s         r  r  zDNSStrField.getfields  sh     	Bk40099#qAAIFA#ADMM#,>,>???f}g%%r   )rd  re  rf  rg  rq  rm  ry  r|  rc  r  __classcell__rs  s   @r  r3  r3  L  s         
6 6 6 6 6
  / / /% % %  & & & & & & & & &r   r3  c                   4    e Zd ZdZdZd Zd Zd Zd Zd Z	dS )	DNSTextFieldz=
    Special StrLenField that handles DNS TEXT data (16)
    rE   c                     |sg S |S r  r  rw  s      r  i2hzDNSTextField.i2h  s     	Ir   c                    t                      }|}|rwt          |d                   dz   }|t          |          k    r#t          j        d|t          |                     |                    |d|                    ||d          }|w|S )Nr   rE   zKDNS RR TXT prematured end of character-string (size=%i, remaining bytes=%i))ro  r
   r   r   r  r  )rb  rN  r  ret_stmp_stmp_lens         r  m2izDNSTextField.m2i  s      	$%(mma'GU## 45<c%jj   LLqy)***'((OE  	$ r   c                 D    t          |t          t          f          r|gS |S r  )r2  strbytesrw  s      r  rq  zDNSTextField.any2i  s$    a#u&& 	3Jr   c                 H    t          |                     ||                    S r  r{  rw  s      r  r|  zDNSTextField.i2len  r}  r   c                 0   d}|D ]}|s|dz  }
t          |          }t          |          dk    r-|d|d d         z   z  }|dd          }t          |          dk    -t          |          r(|t          j        dt          |                    |z   z  }|S )Nr   r  r      !B)r   r   structpack)rb  rN  r  r  texts        r  ry  zDNSTextField.i2m  s     	= 	=D  %%D d))s""4:--CDDz d))s"" 4yy =T3t9955<<r   N)
rd  re  rf  rg  islistr  r  rq  r|  ry  r  r   r  r  r  }  sp          F  
     
% % %    r   r  LLQULNSIDOwnerDAUDHUN3Uzedns-client-subnetCOOKIEzExtended DNS Error)r   rE   rG   rI   rK   rM   rO   rQ   rS   rW   ra   c                       e Zd ZdZd ZdS )_EDNS0Dummyz-Dummy class that implements extract_padding()c                 
    d|fS N r  rb  ps     r  extract_paddingz_EDNS0Dummy.extract_padding  s    1ur   N)rd  re  rf  r  r  r  r   r  r  r    s(        :D    r   r  c                   ~    e Zd ZdZ edde           edddd           edd	d
           gZe	dd            Z
dS )EDNS0TLVzDNS EDNS0 TLVoptcoder   optlenNoptdataHfmtr  c                     | j         S r  r  rN  s    r  <lambda>zEDNS0TLV.<lambda>  s    sz r   r  c                     |t           S t          |          dk     rt          S t          j        d|d d                   d         }t
                              |t                     S )NrG   !Hr   )r  r   r   r  unpackEDNS0OPT_DISPATCHERget)cls_pktr(  kargs	edns0types        r  dispatch_hookzEDNS0TLV.dispatch_hook  sV     <Ot99q==JM$RaR11!4	"&&y(;;;r   r  )rd  re  rf  r  r$   
edns0typesr   r'   r1  classmethodr  r  r   r  r  r    s        D!>)Q
;; =4DDD;y"+A+AC C CDK
 < < < [< < <r   r  c                       e Zd ZdZ edd           edde           edde           edd	           ed
d	           e	dddddi           e
dddd           edg ed           gZdS )DNSRROPTzDNS OPT Resource Recordrrnamer  r4  r   rclassi   extrcoder   versionzr   rc   D0rJ  Nrdatar  	length_ofr  c                     | j         S r  rJ  r  s    r  r  zDNSRROPT.<lambda>  s    39 r   r  )rd  re  rf  r  r3  r$   dnstypes
dnsclassesr   r   r   r#   r  r1  r  r   r  r  r    s        $D;x,,!>&"h77!>(D*==9Z++9Y**<UB>> =$'sKKK"?7B/D/DF F F
GKKKr   r  c                       e Zd ZdZ edde           edddd           ed	d
           edd
           edd           e	 edd          d            e	 e
ddd           d           gZd ZdS )EDNS0OWNzEDNS0 Owner (OWN)r  rK   r  Nprimary_macr  count_ofr  vr   r  z00:00:00:00:00:00
wakeup_macc                     | j         pddk    S )Nr   rg   r  r  s    r  r  zEDNS0OWN.<lambda>      CJO!#: r   passwordr  c                     | j         dz
  S )Nrg   r  r  s    r  r  zEDNS0OWN.<lambda>  s    3:? r   r  c                     | j         pddk    S )Nr   ro   r  r  s    r  r  zEDNS0OWN.<lambda>  r  r   c                     ||z  }| j         ;|d d         t          j        dt          |          dz
            z   |dd          z   }|S )NrG   r  rK   )r  r  r  r   rb  rN  pays      r  
post_buildzEDNS0OWN.post_build  sM    s
;bqb'FKc#hhl;;;c!""gEC
r   )rd  re  rf  r  r$   r  r   r   r!   r   r'   r1  r  r  r   r  r  r    s        D!>)Q
;; =4-SQQQ9S!$$9S!$$8M+>??##x.ABB::< < $#"{:r/J/JL L L::< <=K    r   r  c                   ~    e Zd ZdZ edde           edddd           edd ed	d
e	          d           gZ
dS )EDNS0DAUz!DNSSEC Algorithm Understood (DAU)r  rM   r  Nalg_coder  r  r  r   c                     | j         S r  r  r  s    r  r  zEDNS0DAU.<lambda>      
 r   
count_from)rd  re  rf  r  r$   r  r   r   r   dnssecalgotypesr1  r  r   r  r  r    st        .D!>)Q
;; =4*#NNN!>*d"/-A"G"G-B-BD D DEKKKr   r  c                   ~    e Zd ZdZ edde           edddd           edd ed	d
e	          d           gZ
dS )EDNS0DHUzDS Hash Understood (DHU)r  rO   r  Nr  r  r  r  r   c                     | j         S r  r  r  s    r  r  zEDNS0DHU.<lambda>  r  r   r  )rd  re  rf  r  r$   r  r   r   r   dnssecdigesttypesr1  r  r   r  r  r    su        %D!>)Q
;; =4*#NNN!>*d"/-A7H"I"I-B-BD D DEKKKr   r  c                   ~    e Zd ZdZ edde           edddd           edd ed	d
e	          d           gZ
dS )EDNS0N3UzNSEC3 Hash Understood (N3U)r  rQ   r  Nr  r  r  r  r   c                     | j         S r  r  r  s    r  r  zEDNS0N3U.<lambda>  r  r   r  )rd  re  rf  r  r$   r  r   r   r   dnssecnsec3algotypesr1  r  r   r  r  r    su        (D!>)Q
;; =4*#NNN!>*d"/-A7K"L"L-B-BD D DEKKKr   r  c                   B    e Zd Zej        ZdZdZd Zd Z	d Z
d Zd ZdS )	ClientSubnetv4r      c                     t          j        |                     |          d          }t          |t          j        | j        d                    }||d          |                     ||d |                   fS NrS   )operatorfloordivr  min	af_lengthr  )rb  rN  r  szs       r  r  zClientSubnetv4.getfield   si    t//44a88X&t~q99::vtxxQssV,,,,r   c                     | j         |                     |          z
  }|r|dt          j        |d          z  z  }|d t          j        | j         d                   }t	          | j        |          S )Nr  rS   )r  r  r  r  r2   
af_familly)rb  rN  r  paddings       r  r  zClientSubnetv4.m2i&  sq    .4#3#3C#8#88 	98,Wa8888A4!$.!4445!,,,r   c                    t          | j        t          |                    }t          t	          t          j        | j        d                              d d d         D ]"}t          ||                   dk    r|dz  } n#|d |         S )NrS   r  r   rE   )	r3   r  r   ro  r=  r  r  r  r
   )rb  subnetpacked_subnetis       r  _pack_subnetzClientSubnetv4._pack_subnet.  s    !$/9V3D3DEEeH-dna@@AABB44R4H 	 	A=#$$))Q * RaR  r   c                     || j         S 	 |                     |          S # t          t          j        f$ r- d|_        t          dd                              |          cY S w xY w)NrG   r  )
af_defaultr  OSErrorsocketerrorfamilyClientSubnetv6rw  s      r  ry  zClientSubnetv4.i2m7  su    9?"	:$$Q'''& 	: 	: 	:CJ!"b))66q99999	:s     A A#"A#c                     |dS 	 t          |                     |                    S # t          t          j        f$ r: d|_        t          t          dd                              |                    cY S w xY w)NrE   rG   r  )r   r  r  r  r	  r
  r  rw  s      r  r|  zClientSubnetv4.i2lenA  s    91	?t((++,,,& 	? 	? 	?CJ~b"--::1==>>>>>	?s   !( AA87A8N)rd  re  rf  r  AF_INETr  r  r  r  r  r  ry  r|  r  r   r  r  r    sp        JIJ- - -- - -! ! !: : :? ? ? ? ?r   r  c                   $    e Zd Zej        ZdZdZdS )r         N)rd  re  rf  r  AF_INET6r  r  r  r  r   r  r  r  L  s        JIJJJr   r  c                      e Zd ZdZ edde           eddddd 	           ed
d           eddddd            edd           e	 e
ddd           d f eddd           d fg e
ddd                     gZdS )EDNS0ClientSubnetzDNS EDNS0 Client Subnetr  rS   r  Naddressr  c                     |dz   S NrK   r  rN  r  s     r  r  zEDNS0ClientSubnet.<lambda>V  
    q1u r   )r  adjustr
  rE   source_plenBc                     |dz  S r  r  r  s     r  r  zEDNS0ClientSubnet.<lambda>[  r  r   r  r  r  
scope_plenr   z192.168.0.0c                     | j         S r  r  r  s    r  r  zEDNS0ClientSubnet.<lambda>_      q} r   r  c                     | j         dk    S NrE   r
  r  s    r  r  zEDNS0ClientSubnet.<lambda>`      SZ1_ r   z
2001:db8::c                     | j         S r  r   r!  s    r  r  zEDNS0ClientSubnet.<lambda>b  r"  r   c                     | j         dk    S NrG   r%  r  s    r  r  zEDNS0ClientSubnet.<lambda>c  r&  r   c                     | j         S r  r   r!  s    r  r  zEDNS0ClientSubnet.<lambda>e  s    AM r   )rd  re  rf  r  r$   r  r   r%   r   r"   r  r  r1  r  r   r  r  r  R  s        $D!>)Q
;; =4(<(<> > >:h** =+4%((<(<> > > 9\1--$$'	=%<%<> > >446 (	<%<%<> > >4467 &~i2I2IK K KL LMKKKr   r  c                       e Zd ZdZ edde           eddddd 	           ed
dd           eddd           gZ	dS )EDNS0COOKIEzDNS EDNS0 COOKIEr  rW   r  Nserver_cookier  c                     |dz   S r  r  r  s     r  r  zEDNS0COOKIE.<lambda>l  r  r   r  client_cookies           rS   )lengthr  c                 2    t          d| j        dz
            S )Nr   rS   )maxr  r  s    r  r  zEDNS0COOKIE.<lambda>o  s    AszA~8N8N r   r  )
rd  re  rf  r  r$   r  r   r)   r*   r1  r  r   r  r,  r,  h  s        D!>)R<< =4?PT(<(<> > >$$_k!LLL<,N,NP P P	QKKKr   r,  OtherzUnsupported DNSKEY AlgorithmzUnsupported DS Digest TypezStale AnswerzForged AnswerzDNSSEC IndeterminatezDNSSEC BoguszSignature ExpiredzSignature Not Yet ValidzDNSKEY MissingzRRSIGs MissingzNo Zone Key Bit SetzNSEC MissingzCached Errorz	Not ReadyBlockedCensoredFiltered
ProhibitedzStale NXDOMAIN AnswerzNot AuthoritativezNot SupportedzNo Reachable AuthorityzNetwork ErrorzInvalid DatazSignature Expired before Validz	Too Earlyz"Unsupported NSEC3 Iterations ValuezUnable to conform to policySynthesized)re   rg   ri   rk   rm   ro   rq   rr   rt   rv   rx   rz   r|   c                       e Zd ZdZ edde           eddddd 	           ed
de           eddd           gZ	dS )EDNS0ExtendedDNSErrorzDNS EDNS0 Extended DNS Errorr  ra   r  N
extra_textr  c                     |dz   S r)  r  r  s     r  r  zEDNS0ExtendedDNSError.<lambda>  r  r   r  	info_coder   r  c                     | j         dz
  S r)  r  r  s    r  r  zEDNS0ExtendedDNSError.<lambda>  s    szA~ r   r  )
rd  re  rf  r  r$   r  r   extended_dns_error_codesr'   r1  r  r   r  r:  r:    s        )D!>)R<< =4<T(<(<> > >!>+q2JKK;|R+E+EG G G	HKKKr   r:  )rK   rM   rO   rQ   rS   rW   ra   c                    g }| rt          |           dk     r$t          j        dt          |                      dS t          | d                   }d|z  }t          | d                   }|dk    s|dk    rt          j        d|           dS | dd|z            }t	          t          |                    D ]B}d	}t	          d
          D ].}t          ||                   |z  r|||d
z  z   |z   gz  }|dz	  }/C| d|z   d         } | |S )z`
    Decode the 'Type Bit Maps' field of the NSEC Resource Record into an
    integer list.
    rG   zbitmap too short (%i)Nr   r   rE   r   zbitmap length is no valid (%i)r  rS   )r   r   r  r
   r=  )	bitmapRRlistwindow_blockoffset
bitmap_len
tmp_bitmapbr  r  s	            r  bitmap2RRlistrH    sE    F
 )v;;??4c&kkBBBF6!9~~|#^^
??j2oo=zJJJFAa*n,-
 s:'' 	 	AA1XX  z!}%%) 3vA~122FF	 J(5  )8 Mr   c                    ddl }d}d t          t          |                     D             } t          |                    | d         dz                      }t          |                    | d         dz                      }||k    r|dz  }t          ||dz             D ]t          fd| D                       s d         dk    rd}n6d         d	z  z
  }t          |                    |d
z                      dz   }|dk    rd}|t          j        d|          z  }|d	                    fdt          |          D                       z  }|S )zy
    Encode a list of integers representing Resource Records to a bitmap field
    used in the NSEC Resource Record.
    r   Nr   c                 8    g | ]}|d k    t          |          S )r   )r   r  r  s     r  rn  z!RRlist2bitmap.<locals>.<listcomp>  s#    
:
:
:aqEzz3q66zzzr   r  g      p@rE   c              3   N   K   | ]}d z  |cxk    rd dz   z  k     n n|V   dS )r   rE   Nr  )r  r  wbs     r  r  z RRlist2bitmap.<locals>.<genexpr>  sP      IIa#(a*H*H*H*H#a.*H*H*H*H*H*H*H*H*HIIr   r   rS   r   BBc              3   x   K   | ]3t          j        d t          fdD                                 V  4dS )   Bc              3      K   | ]=}d z  dz  z   |cxk    rd z  dz  z   dz   k     $n ndd|d z  z
  z
  dz  z   z  V  >dS )r   rS   rG   rQ   Nr  )r  r  tmprM  s     r  r  z*RRlist2bitmap.<locals>.<genexpr>.<genexpr>  s       I IaRx!c')QGGGGrAG1Ca1GGGGGG !q38|,a89GGGGI Ir   N)r  r  sum)r  rR  rrlistrM  s    @r  r  z RRlist2bitmap.<locals>.<genexpr>   s       
 

 	 K I I I I I6 I I I I I 
 
 
 
 
 
r   )
mathsortedsetintceilfloorr=  r  r  r   )	lstrU  rA  max_window_blocksmin_window_blocksbytes_countr2  rT  rM  s	          @@r  RRlist2bitmapr_    s    KKKF
:
:6#c((++
:
:
:C DIIc"gn5566DJJs1v}5566---Q%'81'<== 
 
 IIII3IIIII 	 ":??KK*sRx'Cdiiq1122Q6KK&+dB444 	#(( 
 
 
 
 

 {++
 
 
 
 
 	
 Mr   c                       e Zd ZdZd Zd ZdS )RRlistFieldrE   c                 R    |r$t          |t                    rt          |          S |S r  )r2  ro  r_  rw  s      r  rm  zRRlistField.h2i  s.     	$At$$ 	$ ###r   c                     |sdS |                      ||          }t          |          }|rd |D             nt          |          S )Nz[]c                 D    g | ]}t                               ||          S r  )r  r  )r  rrs     r  rn  z&RRlistField.i2repr.<locals>.<listcomp>  s&    666R$$666r   )r  rH  repr)rb  rN  r  rT  s       r  i2reprzRRlistField.i2repr  sT     	4HHS!q!!:@M66v6666d1ggMr   N)rd  re  rf  r  rm  rg  r  r   r  ra  ra    s<        F  
N N N N Nr   ra  c                       e Zd ZdZd Zd ZdS )_DNSRRdummyz=Dummy class that implements post_build() for Resource Recordsc                 <   | j         ||z   S t          | j        d                             d|                     d                              }t          |          |z
  dz
  }|d |dz            }t          j        d|          ||dz   dz   d          z   }||z   |z   S )Nr   r  r  rW   rS   r  rG   )rJ  r   r1  ry  r5  r  r  )rb  rN  r  lrrnamer  tmp_pkts         r  r  z_DNSRRdummy.post_build  s    :!9d&q)--b$2B2B82L2LMMNNc((W$r)lw{l#k$((3w{Q/?/?+@@}s""r   c                     t           j        S r  r	   padding_layerrb  payloads     r  default_payload_classz!_DNSRRdummy.default_payload_class)      !!r   N)rd  re  rf  r  r  rr  r  r   r  ri  ri    s7        JD	# 	# 	#" " " " "r   ri  c                      e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edddd           eddd            edddd           eddd           g
ZdS )
DNSRRHINFOzDNS HINFO Resource Recordr  r  r4  r]   
cacheflushr   rE   r  ra   ttlrJ  Ncpulenr  cpur  r  c                     | j         S r  )rx  r  s    r  r  zDNSRRHINFO.<lambda>6  s     r   r  oslenosc                     | j         S r  )r|  r  s    r  r  zDNSRRHINFO.<lambda>8  s    qw r   rd  re  rf  r  r3  r$   r  r   r   r  r    r%   r   r'   r1  r  r   r  ru  ru  -  s        &D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,, =4TUKKK;ub6H6HIII =$DDIII;tR5F5FGGG	IKKKr   ru  c                       e Zd ZdZ edd           edde           eddd           ed	dde	           e
d
d           edd           edd           edd          gZdS )DNSRRMXzDNS MX Resource Recordr  r  r4  ra   rv  r   rE   r  rw  rJ  N
preferenceexchangerd  re  rf  r  r3  r$   r  r   r   r  r    r%   r1  r  r   r  r  r  ;  s        #D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,:lA..;z2..KKKr   r  c                   "   e Zd ZdZ edd           edde           edde           edd	           e	d
d           edd           edd           edd	           edd	           edd	           edd	           edd	          gZ
dS )DNSRRSOAzDNS SOA Resource Recordr  r  r4  rO   r  rE   rw  r   rJ  Nmnamernameserialrefreshretryexpireminimum)rd  re  rf  r  r3  r$   r  r  r    r%   r1  r  r   r  r  r  H  s        $D;x,,!>&!X66!>(Az::8E1%%:gt,,;w++;w++8Ha((8Iq))8GQ''8Ha((8Iq))KKKr   r  c                   l   e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edde           edde           edd           e
dd           edd           edd           edd           edd           edd          gZdS )	DNSRRRSIGzDNS RRSIG Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Ntypecovered	algorithmrM   labelsoriginalttl
expiration	inceptionkeytagsignersname	signature)rd  re  rf  r  r3  r$   r  r   r   r  r    r%   r   r  r   r(   r&   r1  r  r   r  r  r  Y  s       &D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,!>-H== =aAA9Xq))8M1--<a00<Q//:h**;}b118K,,KKKr   r  c                       e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edd           edg           gZdS )	DNSRRNSECzDNS NSEC Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Nnextnametypebitmaps)rd  re  rf  r  r3  r$   r  r   r   r  r    r%   ra  r1  r  r   r  r  r  m  s        %D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,;z2..;}b11KKKr   r  c                       e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edddd           edd           edde           edd          g
ZdS )DNSRRDNSKEYzDNS DNSKEY Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Nflagsr   rc   zS???????Z???????protocolrI   r  rM   	publickey)rd  re  rf  r  r3  r$   r  r   r   r  r    r%   r   r   r   r  r&   r1  r  r   r  r  r  z  s        'D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,:gsB0BCC 9Z++ =aAA8K,,KKKr   r  c                       e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edd           edde           edde           edd          g
ZdS )DNSRRDSzDNS DS Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Nr  r  rM   
digesttypedigest)rd  re  rf  r  r3  r$   r  r   r   r  r    r%   r   r  r  r&   r1  r  r   r  r  r    s        #D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,:h** =aAA =q2CDD8Hb))
KKKr   r  c                       e Zd ZdZd ZdS )DNSRRDLVzDNS DLV Resource Recordc                 n    t          j        | g|R i | |                    dd          s	d| _        d S d S )Nr4  r   r   )r  __init__r  r4  )rb  r(  r  s      r  r  zDNSRRDLV.__init__  sN    .......yy## 	DIII	 	r   N)rd  re  rf  r  r  r  r   r  r  r    s(        $D    r   r  c                   r   e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edd           edddddi           edd           edddd           eddd            edddd           eddd            edg           gZdS )
DNSRRNSEC3zDNS NSEC3 Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Nhashalgr  rS   zOpt-Out
iterations
saltlengthr  saltrz  c                     | j         S r  r  r  s    r  r  zDNSRRNSEC3.<lambda>  s     r   r  
hashlengthnexthashedownernamec                     | j         S r  )r  r  s    r  r  zDNSRRNSEC3.<lambda>  s
    PQP\ r   r  )rd  re  rf  r  r3  r$   r  r   r   r  r    r%   r   r   r'   ra  r1  r  r   r  r  r    s       &D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,9Y**<A9~>>:lA.. =qdfMMM;vr7M7MNNN =qdF[\\\;4bF\F\]]];}b11KKKr   r  c                      e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edd           edd           edd           edddd           eddd           gZdS )DNSRRNSEC3PARAMzDNS NSEC3PARAM Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Nr  r  r  r  r  r  rz  c                     | j         S r  r  r  s    r  r  zDNSRRNSEC3PARAM.<lambda>  s    3> r   r  )rd  re  rf  r  r3  r$   r  r   r   r  r    r%   r   r   r'   r1  r  r   r  r  r    s        +D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,9Y**9Wa((:lA.. =qdfMMM;vr7Q7QRRRKKKr   r  	mandatoryalpnzno-default-alpnportipv4hintechipv6hintdohpathohttp)	r   rE   rG   rI   rK   rM   rO   rQ   rS   c                   h   e Zd Zd Z edde           edddd           e edg  edde          d	 
          d f e	dg d 
          d f e
dd          d f edg  edd          d 
          d f edg  edd          d 
          d fg eddd 
                    gZd ZdS )SvcParamkeyr   r   Nvaluer  r  r  c                     | j         S r  r   r  s    r  r  zSvcParam.<lambda>      37 r   r  c                     | j         dk    S )Nr   r  r  s    r  r  zSvcParam.<lambda>      37a< r   c                     | j         S r  r  r  s    r  r  zSvcParam.<lambda>  s     r   c                     | j         dv S )N)rE   rG   r  r  s    r  r  zSvcParam.<lambda>  s    37f+< r   c                     | j         dk    S )NrI   r  r  s    r  r  zSvcParam.<lambda>  r  r   0.0.0.0c                     | j         S r  r  r  s    r  r  zSvcParam.<lambda>  r  r   c                     | j         dk    S r  r  r  s    r  r  zSvcParam.<lambda>  r  r   ::c                     | j         S r  r  r  s    r  r  zSvcParam.<lambda>  r  r   c                     | j         dk    S )NrO   r  r  s    r  r  zSvcParam.<lambda>  r  r   c                     | j         S r  r  r  s    r  r  zSvcParam.<lambda>  s    #' r   c                 
    d|fS r  r  r  s     r  r  zSvcParam.extract_padding  s    1ur   )rd  re  rf  r  r$   svc_param_keysr   r"   r   r  r%   r9   r   r'   r1  r  r  r   r  r  r    s       D!>%N;; =SIII$$ +N7B+9>"a+P+P7J7JL L L  879
 )L"5H5HJ J J<<> 'Jw22779 +N7B+272y+A+A7J7JL L L  879
 +N7B+38B+=+=7J7JL L L  879'0 #{7B/A/AC C C3D DEK<    r   r  c                       e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edd           edd           edg e          g	ZdS )	DNSRRSVCBzDNS SVCB Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Nsvc_prioritytarget_name
svc_params)rd  re  rf  r  r3  r$   r  r   r   r  r    r%   r#   r  r1  r  r   r  r  r    s        %D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,:na00;}b11"?<X>>@KKKr   r  c                   d    e Zd ZdZ edd           edde          gej        dd         z   ZdS )
DNSRRHTTPSzDNS HTTPS Resource Recordr  r  r4  r   rG   N)	rd  re  rf  r  r3  r$   r  r  r1  r  r   r  r  r    sN        &D;x,,!>&"h77 ,QRR01KKKr   r  c                       e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edd           edd           edd           edd          g
ZdS )DNSRRSRVzDNS SRV Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Npriorityweightr  targetr  r  r   r  r  r    s        $D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,:j!,,:h**:fa((;x,,	0KKKr   r  )zHMAC-MD5.SIG-ALG.REG.INT	hmac-sha1c                   ,    e Zd Zd Zd Zd Zd Zd ZdS )TimeSignedFieldc                 6    t          j        | ||d           d S )N6sr  )r   r  )rb  r  defaults      r  r  zTimeSignedField.__init__*  s!    tT7555555r   c                     t          j        d|dd                   d         }|t          j        d|dd                   d         z  }|S )z#Unpack the internal representation.r  NrG   r   z!I)r  r  )rb  packed_secondssecondss      r  _convert_secondsz TimeSignedField._convert_seconds-  sJ    -nRaR&899!<6=~abb'9::1==r   c                 P    |d}|dz	  dz  }|dz  }t          j        d||          S )zYConvert the number of seconds since 1-Jan-70 UTC to the packed
           representation.Nr   r   r   l    z!HI)r  r  )rb  rN  r  	tmp_shorttmp_ints        r  ry  zTimeSignedField.i2m3  s:     ?G]f,	J&{5)W555r   c                 4    |dS |                      |          S )z[Convert the internal representation to the number of seconds
           since 1-Jan-70 UTC.N)r  )rb  rN  r  s      r  r  zTimeSignedField.m2i?  s#     !4$$^444r   c                 T    t          j        |          }t          j        d|          S )zRConvert the internal representation to a nice one using the RFC
           format.z%a %b %d %H:%M:%S %Y)timegmtimestrftime)rb  rN  r  time_structs       r  rg  zTimeSignedField.i2reprH  s&     k.11}3[AAAr   N)rd  re  rf  r  r  ry  r  rg  r  r   r  r  r  )  sd        6 6 6  
6 
6 
65 5 5B B B B Br   r  c                   f   e Zd ZdZ edd           edde           edde           edd	           e	d
d           edd           e
dd	           e	dd	           edddd           eddd            e	dd	           e	dd	           edd	dd           eddd           gZdS )	DNSRRTSIGzDNS TSIG Resource Recordr  r  r4  r   r  rE   rw  r   rJ  N	algo_namer  time_signedfudgemac_lenrk   r  mac_datarz  c                     | j         S r  )r  r  s    r  r  zDNSRRTSIG.<lambda>Z  s    s{ r   r  original_idr	  	other_len
other_datac                     | j         S r  )r  r  s    r  r  zDNSRRTSIG.<lambda>^  s     r   )rd  re  rf  r  r3  r$   r  r  r    r%   r  r   r'   r1  r  r   r  r  r  O  s       %D;x,,!>&#x88!>(Az::8E1%%:gt,,;{K88"?=!44:gq)) =BDJOOO;z2;R;RSSS:mQ//:gq)) =aT\RRR;|R=V=VWWWKKKr   r  c                      e Zd ZdZ edd           edde           eddd           ed	dd
e	           e
dd           edd           edd           edd           edddd           eddd            edddd           eddd            edddd           eddd            edd          gZdS )
DNSRRNAPTRzDNS NAPTR Resource Recordr  r  r4  r   rv  r   rE   r  ra   rw  rJ  Norderr  	flags_lenr  r  rz  c                     | j         S r  )r  r  s    r  r  zDNSRRNAPTR.<lambda>m  s    CM r   r  services_lenservicesc                     | j         S r  )r  r  s    r  r  zDNSRRNAPTR.<lambda>p  s	    s7G r   
regexp_lenregexpc                     | j         S r  )r	  r  s    r  r  zDNSRRNAPTR.<lambda>r  s    S^ r   replacementr  r  r   r  r  r  b  s<       &D;x,,!>&"h778L!Q//<!R<<8E1%%:gt,,:gq)):lA.. =dPPP;w8Q8QRRR =4:VVV;z2+G+GI I I =tRRR;x9S9STTT;}b11KKKr   r  c                   `   e Zd ZdZdZ edd           edde           eddd           e	ddd	e
           ed
d           edddd           e edd          d f edd          d f eddd           d f eddgd           d fg eddd                     gZd ZdS )DNSRRzDNS Resource Recordr   r  r  r4  rE   rv  r  ra   rw  rJ  Nr  r  r  r  c                     | j         dk    S r$  r4  r  s    r  r  zDNSRR.<lambda>  s    38q= r   r  c                     | j         dk    S )Nrz   r  r  s    r  r  zDNSRR.<lambda>      38r> r   c                     | j         S r  r  r  s    r  r  zDNSRR.<lambda>  s    	 r   r  c                     | j         dv S )N)rG   rI   rK   rM   r[   r   r  r  s    r  r  zDNSRR.<lambda>  s    387K+K r   c                     | j         S r  r  r  s    r  r  zDNSRR.<lambda>  s     r   c                     | j         dk    S )Nrc   r  r  s    r  r  zDNSRR.<lambda>  r  r   c                     | j         S r  r  r  s    r  r  zDNSRR.<lambda>  s    #) r   c                     t           j        S r  rn  rp  s     r  rr  zDNSRR.default_payload_class  rs  r   )rd  re  rf  r  show_indentr3  r$   r  r   r   r  r    r   r"   r9   r   r  r'   r1  rr  r  r   r  r  r    sl        DK;x,,!>&!X668L!Q//<!R<<8E1%% =$'sKKK$$ $GGY7788: %HWd3399; (K4I4IK K KKKM )L2$5J5JL L L99;  #{7B/C/CE E E# K6" " " " "r   r  c                    | rt          | d          \  }}t                              t          j        d|dd                   d         t
                    }t          |           t          |          z
  dz   t          j        d|dd                   d         z   } || d|         fi |t          j        | |d                   z  }|j	        d	= |S dS )
z
    DNSRR dispatcher func
    T)r  r  NrG   r   rW   rS   rJ  )
r  DNSRR_DISPATCHERr  r  r  r  r   r	   ro  fields)r  r)  _r  r  rrlenrN  s          r  _DNSRRr    s     	 t<<<	6""M$rr
++A.
 

 FFS[[ M$qt--a01 	
 c!FUF)&&v&&);AeffI)F)FF Jw
4r   c            	           e Zd ZdZdZ edd           edde           eddd           e	ddd	e
          gZd
 ZdS )DNSQRzDNS Question Recordr   qnamezwww.example.comqtyperE   unicastresponseqclassra   c                     t           j        S r  rn  rp  s     r  rr  zDNSQR.default_payload_class  rs  r   N)rd  re  rf  r  r  r3  r$   	dnsqtypesr   r   r  r1  rr  r  r   r  r!  r!    sz         DK;w(9::!>'1i888-q!44<!R<<>K
" " " " "r   r!  c                   $     e Zd Z fdZd Z xZS )_DNSPacketListFieldc                     |t          j        dt                     g }t          t          |                               ||          S )NzyThe DNS fields 'qd', 'an', 'ns' and 'ar' are now PacketListField(s) ! Setting a null default should be [] instead of None)r%  r&  r'  rp  r)  rq  rr  s      r  rq  z_DNSPacketListField.any2i  sO    9MG #	   A($//55c1===r   c                 >     G d dt                     } ||          S )Nc                       e Zd ZdZd ZdS )&_DNSPacketListField.i2h.<locals>._listzY
            Fake list object to provide compatibility with older DNS fields
            c                     	 t          | d         |          }t          j        dt                     |S # t          $ r  w xY w)Nr   zThe DNS fields 'qd', 'an', 'ns' and 'ar' are now PacketListField(s) ! To access the first element, use pkt.an[0] instead of pkt.an)getattrr%  r&  r'  rK  )rb  attrrets      r  __getattr__z2_DNSPacketListField.i2h.<locals>._list.__getattr__  s]    !$q'400CM" +   J%   s	   14 A N)rd  re  rf  rg  r2  r  r   r  _listr-    s-             r   r3  )ro  )rb  rN  r  r3  s       r  r  z_DNSPacketListField.i2h  s;    	 	 	 	 	D 	 	 	" uQxxr   )rd  re  rf  rq  r  r  r  s   @r  r)  r)    sG        
> 
> 
> 
> 
>      r   r)  c                   x   e Zd Zd Z e edd          d            edd           eddd           eddd	d
ddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd	ddddddd           eddd           ed dd!           ed"dd#           ed$dd%           e	d e
            ge
d& '           e	d!g ed( '           e	d#g ed) '           e	d%g ed* '          gZd+ Zd, Zd- Zd. Zd/ Zd0 ZdS )1rA  r0  Nc                 6    t          | j        t                    S r  )r2  rL  r;   r!  s    r  r  zDNS.<lambda>  s    :alC#@#@ r   idr   qrrE   opcoderK   QUERYIQUERYSTATUS)r   rE   rG   aatcrdrar  adcdrcodeokzformat-errorzserver-failurez
name-errorznot-implementedrefused)r   rE   rG   rI   rK   rM   qdcountr-  )r  ancountr.  nscountr/  arcountr0  c                     | j         S r  )rE  r  s    r  r  zDNS.<lambda>  s    3; r   r  c                     | j         S r  )rF  r  s    r  r  zDNS.<lambda>      S[ r   c                     | j         S r  )rG  r  s    r  r  zDNS.<lambda>  rK  r   c                     | j         S r  )rH  r  s    r  r  zDNS.<lambda>  rK  r   c                 b    t          | j        t                    r| j        dd          S | j        S r)  )r2  rL  r;   originalra  s    r  rc  zDNS.get_full  s/    dos++ 	!=$$= r   c                 x    t          |t                    o%| j        |j        k    o| j        dk    o
|j        dk    S )NrE   r   )r2  rA  r6  r7  )rb  others     r  answerszDNS.answers  sC    5#&& 58#1 A	r   c                    d}| j         r`d}| j        r6t          | j        d         t                    rd| j        d         j        z  }n_| j        dk    r|                     d          }n>d}| j        r5t          | j        d         t                    rd| j        d         j	        z  }t          | j
        t                    r| j
        j        dk    rdndd	||S )
Nr  Ansr   z %sz %rcode%Qry  mzDNS )r7  r.  r2  r  r  rB  sprintfr-  r!  r"  rL  r:   dport)rb  r  r4  s      r  	mysummaryzDNS.mysummary  s    7 		0Dw 0:dgaj%88 0twqz//q||J//Dw 0:dgaj%88 0twqz// $/3//48O4IT4Q4Q C  DD
 	
r   c                     t          | j        t                    r7| j        0t	          j        dt          |          dz
            |dd          z   }||z   S )Nr  rG   )r2  rL  r;   r0  r  r  r   r  s      r  r  zDNS.post_build3  sO    dos++ 	<0C+dCHHqL11CG;CSyr   c                      t          |           S )z9Return the compressed DNS packet (using `dns_compress()`))r]  ra  s    r  compresszDNS.compress8  s    D!!!r   c                 n   t          | j        t                    rt          |          dk    r$t	          j        d|dd                   d         }n%d}t          j        |           t          |          |dk     st          |          |k     r%d}t          j        |           t          |          |S )zH
        Check that a valid DNS over TCP message can be decoded
        rG   r  Nr   z!Malformed DNS message: too small!r_   z&Malformed DNS message: invalid length!)	r2  rL  r;   r   r  r  r   r  r   )rb  r  dns_lenmessages       r  pre_dissectzDNS.pre_dissect<  s     dos++ 	/ 1vv{{ -ae44Q7= )))%g... ||s1vv//B )))%g...r   )rd  re  rf  r  r   r%   r   r   r   r)  r!  r  r1  rc  rR  rZ  r  r]  ra  r  r   r  rA  rA    sK       DHd33@@	B 	B
4q!Xq!X(%K%KLLq!q!q!q!aq!q!Wa(8\(9i%I %I 	J 	J 	i555i555i555i555D5577)U?V?VWWWD"f9P9PQQQD"f9P9PQQQD"f9P9PQQQ1K6! ! !  
 
 
(  
" " "    r   rA  rV  )rY  )sport224.0.0.251)DestIP6Fieldff02::fb	dns_cachei,  c           	          t           j                            d          t           j                            d|           } d                    | t          j        d          g|rdgng z             }t          	                    |          }|r|S |
                    d|           |
                    dd           d}t          j        D ]e}		 t          j        t          j        t          j                  }
|
                    |d                    |
                    |	df           t%          |
t&                    }
 |
j        t'          t          | 	          gt+                      
          fi |}nN# t,          $ rA}|r!t/          j        t3          |                     Y d}~|
                                 d}~ww xY w	 |
                                 n# |
                                 w xY w|r8|t&                   j        dk    r d}|rt/          j        d|	d|            c ng|D|r|}n1fdt;          j        |j        |j         |j!                  D             }|r
|t          |<   |S tD          )a~  
    Perform a simple DNS resolution using conf.nameservers with caching

    :param qname: the name to query
    :param qtype: the type to query (default A)
    :param raw: return the whole DNS packet (default False)
    :param verbose: show verbose errors
    :param timeout: seconds until timeout (per server)
    :raise TimeoutError: if no DNS servers were reached in time.
    N   ;r  s   rawtimeoutverboser   r   r"  r#  )r-  r6  rG   zDNS: z answered with failure for c                 *    g | ]}|j         k    |S r  r  )r  r  r#  s     r  rn  zdns_resolve.<locals>.<listcomp>  s,       6U?? "??r   )#r!  r#  	any2i_oner"  rq  r   r  r  
_dns_cacher  
setdefaultr	   nameserversr  r  
SOCK_DGRAM
settimeoutconnectr.   rA  r,   r5   IOErrorr   r   r  closerB  r  	itertoolschainr.  r/  r0  TimeoutError)r"  r#  r   rj  ri  r)  cache_identresultres
nameserversockexs    `          r  dns_resolver  c  s    K!!$..EKdE**E))	D%(()	 &b	" K ^^K((F 
i)))
i###
C&    
	=1BCCDOOF9-...LL*b)***c**D$(E7778Y[[III  CC  	 	 	 -#CGG,,,HHHJJLLLL		  JJLLLLDJJLLLL 	3x~"" $$&JJ!E   	  		FF   "@@  F
  	-&,J{#s1   B)E:9G:
G#G 'G GGG4c                    ||                     d          dz   d         }t          t          |           t                      z  t	          dt          |d          gt          |d||	          g
          z  dd          }|r9|                    t                    r|                    t                    j	        S dS )zSend a DNS add message to a nameserver for "name" to have a new "rdata"
dyndns_add(nameserver, name, rdata, type="A", ttl=10) -> result code (0=ok)

example: dyndns_add("ns1.toto.com", "dyn.toto.com", "127.0.0.1")
RFC2136
.rE   NdstrM   rP   rk  rF   r  r4  rw  r  r8  r-  r/  r   rj  ri  r  
findr,   r7   r:   rA  r!  r  haslayerrC  rB  )r|  r  r  r4  rw  zoners          r  
dyndns_addr    s     		#"##$DB:&A16T1O1O1O0P16d;>e2M 2M 2M 1N*O *O *O O q		" 	" 	"A
 	 QZZ__ zz#$$rr   c                    ||                     d          dz   d         }t          t          |           t                      z  t	          dt          |d          gt          ||dd	d
          g          z  d	d          }|r9|                    t                    r|                    t                    j	        S dS )zSend a DNS delete message to a nameserver for "name"
dyndns_del(nameserver, name, type="ANY", ttl=10) -> result code (0=ok)

example: dyndns_del("ns1.toto.com", "dyn.toto.com")
RFC2136
r  rE   Nr  rM   rP   rk  r   r   r  )r  r4  r  rw  r  r  r  r  r  )r|  r  r4  rw  r  r  s         r  
dyndns_delr    s     		#"##$DB:&A16T1O1O1O0P16d>CRT2V 2V 2V 1W*X *X *X X q		" 	" 	"A
 	 QZZ__ zz#$$rr   c                   F    e Zd ZdZdZeZ	 	 	 	 	 	 	 	 	 	 	 	 d
dZd Zd	 Z	dS )DNS_amdnsdzudp port 53NFTrW   c                 z   ddl m} t          | t                    | _        | j        t          k    | _        t          t          t          f          st          d          t          t          t          f          st          d          t          |t          t          f          st          d          t          |t          t          t          f          st          d          t          |t          |t          f          st          d          | j        r|	rt          d	          | j        r|
rt          d
          |d| _        | _        || _        fdd t          j        fd          | _        |r|t          |t$          t&          f          r'| j                            fd|D                        n9| j                            fd|                                D                        |i | _        n&fd|                                D             | _        || _        || _        t          |t                    rt          |          | _        n|| _        t          |t                    r ||          | _        n|| _        |	| _        |
| _        || _        dS )a+  
        Simple DNS answering machine.

        :param joker: default IPv4 for unresolved domains.
                      Set to False to disable, None to mirror the interface's IP.
                      Defaults to None, unless 'match' is used, then it defaults to
                      False.
        :param joker6: default IPv6 for unresolved domains.
                       Set to False to disable, None to mirror the interface's IPv6.
                       Defaults to False.
        :param match: queries to match.
                      This can be a dictionary of {name: val} where name is a string
                      representing a domain name (A, AAAA) and val is a tuple of 2
                      elements, each representing an IP or a list of IPs. If val is
                      a single element, (A, None) is assumed.
                      This can also be a list or names, in which case joker(6) are
                      used as a response.
        :param jokerarpa: answer for .in-addr.arpa PTR requests. (Default: False)
        :param relay: relay unresolved domains to conf.nameservers (Default: False).
        :param send_error: send an error message when this server can't answer
                           (Default: False)
        :param srvmatch: a dictionary of {name: (port, target)} used for SRV
        :param from_ip: an source IP to filter. Can contain a netmask. True for all,
                        False for none. Default True
        :param from_ip6: an source IPv6 to filter. Can contain a netmask. True for all,
                        False for none. Default False
        :param ttl: the DNS time to live (in seconds)
        :param src_ip: override the source IP
        :param src_ip6:

        Examples:

        - Answer all 'A' and 'AAAA' requests::

            $ sudo iptables -I OUTPUT -p icmp --icmp-type 3/3 -j DROP
            >>> dnsd(joker="192.168.0.2", joker6="fe80::260:8ff:fe52:f9d8",
            ...      iface="eth0")

        - Answer only 'A' query for google.com with 192.168.0.2::

            >>> dnsd(match={"google.com": "192.168.0.2"}, iface="eth0")

        - Answer DNS for a Windows domain controller ('SRV', 'A' and 'AAAA')::

            >>> dnsd(
            ...     srvmatch={
            ...         "_ldap._tcp.dc._msdcs.DOMAIN.LOCAL.": (389,
            ...                                                "srv1.domain.local"),
            ...     },
            ...     match={"src1.domain.local": ("192.168.0.102",
            ...                                  "fe80::260:8ff:fe52:f9d8")},
            ... )

        - Relay all queries to another DNS server, except some::

            >>> conf.nameservers = ["1.1.1.1"]  # server to relay to
            >>> dnsd(
            ...     match={"test.com": "1.1.1.1"},
            ...     relay=True,
            ... )
        r   )Net6Nz/Bad 'joker': should be an IPv4 (str) or False !z0Bad 'joker6': should be an IPv6 (str) or False !z0Bad 'jokerarpa': should be a hostname or False !z6Bad 'from_ip': should be an IPv4 (str), Net or False !z7Bad 'from_ip6': should be an IPv6 (str), Net or False !zCannot use 'src_ip' in mDNS !zCannot use 'src_ip6' in mDNS !Fc                     t          | t          t          f          r"t          |           dk    rt          |           S t          | t                    r| fS t          dt          |           z            )NrG   zBad match value: '%s')r2  tuplero  r   r  
ValueErrorrf  )r  joker6s    r  normvz#DNS_am.parse_options.<locals>.normvC  sj    !eT]++ DA!QxxAs## D6{" !8477!BCCCr   c                 |    t          |                                           } |                     d          s| dz  } | S )Nr   )r   lowerrH  )r  s    r  normkz#DNS_am.parse_options.<locals>.normkK  s;    Q%%''A::d## T	Hr   c                       fS r  r  )jokerr  s   r  r  z&DNS_am.parse_options.<locals>.<lambda>Q  s    eV_ r   c                 (    i | ]} |          d S )NNr  )r  r  r  s     r  
<dictcomp>z(DNS_am.parse_options.<locals>.<dictcomp>T  s#    "I"I"Ia5588\"I"I"Ir   c                 @    i | ]\  }} |           |          S r  r  r  r  r  r  r  s      r  r  z(DNS_am.parse_options.<locals>.<dictcomp>V  s/    "P"P"P$!Q5588UU1XX"P"P"Pr   c                 @    i | ]\  }} |           |          S r  r  r  s      r  r  z(DNS_am.parse_options.<locals>.<dictcomp>Z  s/    MMMDAqUU1XXuuQxxMMMr   )scapy.layers.inet6r  r2  mDNS_ammDNSr  rA  llmnrr  boolr  r   r  r  	jokerarpacollectionsdefaultdictmatchro  rW  updateitemssrvmatch
send_errorrelayfrom_ipfrom_ip6src_ipsrc_ip6rw  )rb  r  r  r  r  r  r  r  r  r  r  rw  r  r  r  r  s    `  `         @@r  parse_optionszDNS_am.parse_options  s   R 	,+++++tW--	X_
 %#t-- 	P%2CNOOO&3+.. 	Q63EOPPP)c4[11 	QOPPP'Cd#344 	WUVVV(S$$566 	XVWWW9 	> 	><===9 	? 	?=>>>=U.E
"	D 	D 	D 	D 	D	 	 	 !,-D-D-D-D-DEE
 	R%$-- R
!!"I"I"I"I5"I"I"IJJJJ
!!"P"P"P"P"P%++--"P"P"PQQQDMMMMMMMHNN<L<LMMMDM$
gs## 	#w<<DLL"DLh$$ 	% DNNDMM$DMr   c                 *   ddl m} |                    | j                  os|                    | j                  j        dk    oP||v r$| j        du p| j        o||         j        | j        v n(| j        du p| j        o|t                   j        | j        v S )Nr   r<   T)
r  r=   r  r  rC  r7  r  srcr  r7   )rb  reqr=   s      r  
is_requestzDNS_am.is_requestj  s    ++++++LL"" LL""%* 3;; MT) G]Es4y}'E LD( C\Ac"gkT\&A	
r   c                     |                                 }t          |v rǉ j        r&d\  |t                   _        |t                   _        n j        r6d |t                   j        c|t                   _        |t                   _        n]|t                   j        dk    rd n|t                   j        |t                   j        c|t                   _        |t                   _        ddlm} ||v r||         j        	                                  j        r$| |d j
        ||         j        d          z  }n j        r:| |||         j         j
        ||         j        ||         j                  z  }n}| |||         j         j
        p||         j        ||         j        ||         j                  z  }n6t          |v r|t                   j        	                                  j        r,|t          d j        |t                   j        d	          z  }nՉ j        rL|t          |t                   j         j        |t                   j        |t                   j        	          z  }n|t          |t                   j         j        p|t                   j        |t                   j        |t                   j        	          z  }n$t#          d
|                                           d S 	 |t'          |t&                   j        |t&                   j                  z  }n5# t,          $ r( t#          d|                                d           Y d S w xY w	 | j                 }n@# t,          $ r3 t#          d j        j        |                                d           Y d S w xY w	 |j        }n5# t4          $ r( t#          d|                                d           Y d S w xY w	 t7          d |D                       |                               |                    fddD                        n# t<          $ r Y nw xY wg }g }|D ]4t?          t@                    r%t#          d                                d           =j!        "                                }j#        dv rxj#        dk    r j$        |         d         }|] j%        sVtM           j'        (                    dtR          j*                            }	 j        r|	j+        d         }ntY          |	          } j        r|r||v r|||         _        nj#        dk    r j$        |         d         }|] j%        sVtM           j'        (                    dtR          j*                            }	 j        r|	j+        d         }nt[          |	          } j        r|rt          |v r||t                   _        |r<t?          |t\                    s|g}|                     fd|D                        nj#        dk    rT	  j/        |         \  }
}|0                    tc          j!        |
|d j                             '# td          $ r Y new xY wj#        dk    rVj!        dd          d k    rC j3        r<|0                    ti          j!        j#         j         j3        !                      j%        rF	 tk          j!        j#        "          }|r|                    |           n# tl          $ r Y nw xY w j        rH|0                    to           j        j!        j!        tq          j#        g          #                     6 j        rts          d$ |D                       rd S |sZ j:        r(|                     |j        d|j        d%&          z  }|S tw          j<        d'|=                                z             d S  j        rC|0                    t}          d(t          |t                   j        )          g*                      j        r"                     |j        dddg ||+          }n$                     |j        d|j        ||,          } j        s|t          |          z  }n||z  }|S )-Nr  zff:ff:ff:ff:ff:ffr   r<   re  r   )r  r  flhlimrc  )r  r  r6  rw  zNo IP or IPv6 layer in %srb  rY  zNo UDP layer in %sT)exc_infozNo %s layer in %szNo qd attribute in %sc              3   D   K   | ]}t          |d d          dk    |V  dS )r#  Nr   )r/  rK  s     r  r  z$DNS_am.make_reply.<locals>.<genexpr>  s8      HHqwq'4'@'@C'G'G'G'G'G'GHHr   c                 T    g | ]$}t          |j        j        j                   %S ))r#  r"  r$  r%  )r!  r"  r$  r%  )r  r  allquerys     r  rn  z%DNS_am.make_reply.<locals>.<listcomp>  sM         ".$,$<#?	    r   )rE   rz   zCannot parse qd element %srz   rE   ifacerO   rK   c           
          g | ]:}t          j        j        |j        j        oj        j        k               ;S ))r  rw  r  r4  rv  )r  r"  rw  r#  r  )r  r  rqrb  s     r  rn  z%DNS_am.make_reply.<locals>.<listcomp>  s_     	  	  	   #%8 $"#!#'+y'IRX5I  	  	  	 r   r   r   )r  r  r  r  rw  r[   is   .in-addr.arpa.r  )r#  )rw  r  r  r  c              3   ,   K   | ]}|j         d k    V  dS )r   Nr  rK  s     r  r  z$DNS_am.make_reply.<locals>.<genexpr>4  s(      77aQVr\777777r   rI   )r6  r7  r-  rB  z"No answer could be provided to: %si  )r  )r  r  )r6  r<  r>  r7  r-  r0  r.  )r6  r7  r-  r0  r.  )ArB  r6   r  r  r  r  r  r=   rL  rM  r  r  r  r7   r  r6  rw  r   commandr:   rY  rb  
IndexErrorr  rd  r-  rK  nextremoveextendStopIterationr2  r   r"  r  r#  r  r  r+   optsniffr  r	   r  ipsr   r   ro  r  r  r  KeyErrorr  r  r  rx  r  r_  allr  r   r  summaryr  r  r]  )rb  r  respr=   queriesansarsrqnamer  r  r  r  _rslvdnsr  r  s   `             @@r  
make_replyzDNS_am.make_reply{  s	   xxzzC<<y 3=0Ue 37U0Ue  JN.AAADDs5z~JN 1Ue 	,+++++3;;J!00222y 
C  #D	38 8 8 8 CTDL #D	3t9>C C C C TDL4QCIM #D	3t9>C C C C3YYH..000y 
; }$+!"gjc3 3 3 3 ;s2w{!"gjc"gk; ; ; ; s2w{0Js2w{!"gjc"gk; ; ; ; /???F	Cc#hnCHNCCCCDD 	 	 	(#++--$GGGGFF			dh-CC 	 	 	#!	    FF		fGG 	 	 	+S[[]]TJJJJFF		HHGHHH H NN8$$$NN     !        	 	 	D	  e	 e	B"c"" 4bjjllTRRRRX^^%%Fx7""8r>> Jv.q1E}TZ} -dm.?.?.T.T U U9 $)IaLEE$0 %% %E y /U /tt||).T
X]] Jv.q1E}TZ} -dm.?.?.T.T U U9 $)IaLEE$/ %% %E y -U -rTzz',R %eT22 (!&JJ 	  	  	  	  	  "'	  	  	  	 	 	  R#'=#8LD&JJx!x!%" H            D R8CDD>%6664>6JJu!xX H"n	         z 'AAAE !

5))) ! $   D y 
 

98X -rxj 9 9      9 	77377777 	F 	 CFqSV1EEEACKKMMQRRRF9 		JJx$(KO        9 	G((cfqQ2##(NNCC((cfsv##(FFCz 	L%%%DDCKDsn   ;4L0 0.M"!M"&M4 49N10N15N= =.O/.O/3AQ 
QQ=AZ  
ZZ92\..
\;:\;)NNNFFFTFNNrW   F)
rd  re  rf  function_namefilterrA  r  r  r  r  r  r   r  r  r    s        MF
C"& #"!&!"$!" %I I I IV
 
 
"Y Y Y Y Yr   r  c                       e Zd ZdZdZdZdS )r  a  
    mDNS answering machine.

    This has the same arguments as DNS_am. See help(DNS_am)

    Example::

        - Answer for 'TEST.local' with local IPv4::

            >>> mdnsd(match=["TEST.local"])

        - Answer all requests with other IP::

            >>> mdnsd(joker="192.168.0.2", joker6="fe80::260:8ff:fe52:f9d8",
            ...       iface="eth0")

        - Answer for multiple different mDNS names::

            >>> mdnsd(match={"TEST.local": "192.168.0.100",
            ...              "BOB.local": "192.168.0.101"})

        - Answer with both A and AAAA records::

            >>> mdnsd(match={"TEST.local": ("192.168.0.100",
            ...                             "fe80::260:8ff:fe52:f9d8")})
    mdnsdzudp port 5353N)rd  re  rf  rg  r  r  r  r   r  r  r  W  s$         4 MFFFr   r  c                   ,    e Zd Z	 	 	 ddZddgdfdZdS )	DNSSDResultNDNS-SDc                 4    t          j        | |||           d S r  )r/   r  )rb  r{  r  statss       r  r  zDNSSDResult.__init__z  s!    
 	D#tU33333r   r\   r   Fc                    |rd}t                      }| j        o6t          | j        d         d         j        t                    ot
          j        }d}|rd|z   }| j        D ]l\  }}g }t          j        |t                   j
        |t                   j                  D ]}	|r"t                              |	j                  |vr&t          |	t                    r)|                    |	                    d                     dt          |	t$                    r)|                    |	                    d                     |                    |	                    d                     |j        |f}
|rDt
          j                            |j        j                  }|                    |f|
z              W|                    |
           nt+          t-          ||g                     dS )	z
        Print the list of discovered services.

        :param types: types to show. Default ['PTR', 'SRV']
        :param alltypes: show all types. Default False
        Nr   rE   )r7   Service)Macz%type%=%nextname%z%type%=(%target%,%port%)z%type%=%rdata%)ro  r{  r2  rL  r6   r	   manufdbrv  rw  rA  r.  r0  r  r  r4  r  r  rX  r  r  _resolve_MACprintr4   )rb  typesalltypesrP  resolve_macheaderr  r  attrsr0  r  macs               r  showzDNSSDResult.show  s     	Evv H DHQKN$=uEE L 	
 # 	'&FH 	! 	!DAqE!#	1S69== A A X\\$)44EAAdI.. ALL.A!B!BCCCCh// ALL.H!I!IJJJJLL.>!?!?@@@@5%.C !l//0@AASFSL))))C     	
 	
 	
 	
 	
r   )Nr  N)rd  re  rf  r  r  r  r   r  r  r  y  sP        4 4 4 4  % ,
 ,
 ,
 ,
 ,
 ,
r   r  z_services._dns-sd._udp.localc                    |t           j        k    r t          t          d|          d          }n1|t           j        k    rt          t          d|                    }ndS |t          dd          z  }|t          d	t          | |
          g          z  }t          |d||          \  }}t          |j                  S )aF  
    Performs a DNS-SD (RFC6763) request

    :param service: the service name to query (e.g. _spotify-connect._tcp.local)
    :param af: the transport to use. socket.AF_INET or socket.AF_INET6
    :param qtype: the type to use in the mDNS. Either TXT, PTR or SRV.
    :param iface: the interface to do this discovery on.
    rc  r   )r  rw  re  r  NrV  r  r   rk  )r>  r-  T)multiri  rj  )r  r  r7   r   r  r=   r:   rA  r!  r-   r  r{  )	serviceafr#  r  rj  ri  rN  r  r  s	            r  dnssdr    s     
V^XmU33===	v		x
E223333T&&&&C3!WE:::;<<<<C4'BBBFCswr   )NF)F)rF   FrE   rI   )rF   rW   )r   rW   )rg  rh  r  r  rv  r  r  r  r%  
scapy.archr   r   r   scapy.ansmachiner   scapy.base_classesr   r   scapy.configr	   scapy.compatr
   r   r   r   r   scapy.errorr   r   r   scapy.packetr   r   r   scapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   scapy.interfacesr+   scapy.sendrecvr,   r-   scapy.supersocketr.   scapy.plistr/   r0   r1   scapy.pton_ntopr2   r3   scapy.utilsr4   scapy.volatiler5   scapy.layers.l2r6   scapy.layers.inetr7   r8   r9   r:   r;   r  r=   typingr>   r?   r@   rA   rB   rC   r  r'  r  r  r  r  r  r  r  r#  r*  r]  r_  r3  r  r  r  r  r  r  r  r  r  r  r  r  r,  r?  r:  r  rH  r_  ra  ri  ru  r  r  r  r  r  r  r  r  r  r  r  r  r  r  tsig_algo_sizesrX  r  r  r  r  r  r  r  r!  r)  rA  	bind_addripv6_enabledrd  rp  netcache	new_cachern  commandsregisterr  r  r  r  r  r  r  r  r  r   r  <module>r     s    


                      
 . - - - - - , , , , , , , ,       ? ? ? ? ? ? ? ? ? ? ? ? ? ? = = = = = = = = = = 1 1 1 1 1 1 1 1 1 1                                               0 + * * * * * " " " " " " " " * * * * * * < < < < < < < < < < 0 0 0 0 0 0 0 0 # # # # # # $ $ $ $ $ $ ! ! ! ! ! ! @ @ @ @ @ @ @ @ @ @ @ @ @ @ # # # # # #               zst'('34e=>FG t  U %' 027 =? 	 %	  T	 $&w	 13E	 <>v	
 
 &
 j
 +-e
 68
 ACD  F  (*5 35e >@    6 w )+D 35f ?A$  V   )+E 46t >@ 
  "$V .0 <>w    \ $&v 028 >@  V   ,.u 79)  ' $&x 24V >@  G !%   *-e 69( EH  U   (+G 69' DG  e !% *-e 69%  !  D!  #(!   16z! ( vG'NN	 	     $4Du==
E1j E!Y E3C EQ EjE"#[E235EE*E,-}E>?E }E ')*E 79:ME 7	E :<=]	E
 yE
 #%gE 5;]2E E E #w9ARW`aa  &'22 J$ J$ J$ J$Z     *- - -R R Rj    &   .& .& .& .& .&+ .& .& .&b3 3 3 3 3; 3 3 3p $6g5U/C&( (

    &   < < < < <{ < < <$G G G G Gv G G G"    {   2E E E E E{ E E EE E E E E{ E E EE E E E E{ E E E.? .? .? .? .?[ .? .? .?b    ^   M M M M M M M M,Q Q Q Q Q+ Q Q Qw% # ~	
   ~           	!" 
#$ 	 (,%=   FH H H H HK H H H   % % %P1 1 1hN N N N N( N N N " " " " "& " " "$I I I I I I I I
 
 
 
 
k 
 
 
    {   "       (
 
 
 
 
 
 
 
    +   "    k        w          &    k   , 
 
! ! ! ! !v ! ! !H
@ 
@ 
@ 
@ 
@ 
@ 
@ 
@1 1 1 1 1 1 1 10 0 0 0 0{ 0 0 0 02 "$ $#B #B #B #B #BeCJ' #B #B #BL       &       *x
  	
 
   	 	  
  	 
   
8! (" " " " "F " " "D  0	" 	" 	" 	" 	"F 	" 	" 	"! ! ! ! !/ ! ! !H[ [ [ [ [
 [ [ [| CD ! ! ! ! CD ! ! ! ! CB     CB      c= 5 5 5 5 8//////L3
$7777 CB     CB     $#%% ]$$[#66
 K K K K\    &    &z z z z z z z zz    f   D4
 4
 4
 4
 4
* 4
 4
 4
n 0^           r   