�
��Sc@s:dZddlZddlZddlZddlZddlZddlZddlZddl Zddl
ZddlZddlZdej
jfd��YZdej
jfd��YZdZdZd Zd
ZdZdZd
ZdZdZdZdZdZdZdZied6ed6ed6ed6ed6ed6ed6ed6ed6ed6ed6ed 6ed!6ed"6Ze gej!�D]\Z"Z#e#e"f^q��Z$d#�Z%d$�Z&d%�Z'dd&�Z)dd'�Z*d(�Z+d)�Z,d*�Z-d+�Z.d,�Z/d-�Z0d.�Z1d/�Z2d0�Z3d1�Z4d2�Z5ddd3�Z6ddd4�Z7d5�Z8y:ddl9Z:ddl;Z:ddl<Z:e7Z=e6Z>e?Z@Wn#eAk
r�e8Z=e8Z>eBZ@nXyPddlCZCddlDZCddlEZCddlFZCe?ZGd6eHfd7��YZIWneAk
r5eBZGnXdS(8s.Common DNSSEC-related functions and constants.i����NtUnsupportedAlgorithmcBseZdZRS(s(Raised if an algorithm is not supported.(t__name__t
__module__t__doc__(((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyRstValidationFailurecBseZdZRS(s The DNSSEC signature is invalid.(RRR(((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyR#siiiiiiiii
i
ii�i�i�tRSAMD5tDHtDSAtECCtRSASHA1tDSANSEC3SHA1tRSASHA1NSEC3SHA1t RSASHA256t RSASHA512tINDIRECTtECDSAP256SHA256tECDSAP384SHA384t
PRIVATEDNSt
PRIVATEOIDcCs4tj|j��}|dkr0t|�}n|S(s:Convert text into a DNSSEC algorithm value
@rtype: intN(t_algorithm_by_texttgettuppertNonetint(ttexttvalue((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pytalgorithm_from_textMscCs.tj|�}|dkr*t|�}n|S(s;Convert a DNSSEC algorithm value to text
@rtype: stringN(t_algorithm_by_valueRRtstr(RR((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pytalgorithm_to_textVscCs)tj�}|j|d|�|j�S(Ntorigin(t cStringIOtStringIOtto_wiretgetvalue(trecordRts((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt _to_rdata_scCs�t||�}|jtkr>t|d�d>t|d�Sd}xPtt|�d�D]8}|t|d|�d>t|d|d�7}q[Wt|�ddkr�|t|t|�d�d>7}n||d?d@7}|d@SdS( Ni����ii����iiiii��(R%t algorithmRtordtrangetlen(tkeyRtrdatattotalti((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pytkey_idds 6%cCs(|j�dkr0d}tjjd��}n=|j�dkr`d}tjjd��}n
td|�t|ttf�r�tjj ||�}n|j
|j�j��|j
t
||��|j�}tjdt|�|j|�|}tjjtjjtjj|dt|��S(NtSHA1itSHA256isunsupported algorithm "%s"s!HBBi(RtdnsthashRRt
isinstanceRtunicodetnamet from_texttupdatetcanonicalizeR!R%tdigesttstructtpackR.R&R+t from_wiret
rdataclasstINt rdatatypetDSR)(R5R*R&RtdsalgR2R9tdsrdata((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pytmake_dsqs
%!cCs�g}|j|j�}|dkr(dSt|tjj�rwy"|jtjj tj
j�}Wq}tk
rsdSXn|}xE|D]=}|j
|j
kr�t|�|jkr�|j|�q�q�W|S(N(RtsignerRR3R1tnodetNodet
find_rdatasetR=R>R?tDNSKEYtKeyErrorR&R.tkey_tagtappend(tkeystrrsigtcandidate_keysRtrdatasetR+((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt_find_candidate_keys�s
cCs|tttttfkS(N(RR RRR
(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt_is_rsa�s cCs|ttfkS(N(RR
(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt_is_dsa�scCsto|ttfkS(N(t_have_ecdsaRR(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt _is_ecdsa�scCs
|tkS(N(R(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt_is_md5�scCs|ttttfkS(N(RR R
R(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt_is_sha1�s cCs|ttfkS(N(RR(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt
_is_sha256�scCs
|tkS(N(R(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt
_is_sha384�scCs
|tkS(N(R
(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt
_is_sha512�scCs�t|�rtjjd��St|�r>tjjd��St|�r]tjjd��St|�r|tjjd��St|�r�tjjd��Std|�dS(NtMD5R/R0tSHA384tSHA512sunknown hash for algorithm %u( RUR1R2RRVRWRXRYR(R&((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt
_make_hash�sc Cs7t|�r-ddddddddg}n�t|�rQdd d
ddg}nmt|�r�dddd
dd
ddd
g }n=t|�r�dddd
dd
ddd
g }n
td|�t|�}t|�j}dgd||gd|dgd|g|ddgd|g}djt t
|��S(Ni*i�iHi�i
iii+iiii`iieisunknown algorithm %ui0iiit(RURVRWRYRR)R]tdigest_sizetjointmaptchr(R&toidtolentdlentidbytes((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt_make_algorithm_id�s!$$
Hc*Cszt|ttf�r3tjj|tjj�}nx7t||�D]&}|s[td�nt|t �r�|d}|d}n|j}|}|dkr�tj�}n|j|kr�td�n|j
|kr�td�nt|j�}t|j�r�|j} tjd| dd!�\}
| d} |
dkrctjd| dd!�\}
| d} n| d|
!}| |
}t|�d }
tjjjtjjj|�tjjj|�f�}tjjj|j�f}n�t|j�r(|j} tjd| dd!�\}| d} d
|d }| dd!}| d} | d|!}| |} | d|!}| |} | d|!}tjjjtjjj|�tjjj|�tjjj|�tjjj|�f�}tjd|jd�\}}tjjj|�tjjj|�f}nYt|j�rq|jt krat!j"j#}d
}d
}n3|jt$kr�t!j"j%}d}d}n td�|j} tjjj| d|!�}tjjj| ||d!�}t!j&j'|j(|||j)�}t!j*j+j,||�}t-||�}|j| }|j|} t!j!j.tjjj|�tjjj| ��}ntd|j�|j/t0||�d �|j/|j1j2|��|j3t|�dkr�|j4|j3d�d}!tjjd|!�}n|j2|�}"tj5d|j6|j7|j8�}#t9|�}$xi|$D]a}%|j/|"�|j/|#�|%j2|�}&tj5dt|&��}'|j/|'�|j/|&�qBW|j:�}(t|j�r"t;|j�|(}(|
d t|(�d})t<d�t<d�t<d�|)t<d�|(}(n1t|j�sSt|j�rCntd|j�|j=|(|�rCdSqCWtd�dS(s�Validate an RRset against a single signature rdata
The owner name of the rrsig is assumed to be the same as the owner name
of the rrset.
@param rrset: The RRset to validate
@type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
tuple
@param rrsig: The signature rdata
@type rrsig: dns.rrset.Rdata
@param keys: The key dictionary.
@type keys: a dictionary keyed by dns.name.Name with node or rdataset values
@param origin: The origin to use for relative names
@type origin: dns.name.Name or None
@param now: The time to use when validating the signatures. The default
is the current time.
@type now: int
sunknown keyiitexpireds
not yet valids!Bs!Hiii@is!20s20si i0sunknown ECDSA curvesunknown algorithm %uit*s!HHIii�Nsverify failure(>R3RR4R1R5R6trootRPRttupleRttimet
expirationt inceptionR]R&RQR*R:tunpackR)tCryptot PublicKeytRSAt constructtUtiltnumbert
bytes_to_longt signatureRRRRTRtecdsatcurvestNIST256pRtNIST384pt
ellipticcurvetPointtcurvetorderRLtVerifyingKeytfrom_public_pointtECKeyWrappert SignatureR7R%RDt
to_digestabletlabelstsplitR;trdtypetrdclasstoriginal_ttltsortedR9RgRbtverify(*trrsetRMRLRtnowt
candidate_keytrrnameROR2tkeyptrtbytestrsa_etrsa_ntkeylentpubkeytsigtttoctetstdsa_qtdsa_ptdsa_gtdsa_ytdsa_rtdsa_sR~tkey_lent
digest_lentxtytpointt
verifying_keytrR$tsuffixt rrnamebuftrrfixedtrrlisttrrtrrdatatrrlenR9tpadlen((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt_validate_rrsig�s�
!
5c
Cst|ttf�r3tjj|tjj�}nt|t�rO|d}n |j}t|t�r~|d}|d}n|j}|}|j|�}|j|�}||kr�t d�nxB|D]:}yt
|||||�dSWq�t k
r} q�Xq�Wt d�dS(sdValidate an RRset
@param rrset: The RRset to validate
@type rrset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
tuple
@param rrsigset: The signature RRset
@type rrsigset: dns.rrset.RRset or (dns.name.Name, dns.rdataset.Rdataset)
tuple
@param keys: The key dictionary.
@type keys: a dictionary keyed by dns.name.Name with node or rdataset values
@param origin: The origin to use for relative names
@type origin: dns.name.Name or None
@param now: The time to use when validating the signatures. The default
is the current time.
@type now: int
iisowner names do not matchNsno RRSIGs validated(R3RR4R1R5R6RjRktchoose_relativityRR�(
R�trrsigsetRLRR�R�t rrsignamet
rrsigrdatasetRMte((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt _validateas*
cOs
td�dS(Ns#DNSSEC validation requires pycrypto(tNotImplementedError(targstkwargs((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt_need_pycrypto�sR�cBseZd�Zd�ZRS(cCs||_||_dS(N(R*R�(tselfR*R�((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt__init__�s cCs+tjjj|�}|jjj||�S(N(RpRtRuRvR*R�tverifies(R�R9R�tdiglong((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyR��s(RRR�R�(((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyR��s (JRRR:Rlt
dns.exceptionR1tdns.hashtdns.nametdns.nodetdns.rdatasett dns.rdatat
dns.rdatatypetdns.rdataclasst exceptiontDNSExceptionRRRRRRR R
RRR
RRRRRRtdictt iteritemsR�R�RRRR%RR.RCRPRQRRRTRURVRWRXRYR]RgR�R�R�tCrypto.PublicKey.RSARptCrypto.PublicKey.DSAtCrypto.Util.numbertvalidatetvalidate_rrsigtTruet_have_pycryptotImportErrortFalseRxtecdsa.ecdsatecdsa.ellipticcurvet
ecdsa.keysRStobjectR�(((s0/usr/lib64/python2.7/site-packages/dns/dnssec.pyt<module>s�
1
�.
|