a
    kÄ#dy§  ã                W   @   s”  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m	Z	m
Z
 ddlmZ ddl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mZ ddl m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z>m?Z?m@Z@ ddlAmB  mCZC ddlmDZDmEZEmFZFmGZGmHZH dddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgœVZIdhdidjdkdldmœZJeJ KeI¡ dndodpdqddrœZLdèdtdu„ZMdvdw„ ZNdédxdy„ZOdzd{„ ZPd|d}„ ZQG d~d„ deƒZRG d€d�„ d�e.ƒZSG d‚dƒ„ dƒe,ƒZTG d„d…„ d…e-ƒZUG d†d‡„ d‡eUƒZVG dˆd‰„ d‰e.ƒZWG dŠd‹„ d‹eRƒZXG dŒd�„ d�eƒZYdŽd�d�d‘dŽd’d“d”œZZG d•d–„ d–eƒZ[G d—d˜„ d˜eRƒZ\G d™dš„ dše.ƒZ]G d›dœ„ dœe]ƒZ^G d�dž„ džeƒZ_dŽdŸd d¡dŽd¢d£d¤d¥dŽd¦dŽd§d¨d©dªd«d¬dŽd­œZ`dŽd®d¯d°d±d²œZad³d´„ Zbdµd¶„ ZcG d·d¸„ d¸e-ƒZdG d¹dº„ dºeRƒZeG d»d¼„ d¼eeƒZfG d½d¾„ d¾eeƒZgG d¿dÀ„ dÀeeƒZhG dÁdÂ„ dÂeeƒZiG dÃdÄ„ dÄeeƒZjG dÅdÆ„ dÆeeƒZkG dÇdÈ„ dÈekƒZlG dÉdÊ„ dÊeeƒZmG dËdÌ„ dÌeeƒZnG dÍdÎ„ dÎeeƒZodÏdÐdÑœZpG dÒdÓ„ dÓe&eqerf ƒZsG dÔdÕ„ dÕeeƒZtegefeoe\ekeheiejemeneteldÖœZueveC weu¡ƒZxd×dØ„ ZyG dÙdÚ„ dÚeRƒZzee;eYdÛdÜ� ee;eYdÛdÝ� ee;eYdÞdÜ� ee;eYdÞdÝ� e9j{e;dßdÛdÜ� e?j{e;dàdÛdÜ� ee<eYdÞdÜ� ee<eYdÞdÝ� ej|j}dêdâdã„ƒZ~ej|j}dëdädå„ƒZG dædç„ dçeƒZ€dS )ìz
DNS: Domain Name System.
é    )Úabsolute_importN)Úget_if_addrÚget_if_addr6)ÚAnsweringMachine)ÚNet)Úconf)ÚorbÚrawÚchbÚbytes_encodeÚ	plain_str)Úlog_runtimeÚwarningÚScapy_Exception)ÚPacketÚbind_layersÚ	NoPayloadÚRaw)ÚBitEnumFieldÚBitFieldÚByteEnumFieldÚ	ByteFieldÚConditionalFieldÚFieldÚFieldLenFieldÚ
FlagsFieldÚIntFieldÚPacketListFieldÚShortEnumFieldÚ
ShortFieldÚStrFieldÚStrLenFieldÚMultipleTypeFieldÚUTCTimeFieldÚI)Úsr1)Ú	inet_ntopÚ	inet_pton)ÚIPÚDestIPFieldÚIPFieldÚUDPÚTCP)ÚIPv6ÚDestIP6FieldÚIP6Field)ÚAnyÚOptionalÚTupleÚTypeÚUnionÚANYÚAZNSZMDZMFZCNAMEÚSOAÚMBZMGZMRZNULLZWKSZPTRZHINFOZMINFOZMXZTXTZRPZAFSDBZX25ZISDNZRTZNSAPzNSAP-PTRZSIGZKEYZPXZGPOSZAAAAZLOCZNXTZEIDZNIMLOCZSRVZATMAZNAPTRZKXZCERTZA6ZDNAMEZSINKÚOPTÚAPLZDSZSSHFPZIPSECKEYZRRSIGZNSECZDNSKEYZDHCIDZNSEC3Z
NSEC3PARAMZTLSAZSMIMEAZHIPZNINFOZRKEYZTALINKZCDSZCDNSKEYZ
OPENPGPKEYZCSYNCZZONEMDZSVCBZHTTPSZSPFZUINFOÚUIDZGIDZUNSPECZNIDZL32ZL64ZLPZEUI48ZEUI64ZTKEYZTSIGÚURIZCAAZAVCZDOAZAMTRELAYZTAZDLVZRESERVED)Vr   é   é   é   é   é   é   é   é   é	   é
   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é   é    é!   é"   é#   é$   é%   é&   é'   é(   é)   é*   é+   é,   é-   é.   é/   é0   é1   é2   é3   é4   é5   é7   é8   é9   é:   é;   é<   é=   é>   é?   é@   éA   éc   éd   ée   éf   ég   éh   éi   éj   ék   él   ém   éù   éú   é   i  i  i  i  é €  é€  éÿÿ  ZIXFRZAXFRZMAILBZMAILAÚALL)éû   éü   éý   éþ   éÿ   ÚINÚCSZCHZHS)r=   r>   r?   r@   r“   Fc                 C   sv  t | ƒ}d}d}g }|r0t|dƒr0|jr0|j}nd}d}	t|ƒ|krZt d|t | ƒ¡ �q>t| | ƒ}
|d7 }|
d@ �r|du rˆ|d }||kr t d|¡ �q>|
d@ d	> t| | ƒ d
 }||v rÐtdƒ �q>|sþ|rö| |d… }	|} t | ƒ}d}ntdƒ‚| 	|¡ q8q8|
dk�r>|| |||
 … d 7 }||
7 }q8�q>q8|du�rL|}|	du �rb| |d… }	|||	t |ƒdkfS )a,  This function decompresses a string s, starting
    from the given pointer.

    :param s: the string to decompress
    :param pointer: first pointer on the string (default: 0)
    :param pkt: (optional) an InheritOriginDNSStrPacket packet

    :returns: (decoded_string, end_index, left_string)
    ó    NÚ_orig_sz&DNS RR prematured end (ofs=%i, len=%i)r=   éÀ   z%DNS incomplete jump token at (ofs=%i)i?ÿÿÿrD   rH   zDNS decompression loop detectedTz.DNS message can't be compressed at this point!r   ó   .)
ÚlenÚhasattrr—   Úabsr   Úinfor   r   r   Úappend)ÚsÚpointerÚpktÚ_fullpacketÚ
max_lengthÚnameZafter_pointerZprocessed_pointersZs_fullZ
bytes_leftÚcur© r¦   úG/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/layers/dns.pyÚdns_get_strG   sZ    
ÿ
ÿ




r¨   c                 C   s<   d| vo:| rt | d ƒdkp:t| ƒdko:t | d ƒd@ dkS )Nr™   éÿÿÿÿr   r>   éþÿÿÿr˜   )r   rš   ©Úxr¦   r¦   r§   Ú_is_ptr•   s    þr­   c                 C   s`   | r| dkrdS |r t | ƒr | S d dd„ dd„ |  d¡D ƒD ƒ¡} | dd… dkr\| d7 } | S )	zµEncodes 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                 s   s   | ]}t t|ƒƒ| V  qd S ©N)r
   rš   )Ú.0Úyr¦   r¦   r§   Ú	<genexpr>«   r–   zdns_encode.<locals>.<genexpr>c                 s   s   | ]}|d d… V  qd S )Nrz   r¦   )r°   Úkr¦   r¦   r§   r²   «   r–   r©   N)r­   ÚjoinÚsplit)r¬   Úcheck_builtr¦   r¦   r§   Ú
