
    x@                     N   S r SSKJr  SSKrSSKrSSKrSSKrSSKrSSK	rSSK
rSSKrSSKrSSKJr   " S S\R                  R                   5      r " S S	\R                  R                   5      rSrS
rSrSrSrSrSrSrSrSrSrSrSrSr \\\\\\\\\\\\\\ S.r!\!RE                  5        V Vs0 s H  u  pX_M	     snn r#S r$S r%S r&S3S jr'S3S jr(S r)S r*S r+S  r,S! r-S" r.S# r/S$ r0S% r1S& r2S' r3S4S( jr4S4S) jr5S* r6  SS+K7J8r8J9r9J:r:J;r;J<r<  SS,K=J>r?Jr@  SS-KAJBrBJCrC  SS.KDJErE  \5rK\4rLS/rM SSKNrNSSKOrNSSKPrNSSKQrNS/rR " S0 S1\S5      rTgs  snn f ! \F a'    SS+KGJ8r8J9r9J:r:J;r;J<r<  SS,KHJ>r?Jr@  SS-KIJBrBJCrC  SS.KJJErE   NWf = f! \F a    S2rR gf = f! \F a    \6rK\6rLS2rMS2rR gf = f)5z.Common DNSSEC-related functions and constants.    )BytesION   )string_typesc                       \ rS rSrSrSrg)UnsupportedAlgorithm"   z&The DNSSEC algorithm is not supported. N__name__
__module____qualname____firstlineno____doc____static_attributes__r	       lib/third_party/dns/dnssec.pyr   r   "   s    0r   r   c                       \ rS rSrSrSrg)ValidationFailure&   z The DNSSEC signature is invalid.r	   Nr
   r	   r   r   r   r   &   s    *r   r                        
                  )RSAMD5DHDSAECCRSASHA1DSANSEC3SHA1RSASHA1NSEC3SHA1	RSASHA256	RSASHA512INDIRECTECDSAP256SHA256ECDSAP384SHA384
