U v`a@sdZddlmZddlmZddlZddlZddlmZddlm Z dZ dZ dZ dZ dZd Zd Zd Zd Zd ZdZdZdZdZdZdZdZdZdZd Zd ZdZdZ dZ!dZ"dZ#dZ$dZ%d Z&dZ'dZ(dZ)dZ*dZ+d Z,dZ-dZ.dZ/dZ0dZ1d Z2dZ3d d!Z4d"d#Z5Gd$d%d%ej6Z7d&d'Z8d(d)Z9Gd*d+d+Z:e:e;d,d-d.d/Ze:e=d2d3Z?dd4d5Z@d6d7ZAd8d9ZBd:d;ZCdd?ZEd@dAZFdBdCZGdDdEZHdFdGZIdHdIZJdJdKZKe:ejLdLdMZMe:ejLdNdOZNe:ejLdPdQZOe:ejLdRdSZPdTdUZQdVdWZRdXdYZSdZd[ZTd\d]ZUd^d_ZVd`daZWdbdcZXdddeZYdfdgZZdhdiZ[djdkZ\dldmZ]dndoZ^dpdqZ_e:ej`drdsZadtduZbdvdwZcdxdyZddzd{Zed|d}Zfe:ejLd~dZgdS)zDomain Name System.)print_function)absolute_importN)dpkt) compat_ord @iii !)c Cst|d}|r|d}ng}|dd}t|D]\}}d||d}||}|st|dkr|t|}|dkr|||<t|}|t d||7}q6|t dd|B7}qq6|S)Nutf-8.riB>H) codecsencodesplitappend enumeratejoinuppergetlenstructpack) nameoff label_ptrslabelsbufilabelkeyptrr5`/private/var/folders/0j/yyfkg7712236ncpm167bvylc27vst9/T/pip-unpacked-wheel-y9gppv54/dpkt/dns.py pack_nameCs&      r7cCsg}d}|}d}|t|kr$tt||}|dkrD|d7}qq|d@dkrtd|||ddd@}||krtd|d7}|s|}|}}q|d@dkr|d7}|||||||d7}|dkrtd ||7}qtd |q|s|}t d |d |fS) Nrrr ri?z!Invalid label compression pointerrzname longer than 255 byteszInvalid label length %02xrr) r)rZNeedDatarr*unpack UnpackErrorr$r!decoder&)r0r-r,Z saved_offZ start_offZ name_lengthnr4r5r5r6 unpack_name[s:          r=c@sheZdZdZdddefddgfddgfddgfddgffZed d Zejd d Zed d Z e jdd Z eddZ e jddZ eddZ e jddZ eddZ e jddZ eddZ e jddZ eddZejddZeddZejd dZGd!d"d"ejZGd#d$d$eZd%d&Zd'd(Zd)d*Zd+d,Zd-d.Zd/d0Zd1d2Zd3S)4DNSzDomain Name System. TODO: Longer class information.... Attributes: __hdr__: Header fields of DNS. TODO. )idHropr@qdannsarcCst|jt@tkSN)intrADNS_QRselfr5r5r6qrszDNS.qrcCs(|r|jtO_n|jtM_dSrF)rArHrJvr5r5r6rKscCs|jd?d@S)N rrArIr5r5r6opcodesz DNS.opcodecCs|jd@|d@d>B|_dS)NirrNrOrLr5r5r6rPscCst|jt@tkSrF)rGrADNS_AArIr5r5r6aaszDNS.aacCs(|r|jtO_n|jtM_dSrF)rArQrLr5r5r6rRscCst|jt@tkSrF)rGrADNS_TCrIr5r5r6tcszDNS.tccCs(|r|jtO_n|jtM_dSrF)rArSrLr5r5r6rTscCst|jt@tkSrF)rGrADNS_RDrIr5r5r6rdszDNS.rdcCs(|r|jtO_n|jtM_dSrF)rArUrLr5r5r6rVscCst|jt@tkSrF)rGrADNS_RArIr5r5r6raszDNS.racCs(|r|jtO_n|jtM_dSrF)rArWrLr5r5r6rXscCst|jt@tkSrF)rGrADNS_ZrIr5r5r6zeroszDNS.zerocCs(|r|jtO_n|jtM_dSrF)rArYrLr5r5r6rZscCs |jd@S)NrrOrIr5r5r6rcodesz DNS.rcodecCs|jd@|d@B|_dS)NirrOrLr5r5r6r[sc@s:eZdZdZdddefddeffZddZeZdd Z d S) zDNS.Qz DNS question.r,Z1025srtyper@clscCstdSrFNotImplementedErrorrIr5r5r6__len__sz DNS.Q.__len__cCstdSrFr_)rJr0r5r5r6r9sz DNS.Q.unpackN) __name__ __module__ __qualname____doc__DNS_ADNS_IN__hdr__ra__str__r9r5r5r5r6Qsrjc@s<eZdZdZdddefddefdddfZd d Zd d Zd S)zDNS.RRzDNS resource record.r\r]r@r^)ttlIr)rlenr@r)rdatasrc Cs|jr |jS|jtkr|jS|jtkr4t|j||S|jtkrLt|j||S|jt krdt|j ||S|jt krg}| t|j ||| t|j|t|d|| td|j|j|j|j|jd|S|jtkrtd|jt|j|d|S|jtks|jtkr.ddd|jDS|jtkr@|jS|jt krttd|j!|j"|j#t|j$|d |S|jt%krdSt&'d |jdS) Nr>IIIIIrr rcss"|]}tdt||VqdS)rN)r*r+r)).0xr5r5r6 sz$DNS.RR.pack_rdata..>HHHrRR type %s is not supported)(rnr]rfipDNS_NSr7nsname DNS_CNAMEcnameDNS_PTRptrnameDNS_SOAr$mnamernamer)r*r+serialrefreshretryexpireminimumr&DNS_MX preferencemxnameDNS_TXT DNS_HINFOtextDNS_AAAAip6DNS_SRVpriorityweightportsrvnameDNS_OPTr PackError)rJr-r.Zl_r5r5r6 pack_rdatasF            zDNS.RR.pack_rdatacCs |jtkr|j|_n|jtkr4t||\|_}n|jtkrRt||\|_}n|jt krpt||\|_ }n|jt krt||\|_ }t||\|_ }td|||d\|_|_|_|_|_n>|jtkrtd|jdd|_t||d\|_}n|jtks|jtkrrg|_|j}|rt|d}|jt|dd|d|d|d}q*n|jtkr|j|_ n|jt!krt"|jd|_#nb|jt$krtd |jdd \|_%|_&|_'t||d \|_(}n|jt)krnt*+d |jdS) Nrpr rrrrhexrtrru),r]rfrnrvrwr=rxryrzr{r|r}r~rr*r9rrrrrrrrrrrrr$r!r;rrDNS_NULLr"nullrrrrrrrr:)rJr0r-r<r5r5r6 unpack_rdata!sB             " zDNS.RR.unpack_rdataN) rbrcrdrerfrgrhrrr5r5r5r6RRs "rcCs*|t|jt||jtd|j|jS)z*Append packed DNS question and return buf.>HH)r7r,r)r.r*r+r]r^)rJr0qr5r5r6pack_qEsz DNS.pack_qcCsH|}t||\|_}td|||d\|_|_|d7}||fS)z#Return DNS question and new offset.rr)rjr=r,r*r9r]r^)rJr0r-rr5r5r6unpack_qIs  z DNS.unpack_qc CsZt|jt||j}|t|t|d|j}||td|j|j|j t||S)z$Append packed DNS RR and return buf.r>HHIH) r7r,r)r.rr*r+r]r^rk)rJr0rrr,rnr5r5r6pack_rrQsz DNS.pack_rrcCsz|}t||\|_}td|||d\|_|_|_}|d7}|||||_||_ | ||||7}||fS)zReturn DNS RR and new offset.rr) rr=r,r*r9r]r^rkrnrmr)rJr0r-rZrdlenr5r5r6 unpack_rrWs& z DNS.unpack_rrcCstj|||j}|j}g|_t|D] }|||\}}|j|q(dD]J}t||d}t ||gt|D]$}| ||\}}t|||qrqNd|_ dS)NrCrDrErr) rPacketr9Z __hdr_len__rBrangerr$getattrsetattrrdata)rJr0r-Zcnt_rrrrr5r5r6r9cs    z DNS.unpackcCs tt|SrF)r)bytesrIr5r5r6rassz DNS.__len__c Csi|_t|j|j|jt|jt|jt|j t|j }|jD]}| ||}q@dD] }t ||D]}| ||}qdqV|`|S)Nr)r.r*r+Z __hdr_fmt__r?rAr)rBrCrDrErrr)rJr0rrrrr5r5r6 __bytes__ws z DNS.__bytes__N)rbrcrdrerUrhpropertyrKsetterrPrRrTrVrXrZr[rrrjrrrrrr9rarr5r5r5r6r>}sb                  Q r>cs&ddlmGfdddt}|S)z Reference test data is stored in the dynamically defined class. It is created in this way so that we can import unhexlify only during testing, and not during normal use. r unhexlifycsdeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d S) z!define_testdata..TestDataZn059c8180000100010000000106676f6f676c6503636f6d0000010001c00c000100010000012b0004d83ace2e0000290200000000000000Zn7f228180000100010000000005676d61696c03636f6d00001c0001c00c001c00010000012b00102a001450400908020000000000002005Zra154818000010001000000000377777705676d61696c03636f6d0000010001c00c000500010000545f000e046d61696c06676f6f676c65c016Z8000001000000000100000000046e616d650000150001000000000000Zr053b8180000100010000000006676f6f676c6503636f6d00000f0001c00c000f0001000002570011001e04616c7432056173706d78016cc00cZz12b0840000010001000000000b626c6168626c6168363636067069726174650373656100000a0001c00c000a00010000000000095641434b4403c5e901Zf8d6e0110000100000000000104783131310678787878313106616b616d6169036e657400000100010000290fa0000080000000AJ67028180000100010003000001310131033231310331343107696e2d61646472046172706100000c0001c00c000c000100000d3600240764656661756c740a762d756d63652d69667305756d6e657405756d6963680365647500c00e0002000100000d36000d0673686162627903696673c04fc00e0002000100000d36000f0c666973682d6c6963656e7365c06dc00e0002000100000d36000b04646e733203697464c04fZ851f8180000100010000000006676f6f676c6503636f6d0000060001c00c00060001000000230026036e7332c00c09646e732d61646d696ec00c0a7474470000038400000384000007080000003cZ7f2281800001000100000000075f6a6162626572045f746370066a616262657203636f6d0000210001c00c0021000100000e0f001a000a000014950764656e6a616232066a616262657203636f6d00Zp10328180000100010000000006676f6f676c6503636f6d0000100001c00c001000010000010e00100f763d7370663120707472203f616c6cN)rbrcrda_resp aaaa_resp cname_resp invalid_rrmx_resp null_respopt_respptr_respsoa_respsrv_resptxt_respr5rr5r6TestDatasBr)binasciirobject)rr5rr6define_testdatas 2rcCsLtj}t|}|jdjdks$t|jdjdks8tt||ksHtdS)Nr google.com)rrr>rBr,AssertionErrorrCrr0my_dnsr5r5r6 test_basics rc@seZdZdddZddZdS)TryExceptExceptioncCs||_||_dSrF)exception_typemsg)rJrrr5r5r6__init__szTryExceptException.__init__csfdd}|S)Nc sTz Wn<jk rF}zjr6t|jks6tW5d}~XYn XtddS)N*There should have been an Exception raised)rrstrr Exception)argskwargsefrJr5r6wrappers  $z,TryExceptException.__call__..wrapperr5)rJrrrrr5rr6__call__szTryExceptException.__call__N)r)rbrcrdrrr5r5r5r6rs rr)rc CsFttdd}z |Wn&tk r@}z|W5d}~XYnXdS)z[Check that we can catch a function which does not throw an exception when it is supposed tocSsdSrFr5r5r5r5r6funsz$test_TryExceptException..funN)rr`r)rrr5r5r6test_TryExceptExceptions   rcCst}t|dSz,Test in place for when the method is writtenN)r>rjr)rr5r5r6 test_Q_lensrcCst}|ddSr)r>rjr9rr5r5r6 test_Q_unpacksrcCsf|dkrdddg}tj}t|}t||D]4\}}t||||j|ksNtt|||ks,tq,dS)NFT)rrr>ziprrArr)propopsZset_tor0ZdnsrAr5r5r6property_runners  rcCstddddgddS)NrKi送rrr5r5r5r6test_qrsrcCstddddgddS)NrPrirrr5r5r5r6 test_opcode srcCstddddgddS)NrRrirrr5r5r5r6test_aasrcCstddddgddS)NrTrirrr5r5r5r6test_tcsrcCstddddgddS)NrVirrrr5r5r5r6test_rdsrcCstddddgddS)NrXirrrr5r5r5r6test_rasrcCstddddgddS)NrZrirrr5r5r5r6 test_zerosrcCstddddgddS)Nr[rirrr5r5r5r6 test_rcode"srcCsxtj}t|}|jdjdkr`|jdjdkr`|jdjdkr`|jdj dkr`|jdjdksdt |t |kstt dS) Nrz1.1.211.141.in-addr.arpa"default.v-umce-ifs.umnet.umich.eduzshabby.ifs.umich.eduri6 rzdns2.itd.umich.edu) rrr>rBr,rCr|rDrxrkrrrr5r5r6test_PTR&srcCstj}t|}|jd}|jtks(t|jdkr<|jdks@tt ||ksPtd|_tt |}|jd}|jdkr|jdkstdS)Nrrsr) rrr>rEr]rrrmrnr)r0rmy_rrZmy_dns2Zmy_rr2r5r5r6test_OPT1s   rcCstddi}|dkstdS)Nrr)r7r)rrr5r5r6test_pack_name?s rcCstdddS)zEIf the offset is longer than the buffer, there will be an UnpackError rN)r=r5r5r5r6test_unpack_nameEsrcCs tddS)Nsz0Қ_7+"?r>r5r5r5r6test_random_dataKsrcCs tddS)Nsexamplecomrr5r5r5r6test_circular_pointersPsrcCs tddS)Nsabcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789rr5r5r5r6test_very_long_nameUsrcCsLtj}t|}|jdjdkr0|jdjdks4tt|t|ksHtdS)Nrzblahblah666.pirate.seas5641434b4403c5e901) rrr>rBr,rCrrrrr5r5r6test_null_responseZs rcCsntj}t|}|jd}|jtks(t|jdks6t|jdgksFtt |t |ksZtt ||ksjtdS)Nrrzv=spf1 ptr ?all) rrr>rCr]rrr,rrr)r0rrr5r5r6test_txt_responsebs rcCs2tjtddgd}|di}d}||ks.tdSNsv=spf1 ptr ?alls a=something)r]rrsv=spf1 ptr ?all a=something)r>rrrrrpackdatacorrectr5r5r6test_rdata_TXTms rcCs2tjtddgd}|di}d}||ks.tdSr)r>rrrrrr5r5r6test_rdata_HINFOws rcCs0tjdddd}|di}d}||ks,tdS)N zc.akadns.org6?6)r,rkrnr)r>rrrrr5r5r6test_rdata_rdatas rcCs2tjdddtd}|di}d}||ks.tdS)Nrrr)r,rkrvr]r)r>rrfrrrr5r5r6 test_rdata_As rcCs2tjdddtd}|di}d}||ks.tdS)Nrrr)rxrkrvr]rzcakadnsorg)r>rrwrrrr5r5r6 test_rdata_NSs rcCs2tjdddtd}|di}d}||ks.tdS)Nrrr)rzrkrvr]rr)r>rryrrrr5r5r6test_rdata_CNAMEs rcCs2tjdddtd}|di}d}||ks.tdS)Nrir)r|rkrvr]rs$default v-umce-ifsumnetumichedu)r>rr{rrrr5r5r6test_rdata_PTRs rc Cs:tjdddddddtd}|d i}d }||ks6tdS) Nzblah.google.comz moo.blah.comBaiGi3i(#in)r~rrrrrrr]rs0blahgooglecommooblah aBG3n#()r>rr}rrrr5r5r6test_rdata_SOAs rcCs0tjtddd}|di}d}||ks,tdS)NiLmail.google.com)r]rrrsLmailgooglecom)r>rrrrrr5r5r6 test_rdata_MXs rcCs2d}tjt|d}|di}|}||ks.tdS)Ns&@ )r]rr)r>rrrr)rrrrr5r5r6test_rdata_AAAAs r cCs6tjtdddddd}|di}d}||ks2tdS)NiQrr iz_sip._tcp.example.com)r]rkrrrrs_sip_tcpexamplecom)r>rrrrrr5r5r6test_rdata_SRVs r cCs,tjtd}|di}d}||ks(tdS)Nr]rr)r>rrrrrr5r5r6test_rdata_OPTs  r cCst}t|dkstdS)Nr)r>r)r)rr5r5r6 test_dns_lensr cCstjdddidS)Nrr r)r>rrr5r5r5r6test_rdata_FAILsrcCsbtj}t|}|jdkst|jdks,tt|jdks>t|jd}|jdksVt|j t ksdt|j t ksrtt|j dkst|j d}|jdkst|j t kst|j t kst|jdkst|jdkst|jdkst|jd kst|jdkst|jd kst|jd kst|jd ks.t|jd ks>t|jdksNt|jgks^tdS)Nirrrr#izns2.google.com<iiGtt &zdns-admin.google.coms&ns2 dns-admin ttG<)rrr>r?rrAr)rBr,r]r}r^rgrCrkrr~rrrrrmrrnrE)r0Zsoarar5r5r6test_soa s2  rcCstj}t|}|jdkst|jdks,tt|jdks>t|jd}|jdksVt|j t ksdt|j t ksrtt|j dkst|j d}|j t kst|j t kst|jdkst|jdkst|jdkst|jdkst|jd kst|jd kst|jgkstdS) Ni;rrrriWzalt2.aspmx.l.google.com)salt2aspmxl )rrr>r?rrAr)rBr,r]rr^rgrCrkrrrmrnrE)r0Zmxrrr5r5r6test_mx)s(  rcCstj}t|}d|_d|_t|jdks.t|jd}|jt ksFt|j dksTtt|j dksft|j d}|jt ks~t|j t kst|j dkst|jdkst|jdkst|jdkst|jdkst|jgkstdS) N"rrrz gmail.comi+s*P@  r )rrr>r?rAr)rBrr]rr,rCr^rgrkrrmrnrE)r0Zaaaarrr5r5r6 test_aaaaDs$  rcCs tj}t|}d|_d|_t|jdks.t|jd}|jt ksFt|j dksTt|j t ksbtt|j dkstt|j d}|jt kst|j t kst|j dkst|jdkst|jdkst|jdkst|jd kst|jdkst|jd kst|jd ks t|jgkstdS) Nrrrrz_jabber._tcp.jabber.comiizdenjab2.jabber.comrs denjab2jabbercom)rrr>r?rAr)rBrr]rr,r^rgrCrrkrrrrmrnrE)r0Zsrvrrr5r5r6test_srv]s,  rcCstj}t|}d|_d|_t|jdks.t|jd}|jt ksFt|j t ksTt|j dksbtt|j dkstt|j d}|jtkst|j t kst|j dkst|jdkst|jdkst|jdkst|jd kst|jgkstdS) NiTrrrz www.gmail.comi_Trsmailgoogle)rrr>r?rAr)rBrr]rfr^rgr,rCryrkrzrmrnrE)r0rzrrr5r5r6 test_cnamezs&  rcCstj}t|dSrF)rrr>)r0r5r5r6test_invalid_rrsr)N)hre __future__rrr*r!rrcompatrZDNS_QZDNS_RZ DNS_QUERYZ DNS_IQUERYZ DNS_STATUSZ DNS_NOTIFYZ DNS_UPDATEZDNS_CDZDNS_ADrYrWrUrSrQrHZDNS_RCODE_NOERRZDNS_RCODE_FORMERRZDNS_RCODE_SERVFAILZDNS_RCODE_NXDOMAINZDNS_RCODE_NOTIMPZDNS_RCODE_REFUSEDZDNS_RCODE_YXDOMAINZDNS_RCODE_YXRRSETZDNS_RCODE_NXRRSETZDNS_RCODE_NOTAUTHZDNS_RCODE_NOTZONErfrwryr}rr{rrrrrrrgZ DNS_CHAOSZ DNS_HESIODZDNS_ANYr7r=rr>rrrrrr`rrrrrrrrrrrrrrr:rrrrrrrrrrrrrrrr r r r rrrrrrrrr5r5r5r6s    " >