dns_encodeœ   s    $r·   c                  O   s"   t  dt¡ t| i |¤Ždd… S )zLegacy function. Deprecatedz1DNSgetstr is deprecated. Use dns_get_str instead.Nr©   )ÚwarningsÚwarnÚDeprecationWarningr¨   )ÚargsÚkwargsr¦   r¦   r§   Ú	DNSgetstr±   s
    þr½   c              
   C   sø  t | vrtdƒ‚|  ¡ } |  t ¡}| ¡  t|ƒ}dd„ }dd„ }i }||ƒD ]Â\}}}||ƒD ]®}	t|	dd�}
|	|vrÆ| |
¡}|d? d	B }|d
|d	   }t|ƒt|ƒ }||||d fg||	< q`||	  	||f¡ ||	 d d }|d|… ||d…  
|
dd¡ } qNq`qN|D ]ª}|| }| d¡d }|D ]ˆ}|d  |d ¡}| |¡�sZJ ‚t|dt|ƒ … dd�dd… }|| }|d  |d |¡ z|d `W n t�y¸   Y n0 �q4�qt| t ƒ�sô|  t ¡j�rô|  t ¡j ¡  | | S |S )zJThis function compresses a DNS packet according to compression rules.
    zCan only compress DNS layersc                 s   sŒ   | j | j| j| jfD ]r}|du r"q|}t|tƒst|tƒr~|jD ]<}t|tƒsbt|t	ƒr@|j
dv r@| |j¡}||j|fV  q@|j}q&qdS )z7Iterates through all DNS strings that can be compressedN)r>   r?   r@   rA   rH   rK   )ÚqdÚanÚnsÚarÚ
isinstancer   ÚInheritOriginDNSStrPacketÚfields_descÚDNSStrFieldr"   ÚtypeÚgetfieldvalr¤   Úpayload)Údns_pktZlayÚcurrentÚfieldÚdatr¦   r¦   r§   Ú	field_genÄ   s    



ÿþzdns_compress.<locals>.field_genc                 s   s2   | V  t d|  d¡ƒD ]}|  d|¡| V  qdS )z?Iterates through all possible compression parts in a DNS stringr=   r™   N)ÚrangeÚcountrµ   )rÌ   r¬   r¦   r¦   r§   Úpossible_shortensÕ   s    z'dns_compress.<locals>.possible_shortensT©r¶   rD   r˜   rŠ   r=   r   r?   Ns     r>   r©   )ÚDNSr   ÚcopyÚgetlayerÚclear_cacher	   r·   Úindexr
   rž   ÚreplaceÚpoprÇ   Úendswithrš   ZsetfieldvalÚrdlenÚAttributeErrorrÂ   Ú
underlayerZremove_payload)r¡   rÉ   Z	build_pktrÍ   rÐ   ÚdatarÊ   r¤   rÌ   ÚpartÚencodedrÖ   Zfb_indexZsb_indexr    Z_inZckZreplacementsZreplace_pointerÚrepÚvalZkept_stringÚnew_valr¦   r¦   r§   Údns_compressº   sV    

ý"rã   c                   @   s$   e Zd Zejddg Zddd„ZdS )rÃ   r—   Ú_orig_pNc                 O   s,   || _ || _tj| g|¢R d|i|¤Ž d S )NÚ_pkt)r—   rä   r   Ú__init__)Úselfrå   r—   rä   r»   r¼   r¦   r¦   r§   ræ     s    z"InheritOriginDNSStrPacket.__init__)NNN)Ú__name__Ú
__module__Ú__qualname__r   Ú	__slots__ræ   r¦   r¦   r¦   r§   rÃ     s   rÃ   c                       s>   e Zd ZdZdgZdd„ Zdd„ Zdd„ Z‡ fd	d
„Z‡  Z	S )rÅ   zž
    Special StrField that handles DNS encoding/decoding.
    It will also handle DNS decompression.
    (may be StrLenField if a length_from is passed),
    Ú
compressedc                 C   s,   |sdS |dd … dkr(t |ƒs(|d S |S )Nr™   r©   )r­   ©rç   r¡   r¬   r¦   r¦   r§   Úh2i!  s
    zDNSStrField.h2ic                 C   s   t |dd�S )NTrÑ   )r·   rí   r¦   r¦   r§   Úi2m(  s    zDNSStrField.i2mc                 C   s   t |  ||¡ƒS r¯   ©rš   rï   rí   r¦   r¦   r§   Úi2len+  s    zDNSStrField.i2lenc                    sB   d}| j r tt| ƒ ||¡\}}t|d|ƒ\}}}| _|| |fS )Nr–   r   )Úlength_fromÚsuperrÅ   Úgetfieldr¨   rì   )rç   r¡   rŸ   ZremainÚdecodedÚ_Úleft©Ú	__class__r¦   r§   rô   .  s
    zDNSStrField.getfield)
rè   ré   rê   Ú__doc__rë   rî   rï   rñ   rô   Ú__classcell__r¦   r¦   rø   r§   rÅ     s   rÅ   c                   @   s2   e Zd ZdgZdd„ Zdd„ Zdd„ Zdd	„ Zd
S )ÚDNSRRCountFieldÚrrc                 C   s   t  | ||¡ || _d S r¯   )r   ræ   rý   )rç   r¤   Údefaultrý   r¦   r¦   r§   ræ   ;  s    zDNSRRCountField.__init__c                 C   s:   t || jƒ}d}t|ttfƒs&t|ƒr6|j}|d7 }q|S )Nr   r=   )Úgetattrrý   rÂ   ÚDNSRRÚDNSQRÚ
isdnssecRRrÈ   )rç   r¡   r¬   Úir¦   r¦   r§   Ú_countRR?  s    
zDNSRRCountField._countRRc                 C   s   |d u r|   |¡}|S r¯   ©r  rí   r¦   r¦   r§   rï   G  s    
zDNSRRCountField.i2mc                 C   s   |d u r|   |¡}|S r¯   r  rí   r¦   r¦   r§   Úi2hL  s    
zDNSRRCountField.i2hN)rè   ré   rê   rë   ræ   r  rï   r  r¦   r¦   r¦   r§   rü   8  s
   rü   c                   @   s:   e Zd Zg d¢ZdZddd„Zdd„ Zdd„ Zd	d
„ ZdS )Ú
DNSRRField)ÚcountfldÚpassonrý   r=   c                 C   s*   t  | |d ¡ || _| | _| _|| _d S r¯   )r    ræ   r  rý   rþ   r	  )rç   r¤   r  rþ   r	  r¦   r¦   r§   ræ   V  s    zDNSRRField.__init__c                 C   s   |d u rdS t |ƒS )Nr–   )r   rí   r¦   r¦   r§   rï   _  s    zDNSRRField.i2mc                 C   sÆ   |||d … }t  d|¡\}}}}|d7 }t |t¡}|d| |||| …  ||d�}	|	j ¡ D ]J}
|	j|
 }|
dkr–t|tƒr–| 	|	|	j
¡d }t|tƒrd|jrd|	` q°qd||	_||7 }|	|fS )NrF   z!HHIHr®   ©r—   rä   Úrdatar   )ÚstructÚunpackÚDNSRR_DISPATCHERÚgetr   Z	fieldtypeÚkeysrÂ   r"   Z_find_fld_pkt_valrÆ   rÅ   rì   rÚ   Úrrname)rç   r¤   rŸ   ÚpÚretÚtypÚclsrö   rÚ   rý   ÚfnameZ	rdata_objr¦   r¦   r§   ÚdecodeRRd  s    "
zDNSRRField.decodeRRc           	      C   sÀ   t |tƒr|\}}nd}d }t|| jƒ}|t|ƒkrLt d| j|¡ |dfS |rš|d8 }t||dd�\}}}}|  |||¡\}}|d u rŽ|}qL| 	|¡ qL| j
r¬||f|fS ||d … |fS d S )Nr   zDNS wrong value: DNS.%s=%ir–   r=   T)r¢   )rÂ   Útuplerÿ   r  rš   r   r�   r¨   r  Zadd_payloadr	  )	rç   r¡   rŸ   r  r  Úcr¤   rö   rý   r¦   r¦   r§   rô   y  s$    