PRIVATEDNS
PRIVATEOIDc                 h    [         R                  U R                  5       5      nUc  [        U 5      nU$ )zAConvert text into a DNSSEC algorithm value.

Returns an ``int``.
)_algorithm_by_textgetupperint)textvalues     r   algorithm_from_textr8   _   s-     ""4::<0E}D	Lr   c                 L    [         R                  U 5      nUc  [        U 5      nU$ )z=Convert a DNSSEC algorithm value to text

Returns a ``str``.
)_algorithm_by_valuer3   str)r7   r6   s     r   algorithm_to_textr<   k   s'     ""5)D|5zKr   c                 T    [        5       nU R                  X!S9  UR                  5       $ )N)origin)r   to_wiregetvalue)recordr>   ss      r   	_to_rdatarC   w   s#    	A
NN1N$::<r   c                 R   [        X5      n[        U5      nU R                  [        :X  a  US   S-  US   -   $ Sn[	        [        U5      S-  5       H  nX2SU-     S-  USU-  S-      -   -  nM     [        U5      S-  S:w  a  X2[        U5      S-
     S-  -  nX3S-	  S-  -  nUS-  $ )	zReturn the key id (a 16-bit number) for the specified key.

Note the *origin* parameter of this function is historical and
is not needed.

Returns an ``int`` between 0 and 65535.
r   r   r   r      i  )rC   	bytearray	algorithmr#   rangelen)keyr>   rdatatotalis        r   key_idrP   }   s     c"EeE
}}b	Q%)++s5zQ'AAEla'a!eai ! !E ( u:>Q3u:>*a//EB;&()v~r   c           	         UR                  5       S:X  a  Sn[        R                  " 5       nO:UR                  5       S:X  a  Sn[        R                  " 5       nO[	        SU-  5      e[        U [        5      (       a  [        R                  R                  X5      n UR                  U R                  5       R                  5       5        UR                  [        X5      5        UR                  5       n[        R                   " S[#        U5      UR$                  U5      U-   n[        R&                  R)                  [        R*                  R,                  [        R.                  R0                  US[3        U5      5      $ )a  Create a DS record for a DNSSEC key.

*name* is the owner name of the DS record.

*key* is a ``dns.rdtypes.ANY.DNSKEY``.

*algorithm* is a string describing which hash algorithm to use.  The
currently supported hashes are "SHA1" and "SHA256".  Case does not
matter for these strings.

*origin* is a ``dns.name.Name`` and will be used as the origin
if *key* is a relative name.

Returns a ``dns.rdtypes.ANY.DS``.
SHA1r   SHA256r   zunsupported algorithm "%s"z!HBBr   )r4   rR   newrS   r   
isinstancer   dnsname	from_textupdatecanonicalizer?   rC   digeststructpackrP   rI   rM   	from_wire
rdataclassIN	rdatatypeDSrK   )rW   rL   rI   r>   dsalghashr[   dsrdatas           r   make_dsrf      s	   " F"xxz		h	&zz|"#?)#KLL$%%xx!!$/KK!!#++-.KK	#&'[[]Fkk&&+s}}eDvMG99s~~00#--2B2BGQ"7|- -r   c                    / nU R                  UR                  5      nUc  g [        U[        R                  R
                  5      (       aD   UR                  [        R                  R                  [        R                  R                  5      nOUnU HK  nUR                  UR                  :X  d  M  [        U5      UR                  :X  d  M:  UR                  U5        MM     U$ ! [         a     g f = fN)r3   signerrU   rV   nodeNodefind_rdatasetr_   r`   ra   DNSKEYKeyErrorrI   rP   key_tagappend)keysrrsigcandidate_keysr7   rdatasetrM   s         r   _find_candidate_keysru      s    NHHU\\"E}%''	**3>>+<+<+.==+?+?AH
 ??eoo-u.!!%(    		s   AC$ $
C10C1c                 >    U [         [        [        [        [        4;   $ rh   )r#   r'   r)   r*   r+   rI   s    r   _is_rsarx      s     )9"$ $ $r   c                      U [         [        4;   $ rh   )r%   r(   rw   s    r   _is_dsarz      s    l+++r   c                 :    [         =(       a    U [        [        4;   $ rh   )_have_ecdsar-   r.   rw   s    r   	_is_ecdsar}      s    LI/?)KKLr   c                     U [         :H  $ rh   )r#   rw   s    r   _is_md5r      s    r   c                 4    U [         [        [        [        4;   $ rh   )r%   r'   r(   r)   rw   s    r   _is_sha1r      s    g%'79 9 9r   c                      U [         [        4;   $ rh   )r*   r-   rw   s    r   
_is_sha256r      s    O444r   c                     U [         :H  $ rh   )r.   rw   s    r   
_is_sha384r      s    ''r   c                     U [         :H  $ rh   )r+   rw   s    r   
_is_sha512r      s    	!!r   c                    [        U 5      (       a  [        R                  " 5       $ [        U 5      (       a  [        R                  " 5       $ [        U 5      (       a  [        R                  " 5       $ [        U 5      (       a  [        R                  " 5       $ [        U 5      (       a  [        R                  " 5       $ [        SU -  5      e)Nzunknown hash for algorithm %u)r   MD5rT   r   rR   r   rS   r   SHA384r   SHA512r   rw   s    r   
_make_hashr      s    ywwy	xxz)zz|)zz|)zz|
;iG
HHr   c                    [        U 5      (       a  / SQnOM[        U 5      (       a  / SQnO8[        U 5      (       a  / SQnO#[        U 5      (       a  / SQnO[	        SU -  5      e[        U5      n[        U 5      R                  nS/SU-   U-   /-   SUS-   /-   S	U/-   U-   S
S/-   SU/-   n[        R                  " S[        U5      -  /UQ76 $ )N)*      H   r      r   r   r   )+   r   r   r      )	`   r   r   r   e   r   r   r   r   )	r   r   r   r   r   r   r   r   r   unknown algorithm %u0   r   r   r   r   r   z!%dB)
r   r   r   r   r   rK   r   digest_sizer\   r]   )rI   oidolendlenidbytess        r   _make_algorithm_idr      s    y>	)		,	I		D	I		D 6 BCCs8Di ,,DfD4((TAX"&.034Tl"D\*G ;;vG,7w77r   c           	      R   [        U[        5      (       a8  [        R                  R	                  U[        R                  R
                  5      n[        X!5      nUc  [        S5      eU GH  n[        U [        5      (       a  U S   nU S   nOU R                  nU nUc  [        R                  " 5       nUR                  U:  a  [        S5      eUR                  U:  a  [        S5      e[        UR                  5      n	[        UR                  5      (       a  UR                  n
[         R"                  " SU
SS 5      u  nU
SS n
US:X  a!  [         R"                  " SU
SS	 5      u  nU
S	S n
U
SU nXS n [$        R&                  " [(        R*                  " U5      [(        R*                  " U5      45      nUR.                  nGO[1        UR                  5      (       a  UR                  n
[         R"                  " SU
SS 5      u  nU
SS n
SUS-  -   nU
SS nU
SS n
U
SU nU
US n
U
SU nU
US n
U
SU n[2        R&                  " [(        R*                  " U5      [(        R*                  " U5      [(        R*                  " U5      [(        R*                  " U5      45      nUR.                  SS nGO[5        UR                  5      (       Ga  UR                  n
UR                  [6        :X  a  [8        R:                  R<                  nSnO0UR                  [>        :X  a  [8        R:                  R@                  nSn[(        R*                  " U
SW 5      n[(        R*                  " U
UUS	-   5      n[8        R8                  RC                  WRD                  UU5      (       d  [        S5      e[8        RF                  RI                  URJ                  UUURL                  5      n[8        RN                  RP                  RS                  UU5      n[U        UU5      nUR.                  SU nUR.                  US n[8        R8                  RW                  [(        R*                  " U5      [(        R*                  " U5      5      nO[        SUR                  -  5      eU	RY                  [[        X5      SS 5        U	RY                  UR\                  R_                  U5      5        UR`                  [c        U5      S-
  :  aA  URe                  UR`                  S-   5      S   n[        R                  R	                  SU5      nUR_                  U5      n[         Rf                  " SURh                  URj                  URl                  5      n [o        U5      n!U! Hx  n"U	RY                  U5        U	RY                  U 5        U"R_                  U5      n#[         Rf                  " S[c        U#5      5      n$U	RY                  U$5        U	RY                  U#5        Mz      [        UR                  5      (       a(  [p        Rr                  " U5      n%U%Ru                  X5        O[1        UR                  5      (       a)  [v        Rr                  " US5      n%U%Ru                  X5        O`[5        UR                  5      (       a.  U	Ry                  5       n&URu                  U&U5      (       d  [,        eO[        SUR                  -  5      e  g   [        S5      e! [,         a    [        S
5      ef = f! [,         a     GM  f = f)a  Validate an RRset against a single signature rdata

The owner name of *rrsig* is assumed to be the same as the owner name
of *rrset*.

*rrset* is the RRset to validate.  It can be a ``dns.rrset.RRset`` or
a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple.

*rrsig* is a ``dns.rdata.Rdata``, the signature to validate.

*keys* is the key dictionary, used to find the DNSKEY associated with
a given name.  The dictionary is keyed by a ``dns.name.Name``, and has
``dns.node.Node`` or ``dns.rdataset.Rdataset`` values.

*origin* is a ``dns.name.Name``, the origin to use for relative names.

*now* is an ``int``, the time to use when validating the signatures,
in seconds since the UNIX epoch.  The default is the current time.
Nzunknown keyr   r   expiredznot yet validz!Bz!Hr   zinvalid public key@   r          r   zinvalid ECDSA keyr      *z!HHIz
fips-186-3zverify failure)=rU   r   rV   rW   rX   rootru   r   tupletime
expiration	inceptionr   rI   rx   rL   r\   unpack	CryptoRSA	constructnumberbytes_to_long
ValueError	signaturerz   	CryptoDSAr}   r-   ecdsacurvesNIST256pr.   NIST384ppoint_is_valid	generatorellipticcurvePointcurveorderrq   VerifyingKeyfrom_public_pointECKeyWrapper	SignaturerY   rC   ri   to_digestablelabelsrK   splitr]   rdtyperdclassoriginal_ttlsortedpkcs1_15rT   verifyDSSr[   )'rrsetrr   rq   r>   nowrs   candidate_keyrrnamert   rd   keyptrbytes_rsa_ersa_npubkeysigtoctetsdsa_qdsa_pdsa_gdsa_yr   key_lenxypointverifying_keyrrB   suffix	rrnamebufrrfixedrrlistrrrrdatarrlenverifierr[   s'                                          r   _validate_rrsigr     s   * &,''##FCHHMM:)$6N..' eU##1XFQxHZZFH;))+Cc!#I..??S #O44%//*5??##"&&FdF1QK8IVABZF{"MM$q<	1V$E7OE>",,))%0))%023
 //CU__%%"&&F==va{3DQABZF!a%ZF1RLEBC[F1V$EFG_F1V$EFG_F1V$E((%%e,%%e,%%e,%%e,./F
 //!"%Cu'' #&&F/1--O3--$$VAg%67A$$VGGaK%@AA;;--eooq!DD'(;<<''--ekk1aME!JJ33EEeFKMM!-9F)A)A++''(<(<Q(?(.(<(<Q(?AC $$:U__$LMMIe,Sb12ELL..v67<<#f+/)\\%,,"23A6FXX''V4F((0	++fhoox7G7G#002!BKK	"KK %%f-FKKc&k2EKKKK 	u''#<</*))776<8*5??++}}VS11$$ 2 ((>(PQQk (t ,
--u  >'(<==>l  		s    6A [>
C%\>\
\&%\&c                    [        U[        5      (       a8  [        R                  R	                  U[        R                  R
                  5      n[        U [        5      (       a  U S   nOU R                  n[        U[        5      (       a  US   nUS   nOUR                  nUnUR                  U5      nUR                  U5      nXV:w  a  [        S5      eU H  n [        XX#U5          g   [        S5      e! [         a     M-  f = f)a  Validate an RRset.

*rrset* is the RRset to validate.  It can be a ``dns.rrset.RRset`` or
a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple.

*rrsigset* is the signature RRset to be validated.  It can be a
``dns.rrset.RRset`` or a ``(dns.name.Name, dns.rdataset.Rdataset)`` tuple.

*keys* is the key dictionary, used to find the DNSKEY associated with
a given name.  The dictionary is keyed by a ``dns.name.Name``, and has
``dns.node.Node`` or ``dns.rdataset.Rdataset`` values.

*origin* is a ``dns.name.Name``, the origin to use for relative names.

*now* is an ``int``, the time to use when validating the signatures,
in seconds since the UNIX epoch.  The default is the current time.
r   r   zowner names do not matchNzno RRSIGs validated)
rU   r   rV   rW   rX   r   r   choose_relativityr   r   )	r   rrsigsetrq   r>   r   r   	rrsignamerrsigrdatasetrr   s	            r   	_validater     s    & &,''##FCHHMM:%q(E""QK	 MM	 %%f-F++F3I :;;	E$<  1
22 ! 		s   C77
DDc                      [        S5      e)Nz5DNSSEC validation requires pycryptodome/pycryptodomex)NotImplementedError)argskwargss     r   _need_pycryptor     s    
U
VVr   )r   rR   rS   r   r   )RSAr%   )r   r   )r   Tc                        \ rS rSrS rS rSrg)r   i  c                     Xl         X l        g rh   rL   r   )selfrL   r   s      r   __init__ECKeyWrapper.__init__  s    &r   c                 x    [         R                  " U5      nU R                  R                  R	                  X25      $ rh   )r   r   rL   r   verifies)r   r[   r   diglongs       r   r   ECKeyWrapper.verify  s+     ..v6xx//==r   r   N)r   r   r   r   r   r   r   r	   r   r   r   r     s    '>r   r   Frh   )NN)Ur   ior   r\   r   dns.exceptionrV   dns.namedns.nodedns.rdataset	dns.rdatadns.rdatatypedns.rdataclass_compatr   	exceptionDNSExceptionr   r   r#   r$   r%   r&   r'   r(   r)   r*   r+   r-   r.   r,   r/   r0   r2   itemsr:   r8   r<   rC   rP   rf   ru   rx   rz   r}   r   r   r   r   r   r   r   r   r   r   Crypto.Hashr   rR   rS   r   r   Crypto.PublicKeyr   r   r   Crypto.Signaturer   r   Crypto.Utilr   ImportErrorCryptodome.HashCryptodome.PublicKeyCryptodome.SignatureCryptodome.Utilvalidatevalidate_rrsig_have_pycryptor   ecdsa.ecdsaecdsa.ellipticcurve
ecdsa.keysr|   objectr   )r   r   s   00r   <module>r     s  $ 5           !13==55 1+22 +
 

 		

 
 (&& * );(@(@(BC(Bqt(BC 		0"-J($,M9
5("I8&V.r-3`W(>
+AAG2& H$NN>" 	>6 	>G DT  +EEK6*	+(    H#NNK	sB   1E$E 1F *F?F FF FFF$#F$