zDNSRRField.getfieldN)r=   )	rè   ré   rê   rë   Zholds_packetsræ   rï   r  rô   r¦   r¦   r¦   r§   r  R  s   
	r  c                   @   s   e Zd Zdd„ ZdS )Ú
DNSQRFieldc                 C   s8   |||d … }|d7 }t d| ||d�}||_||fS )Nr@   r®   r
  )r  Úqname)rç   r¤   rŸ   r  r  rý   r¦   r¦   r§   r  ’  s
    zDNSQRField.decodeRRN)rè   ré   rê   r  r¦   r¦   r¦   r§   r  ‘  s   r  c                   @   s4   e Zd ZdZdZdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚDNSTextFieldz=
    Special StrLenField that handles DNS TEXT data (16)
    r=   c                 C   s`   t ƒ }|}|r\t|d ƒd }|t|ƒkr<t d|t|ƒ¡ | |d|… ¡ ||d … }q
|S )Nr   r=   zKDNS RR TXT prematured end of character-string (size=%i, remaining bytes=%i))Úlistr   rš   r   r�   rž   )rç   r¡   rŸ   Úret_sZtmp_sÚtmp_lenr¦   r¦   r§   Úm2i¡  s    þzDNSTextField.m2ic                 C   s   t |ttfƒr|gS |S r¯   )rÂ   ÚstrÚbytesrí   r¦   r¦   r§   Úany2i±  s    zDNSTextField.any2ic                 C   s   t |  ||¡ƒS r¯   rð   rí   r¦   r¦   r§   rñ   ¶  s    zDNSTextField.i2lenc                 C   sh   d}|D ]Z}t |ƒ}t|ƒdkrB|d|d d…  7 }|dd … }qt|ƒr|t dt|ƒ¡| 7 }q|S )Nr–   r“   ó   ÿú!B)r   rš   r  Úpack)rç   r¡   rŸ   r  Útextr¦   r¦   r§   rï   ¹  s    zDNSTextField.i2mN)	rè   ré   rê   rú   Zislistr   r#  rñ   rï   r¦   r¦   r¦   r§   r  š  s   r  c                   @   s4   e Zd ZdZdZeddƒeddeƒeddeƒgZ	dS )	r  zDNS Question Recordr   r  zwww.example.comÚqtyper=   ZqclassN)
rè   ré   rê   r¤   Úshow_indentrÅ   r   Ú	dnsqtypesÚ
dnsclassesrÄ   r¦   r¦   r¦   r§   r  È  s   

þr  c                   @   s(  e Zd Zd Zeed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de
ƒ ƒed!d dƒed#d"dƒed%d$ddƒgZd&d'„ Zd(d)„ Zd*d+„ Zd,d-„ Zd.d/„ ZdS )0rÒ   ÚlengthNc                 C   s   t | jtƒS r¯   )rÂ   rÜ   r,   ©r  r¦   r¦   r§   Ú<lambda>Ô  r–   zDNS.<lambda>Úidr   Úqrr=   Úopcoder@   ZQUERYZIQUERYZSTATUS)r   r=   r>   ZaaZtcÚrdÚraÚzÚadÚcdÚrcodeÚokzformat-errorzserver-failurez
name-errorznot-implementedZrefused)r   r=   r>   r?   r@   rA   Úqdcountr¾   Úancountr¿   ZnscountrÀ   ZarcountrÁ   c                 C   s*   t |tƒo(| j|jko(| jdko(|jdkS )Nr=   r   )rÂ   rÒ   r/  r0  )rç   Úotherr¦   r¦   r§   Úanswersí  s    

ÿþýzDNS.answersc                 C   sd   d}| j r2d}| jdkrXt| jtƒrXd| jj }n&d}| jdkrXt| jtƒrXd| jj	 }d||f S )NÚ ZAnsr   z "%s"ZQryz	DNS %s%s )
r0  r:  rÂ   r¿   r   r  r9  r¾   r  r  )rç   r¤   rÆ   r¦   r¦   r§   Ú	mysummaryó  s    zDNS.mysummaryc                 C   s>   t | jtƒr6| jd u r6t dt|ƒd ¡|dd …  }|| S )Nú!Hr>   )rÂ   rÜ   r,   r,  r  r&  rš   )rç   r¡   Úpayr¦   r¦   r§   Ú
post_buildÿ  s     zDNS.post_buildc                 C   s   t | ƒS )z8Return the compressed DNS packet (using `dns_compress()`)rã   )rç   r¦   r¦   r§   Úcompress  s    zDNS.compressc                 C   sv   t | jtƒrrt|ƒdkr2t d|dd… ¡d }nd}t |¡ t|ƒ‚|dk s\t|ƒ|k rrd}t |¡ t|ƒ‚|S )zH
        Check that a valid DNS over TCP message can be decoded
        r>   r?  Nr   z!Malformed DNS message: too small!rJ   z&Malformed DNS message: invalid length!)	rÂ   rÜ   r,   rš   r  r  r   r�   r   )rç   rŸ   Zdns_lenÚmessager¦   r¦   r§   Úpre_dissect  s    

zDNS.pre_dissect)rè   ré   rê   r¤   r   r   r   r   rü   r  r  r  rÄ   r<  r>  rA  rB  rD  r¦   r¦   r¦   r§   rÒ   Ð  s@   
ÿ







þ





èrÒ   ÚReservedZLLQZULZNSIDZPINGzedns-client-subnet)r   r=   r>   r?   r@   rA   rD   c                   @   sR   e Zd ZdZeddeƒeddddd�edd	d
d„ d�gZdd„ Z	e
ddd„ƒZdS )ÚEDNS0TLVzDNS EDNS0 TLVÚoptcoder   ÚoptlenNZoptdataÚH©Úfmtr=  c                 C   s   | j S r¯   )rH  ©r¡   r¦   r¦   r§   r.  *  r–   zEDNS0TLV.<lambda>©rò   c                 C   s   d|fS )Nr=  r¦   )rç   r  r¦   r¦   r§   Úextract_padding,  s    zEDNS0TLV.extract_paddingc                 O   sD   |d u rt S t|ƒdk rtS t d|d d… ¡d }|dkr@tS t S )Nr>   r?  r   rD   )rF  rš   r   r  r  ÚEDNS0ClientSubnet)r  rå   r»   ÚkargsZ	edns0typer¦   r¦   r§   Údispatch_hook0  s    zEDNS0TLV.dispatch_hook)N)rè   ré   rê   r¤   r   Ú
edns0typesr   r!   rÄ   rN  ÚclassmethodrQ  r¦   r¦   r¦   r§   rF  %  s   
ÿþrF  c                   @   sn   e Zd ZdZeddƒeddeƒeddƒedd	ƒed
d	ƒe	dddddiƒe
ddddd�edg edd„ d�gZdS )ÚDNSRROPTzDNS OPT Resource Recordr  r=  rÆ   re   Úrclassi   Zextrcoder   Úversionr4  r‹   rL   ZD0rÚ   Nr  rI  ©Ú	length_ofrK  c                 C   s   | j S r¯   ©rÚ   rL  r¦   r¦   r§   r.  I  r–   zDNSRROPT.<lambda>rM  )rè   ré   rê   r¤   rÅ   r   Údnstypesr   r   r   r   r   rF  rÄ   r¦   r¦   r¦   r§   rT  =  s   
ÿ÷rT  c                   @   sB   e Zd ZejZdZdZdd„ Zdd„ Z	dd„ Z
d	d
„ Zdd„ ZdS )ÚClientSubnetv4r\   ó   Àc                 C   sF   t  |  |¡d¡}t|t  | jd¡ƒ}||d … |  ||d |… ¡fS ©NrD   )ÚoperatorÚfloordivrò   ÚminÚ	af_lengthr   )rç   r¡   rŸ   Úszr¦   r¦   r§   rô   S  s    zClientSubnetv4.getfieldc                 C   sJ   | j |  |¡ }|r(|dt |d¡ 7 }|d t | j d¡… }t| j|ƒS )Nr®   rD   )ra  rò   r^  r_  r&   Ú
af_familly)rç   r¡   r¬   Úpaddingr¦   r¦   r§   r   Y  s
    zClientSubnetv4.m2ic                 C   s^   t | jt|ƒƒ}ttt | jd¡ƒƒd d d… D ] }t|| ƒdkr0|d7 } qRq0|d |… S )NrD   r©   r   r=   )	r'   rc  r   r  rÎ   r^  r_  ra  r   )rç   ZsubnetZpacked_subnetr  r¦   r¦   r§   Ú_pack_subneta  s    $zClientSubnetv4._pack_subnetc              	   C   sN   |d u r| j S z|  |¡W S  ttjfyH   d|_tddƒ |¡ Y S 0 d S )Nr>   r=  )Ú
af_defaultre  ÚOSErrorÚsocketÚerrorÚfamilyÚClientSubnetv6rí   r¦   r¦   r§   rï   j  s    zClientSubnetv4.i2mc              	   C   sT   |d u rdS zt |  |¡ƒW S  ttjfyN   d|_t tddƒ |¡ƒ Y S 0 d S )Nr=   r>   r=  )rš   re  rg  rh  ri  rj  rk  rí   r¦   r¦   r§   rñ   t  s    zClientSubnetv4.i2lenN)rè   ré   rê   rh  ÚAF_INETrc  ra  rf  rô   r   re  rï   rñ   r¦   r¦   r¦   r§   r[  N  s   	
r[  c                   @   s   e Zd ZejZdZdZdS )rk  é€   ó    N)rè   ré   rê   rh  ÚAF_INET6rc  ra  rf  r¦   r¦   r¦   r§   rk    s   rk  c                   @   sœ   e Zd ZdZeddeƒedddddd	„ d
�eddƒedddddd	„ d�eddƒe	e
dddd	„ d�dd	„ fedddd	„ d�dd	„ fge
dddd	„ d�ƒgZdS )rO  zDNS EDNS0 Client SubnetrG  rD   rH  NÚaddressrI  c                 C   s   |d S )Nr@   r¦   ©r¡   r¬   r¦   r¦   r§   r.  ‰  r–   zEDNS0ClientSubnet.<lambda>)rK  Úadjustrj  r=   Úsource_plenÚBc                 C   s   |d S r]  r¦   rq  r¦   r¦   r§   r.  Ž  r–   )rX  rK  rr  Z
scope_plenr   z192.168.0.0c                 C   s   | j S r¯   ©rs  r-  r¦   r¦   r§   r.  ’  r–   rM  c                 C   s
   | j dkS ©Nr=   ©rj  rL  r¦   r¦   r§   r.  “  r–   z
2001:db8::c                 C   s   | j S r¯   ru  r-  r¦   r¦   r§   r.  •  r–   c                 C   s
   | j dkS )Nr>   rw  rL  r¦   r¦   r§   r.  –  r–   c                 C   s   | j S r¯   ru  r-  r¦   r¦   r§   r.  ˜  r–   )rè   ré   rê   r¤   r   rR  r   r   r   r"   r[  rk  rÄ   r¦   r¦   r¦   r§   rO  …  s:   

ÿýÿþÿþýÿù÷rO  z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-384zReserved for Indirect Keysz Private algorithms - domain namezPrivate algorithms - OID)r   r=   r>   r?   r@   rA   rB   rC   rD   rE   rF   rG   rH   rI   rJ   r�   r‘   r’   r“   zSHA-1zSHA-256zGOST R 34.11-94zSHA-384)r   r=   r>   r?   r@   c           	      C   sà   g }| rÜt | ƒdk r(t dt | ƒ¡ dS t| d ƒ}d| }t| d ƒ}|dksX|dkrht d|¡ dS | dd| … }tt |ƒƒD ]D}d	}td
ƒD ]2}t|| ƒ|@ r¾|||d
  | g7 }|d? }q”q„| d| d… } q|S )z`
    Decode the 'Type Bit Maps' field of the NSEC Resource Record into an
    integer list.
    r>   zbitmap too short (%i)Nr   rŠ   r=   r\   zbitmap length is no valid (%i)rm  rD   )rš   r   r�   r   rÎ   )	ÚbitmapZRRlistZwindow_blockÚoffsetZ
bitmap_lenZ
tmp_bitmapÚbÚvr  r¦   r¦   r§   Úbitmap2RRlist«  s(    r|  c                    s
  ddl }d}dd„ tt| ƒƒD ƒ} t| | d d ¡ƒ}t| | d d ¡ƒ}||kr^|d7 }t||d ƒD ]˜‰t‡fd	d
„| D ƒƒ‰ ˆ sŒqlˆ d dkržd}n&ˆ d dˆ  }t| |d ¡ƒd }|dkrÐd}|t dˆ|¡7 }|d 	‡ ‡fdd
„t|ƒD ƒ¡7 }ql|S )zy
    Encode a list of integers representing Resource Records to a bitmap field
    used in the NSEC Resource Record.
    r   Nr–   c                 S   s   g | ]}|d krt |ƒ‘qS )r�   )rœ   ©r°   r¬   r¦   r¦   r§   Ú
<listcomp>Ý  r–   z!RRlist2bitmap.<locals>.<listcomp>r©   g      p@r=   c                 3   s6   | ].}d ˆ  |  kr&d ˆ d  k rn q|V  qdS )rŠ   r=   Nr¦   r}  )Úwbr¦   r§   r²   è  r–   z RRlist2bitmap.<locals>.<genexpr>rŠ   rD   r\   ÚBBc                 3   s.   | ]&‰ t  d t‡ ‡fdd„ˆD ƒƒ¡V  qdS )ó   Bc                 3   s^   | ]V}d ˆ dˆ   |  kr6d ˆ dˆ   d k rn qdd|d ˆ   ˆ d   V  qdS )rŠ   rD   r>   rC   Nr¦   r}  )Útmpr  r¦   r§   r²   ÿ  s   4ÿz*RRlist2bitmap.<locals>.<genexpr>.<genexpr>N)r  r&  Úsum)r°   ©Úrrlistr  )r‚  r§   r²   ü  s
   üþ)
ÚmathÚsortedÚsetÚintÚceilÚfloorrÎ   r  r&  r´   )Úlstr†  rx  Zmax_window_blocksZmin_window_blocksZbytes_countÚmaxr¦   r„  r§   ÚRRlist2bitmapÓ  s,    ûrŽ  c                   @   s   e Zd Zdd„ Zdd„ ZdS )ÚRRlistFieldc                 C   s   t |tƒrt|ƒS |S r¯   )rÂ   r  rŽ  rí   r¦   r¦   r§   rî     s    
zRRlistField.h2ic                 C   s.   |   ||¡}t|ƒ}|r&dd„ |D ƒS t|ƒS )Nc                 S   s   g | ]}t  ||¡‘qS r¦   )rZ  r  )r°   rý   r¦   r¦   r§   r~    r–   z&RRlistField.i2repr.<locals>.<listcomp>)r  r|  Úrepr)rç   r¡   r¬   r…  r¦   r¦   r§   Úi2repr  s    zRRlistField.i2reprN)rè   ré   rê   rî   r‘  r¦   r¦   r¦   r§   r�    s   r�  c                   @   s   e Zd ZdZdd„ ZdS )Ú_DNSRRdummyz=Dummy class that implements post_build() for Resource Recordsc                 C   sz   | j d ur|| S t| jd  d|  d¡¡ƒ}t|ƒ| d }|d |d … }t d|¡||d d d …  }|| | S )Nr   r=  r  rF   rD   r?  r>   )rÚ   rš   rÄ   rï   rÇ   r  r&  )rç   r¡   r@  Zlrrnamer  Ztmp_pktr¦   r¦   r§   rA    s    
 z_DNSRRdummy.post_buildN)rè   ré   rê   r¤   rA  r¦   r¦   r¦   r§   r’    s   r’  c                	   @   sP   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ƒgZ
dS )ÚDNSRRMXzDNS MX Resource Recordr  r=  rÆ   rB   rU  r=   Úttlr   rÚ   NZ
preferenceZexchange©rè   ré   rê   r¤   rÅ   r   rZ  r+  r   r   rÄ   r¦   r¦   r¦   r§   r“  "  s   

úr“  c                   @   sx   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=  rÆ   rB   rU  r=   r”  r   rÚ   NZmnameÚrnameÚserialÚrefreshÚretryZexpireÚminimumr•  r¦   r¦   r¦   r§   r–  .  s   

õr–  c                   @   sŒ   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ƒ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=  rÆ   rj   rU  r=   r”  r   rÚ   NZtypecoveredÚ	algorithmrA   ÚlabelsZoriginalttlZ
expirationZ	inceptionÚkeytagZsignersnameÚ	signature)rè   ré   rê   r¤   rÅ   r   rZ  r+  r   r   r   Údnssecalgotypesr   r#   r    rÄ   r¦   r¦   r¦   r§   rœ  ?  s    



órœ  c                	   @   sP   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ƒgZdS )Ú	DNSRRNSECzDNS NSEC Resource Recordr  r=  rÆ   rk   rU  r=   r”  r   rÚ   NZnextnameÚtypebitmaps)rè   ré   rê   r¤   rÅ   r   rZ  r+  r   r   r�  rÄ   r¦   r¦   r¦   r§   r¢  R  s   

úr¢  c                   @   sf   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ƒeddƒeddeƒeddƒg	ZdS )ÚDNSRRDNSKEYzDNS DNSKEY Resource Recordr  r=  rÆ   rl   rU  r=   r”  r   rÚ   NÚflagsrŠ   rL   zS???????Z???????Úprotocolr?   r�  rA   Z	publickey)rè   ré   rê   r¤   rÅ   r   rZ  r+  r   r   r   r   r   r¡  r    rÄ   r¦   r¦   r¦   r§   r¤  ^  s   


ör¤  c                   @   sd   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ƒe
ddeƒeddƒg	ZdS )ÚDNSRRDSzDNS DS Resource Recordr  r=  rÆ   rg   rU  r=   r”  r   rÚ   NrŸ  r�  rA   Z
digesttypeÚdigest)rè   ré   rê   r¤   rÅ   r   rZ  r+  r   r   r   r¡  Údnssecdigesttypesr    rÄ   r¦   r¦   r¦   r§   r§  n  s   



ør§  c                   @   s   e Zd ZdZdd„ ZdS )ÚDNSRRDLVzDNS DLV Resource Recordc                 O   s.   t j| g|¢R i |¤Ž | dd¡s*d| _d S )NrÆ   r   rŒ   )r§  ræ   r  rÆ   )rç   r»   rP  r¦   r¦   r§   ræ   €  s    zDNSRRDLV.__init__N)rè   ré   rê   r¤   ræ   r¦   r¦   r¦   r§   rª  }  s   rª  c                   @   s¤   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	dddiƒe	dd	ƒedd	ddd�edddd„ d�edd	ddd�edddd„ d�eddƒgZdS )Ú
DNSRRNSEC3zDNS NSEC3 Resource Recordr  r=  rÆ   rn   rU  r=   r”  r   rÚ   NÚhashalgr¥  rD   zOpt-OutÚ
iterationsÚ
saltlengthr%  Úsalt©rK  rX  c                 C   s   | j S r¯   ©r®  r«   r¦   r¦   r§   r.  “  r–   zDNSRRNSEC3.<lambda>rM  Ú
hashlengthZnexthashedownernamec                 C   s   | j S r¯   )r²  r«   r¦   r¦   r§   r.  •  r–   r£  )rè   ré   rê   r¤   rÅ   r   rZ  r+  r   r   r   r   r   r!   r�  rÄ   r¦   r¦   r¦   r§   r«  ˆ  s   

ôr«  c                   @   sv   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d�edddd„ d�g
ZdS )ÚDNSRRNSEC3PARAMzDNS NSEC3PARAM Resource Recordr  r=  rÆ   ro   rU  r=   r”  r   rÚ   Nr¬  r¥  r­  r®  r%  r¯  r°  c                 C   s   | j S r¯   r±  rL  r¦   r¦   r§   r.  ¥  r–   zDNSRRNSEC3PARAM.<lambda>rM  )rè   ré   rê   r¤   rÅ   r   rZ  r+  r   r   r   r   r!   rÄ   r¦   r¦   r¦   r§   r³  š  s   

÷r³  c                   @   s`   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ƒg	Z
dS )ÚDNSRRSRVzDNS SRV Resource Recordr  r=  rÆ   r]   rU  r=   r”  r   rÚ   NÚpriorityÚweightÚportÚtargetr•  r¦   r¦   r¦   r§   r´  «  s   

ør´  rL   rP   )zHMAC-MD5.SIG-ALG.REG.INTú	hmac-sha1c                   @   s4   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ ZdS )ÚTimeSignedFieldc                 C   s   t j| ||dd� d S )NZ6srJ  )r   ræ   )rç   r¤   rþ   r¦   r¦   r§   ræ   ¾  s    zTimeSignedField.__init__c                 C   s8   t  d|dd… ¡d }|t  d|dd… ¡d 7 }|S )z#Unpack the internal representation.r?  Nr>   r   z!I)r  r  )rç   Úpacked_secondsÚsecondsr¦   r¦   r§   Ú_convert_secondsÁ  s    z TimeSignedField._convert_secondsc                 C   s.   |du rd}|d? d@ }|d@ }t  d||¡S )zYConvert the number of seconds since 1-Jan-70 UTC to the packed
           representation.Nr   r\   r�   l   ÿÿ z!HI)r  r&  )rç   r¡   r¼  Z	tmp_shortZtmp_intr¦   r¦   r§   rï   Ç  s
    zTimeSignedField.i2mc                 C   s   |du rdS |   |¡S )z[Convert the internal representation to the number of seconds
           since 1-Jan-70 UTC.N)r½  )rç   r¡   r»  r¦   r¦   r§   r   Ó  s    zTimeSignedField.m2ic                 C   s   t  |¡}t  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)rç   r¡   r»  Ztime_structr¦   r¦   r§   r‘  Ü  s    
zTimeSignedField.i2reprN)rè   ré   rê   ræ   r½  rï   r   r‘  r¦   r¦   r¦   r§   rº  ½  s
   	rº  c                   @   s¤   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d�edddd„ d�e	dd	ƒe	dd	ƒedd	ddd�edddd„ d�gZdS )Ú	DNSRRTSIGzDNS TSIG Resource Recordr  r=  rÆ   r‰   rU  r=   r”  r   rÚ   NZ	algo_namer¹  Ztime_signedZfudgeÚmac_lenrP   r?  Zmac_datar°  c                 C   s   | j S r¯   )rÂ  rL  r¦   r¦   r§   r.  î  r–   zDNSRRTSIG.<lambda>rM  Zoriginal_idri  Ú	other_lenZ
other_datac                 C   s   | j S r¯   )rÃ  rL  r¦   r¦   r§   r.  ò  r–   )rè   ré   rê   r¤   rÅ   r   rZ  r+  r   r   rº  r   r!   rÄ   r¦   r¦   r¦   r§   rÁ  ã  s    

órÁ  )rB   rK   r]   re   rg   rj   rk   rl   rn   ro   r‰   rŒ   c                 C   s
   t | tƒS r¯   )rÂ   ÚDNSSEC_CLASSES)Úobjr¦   r¦   r§   r    s    r  c                   @   s°   e Zd ZdZdZeddƒeddeƒeddeƒe	ddƒe
d	d
ddd�eeddƒdd„ feddƒdd„ fedddd„ d�dd„ fedg dd„ d�dd„ fgedddd„ d�ƒgZd
S )r   zDNS Resource Recordr   r  r=  rÆ   r=   rU  r”  rÚ   Nr  rI  rW  z0.0.0.0c                 C   s
   | j dkS rv  ©rÆ   rL  r¦   r¦   r§   r.    r–   zDNSRR.<lambda>z::c                 C   s
   | j dkS )NrX   rÆ  rL  r¦   r¦   r§   r.    r–   c                 C   s   | j S r¯   rY  rL  r¦   r¦   r§   r.    r–   rM  c                 C   s
   | j dv S )N)r>   r?   r@   rA   rH   rÆ  rL  r¦   r¦   r§   r.    r–   c                 C   s   | j S r¯   rY  rL  r¦   r¦   r§   r.  "  r–   c                 C   s
   | j dkS )NrL   rÆ  rL  r¦   r¦   r§   r.  #  r–   c                 C   s   | j S r¯   rY  rL  r¦   r¦   r§   r.  &  r–   )rè   ré   rê   r¤   r)  rÅ   r   rZ  r+  r   r   r"   r*   r/   r  r!   rÄ   r¦   r¦   r¦   r§   r     s<   

ÿÿÿþÿþôÿïûr   ié  )Údport)Úsportrq   z224.0.0.251zff02::fbrF   c                 C   sx   ||  d¡d d… }tt| d�tƒ  tdt|dd�gt|d||d	�gd
� ddd�}|rp| t¡rp| t¡j	S dS dS )zÞSend 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
Ú.r=   N©ÚdstrA   r7   ©r  r(  r6   )r  rÆ   r”  r  ©r1  r¾   rÀ   r   ©ÚverboseÚtimeoutr©   ©
Úfindr%   r(   r+   rÒ   r  r   ÚhaslayerrÔ   r7  )Ú
nameserverr¤   r  rÆ   r”  ÚzoneÚrr¦   r¦   r§   Ú
dyndns_add4  s    ÿþür×  c                 C   sz   ||  d¡d d… }tt| d�tƒ  tdt|dd�gt||dd	d
d�gd� d	dd�}|rr| t¡rr| t¡j	S dS dS )z¹Send 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É  r=   NrÊ  rA   r7   rÌ  r5   r   r=  )r  rÆ   rU  r”  r  rÍ  rÎ  r©   rÑ  )rÔ  r¤   rÆ   r”  rÕ  rÖ  r¦   r¦   r§   Ú
dyndns_delH  s    ÿþürØ  c                   @   s2   e Zd ZdZdZeZd
dd„Zdd„ Zdd	„ Z	dS )ÚDNS_amZ	dns_spoofzudp port 53Nc                 C   sB   |du ri | _ n|| _ || _|| _t|tƒr8t|ƒ| _n|| _dS )aÇ  
        :param joker: default IPv4 for unresolved domains. (Default: None)
                      Set to False to disable, None to mirror the interface's IP.
        :param joker6: default IPv6 for unresolved domains (Default: False)
                       set to False to disable, None to mirror the interface's IPv6.
        :param match: a dictionary of {names: (ip, ipv6)}
        :param from_ip: an source IP to filter. Can contain a netmask
        N)ÚmatchÚjokerÚjoker6rÂ   r!  r   Úfrom_ip)rç   rÛ  rÚ  rÜ  rÝ  r¦   r¦   r§   Úparse_optionsa  s    

zDNS_am.parse_optionsc                 C   sX   ddl m} | | j¡oV| | j¡jdkoV| j pV||v rH|| j|v n|t j| jv S )Nr   )r-   )	Úscapy.layers.inet6r-   rÓ  r  rÔ   r0  rÝ  Úsrcr(   )rç   Úreqr-   r¦   r¦   r§   Ú
is_requestv  s    ÿþýzDNS_am.is_requestc                 C   s:  t |v rt nt}||| jd�t|j|jd� }| | j¡}|jj	dkrÀ| j
du rVd S | j |jj| jpzt| j dtj¡ƒ¡}t|ttfƒr”|d }|| j|jd|jt|jjd|dd�d	� }nv| jdu rÎd S | j |jj| jpòt| j dtj¡ƒ¡}t|ttfƒ�r|d
 }|| j|jd|jt|jjd|d�d	� }|S )NrÊ  )rÈ  rÇ  rX   FÚifacer=   rF   )r  r”  r  rÆ   )r/  r0  r¾   r¿   r   )r  r”  r  )r-   r(   rà  r+   rÇ  rÈ  rÔ   r  r¾   r(  rÜ  rÚ  r  r  rÛ  r   Zoptsniffr   rã  rÂ   r  r  r/  r   r   )rç   rá  ZIPclsÚrespZdnsr  r¦   r¦   r§   Ú
make_reply€  s:     
þÿÿ

þÿzDNS_am.make_reply)NNNN)
rè   ré   rê   Zfunction_nameÚfilterrÒ   r  rÞ  râ  rå  r¦   r¦   r¦   r§   rÙ  \  s     ÿ

rÙ  )r   NF)F)r6   rF   )rŽ   rF   )�rú   Ú
__future__r   r^  rh  r  r¾  r¸   Z
scapy.archr   r   Zscapy.ansmachiner   Zscapy.base_classesr   Zscapy.configr   Zscapy.compatr   r	   r
   r   r   Zscapy.errorr   r   r   Zscapy.packetr   r   r   r   Zscapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r    r!   r"   r#   r$   Zscapy.sendrecvr%   Zscapy.pton_ntopr&   r'   Zscapy.layers.inetr(   r)   r*   r+   r,   rß  r-   r.   r/   Zscapy.libs.sixZlibsÚsixr0   r1   r2   r3   r4   rZ  r*  Úupdater+  r¨   r­   r·   r½   rã   rÃ   rÅ   rü   r  r  r  r  rÒ   rR  rF  rT  r[  rk  rO  r¡  r©  r|  rŽ  r�  r’  r“  r–  rœ  r¢  r¤  r§  rª  r«  r³  r´  Ztsig_algo_sizesr‰  r"  rº  rÁ  r  r  Ú
itervaluesrÄ  r  r   Z	bind_addrÚcommandsÚregisterr×  rØ  rÙ  r¦   r¦   r¦   r§   Ú<module>   sì   L




ð

N
	V	?	.Q
ÿ1ú	(4ÿ&ô