o
    2cL                     @   s  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
ZddlZddlZddlZG dd dejjZG dd dejjZG dd dejjZd	d
 Zdd Zdd ZG dd dejjZdCddZdd Zdd Zdd Zdd Zdd Zdd Zdd  Z d!d" Z!d#d$ Z"d%d& Z#d'd( Z$d)d* Z%d+d, Z&dDd-d.Z'dDd/d0Z(G d1d2 d2ejjZ)d3d4 Z*d5d6 Z+z>dd7l,m-Z- dd8l.m/Z/ dd9l0m1Z1 dd:l2m3Z3 dd;l2m4Z4 dd<l2m5Z5 dd=l2m6Z6 dd>l2m7Z7 dd?l2m8Z8 dd@l2m9Z9 W n e:y	   e+Z;e+Z<dAZ=Y nw e(Z;e'Z<dBZ=ej>Z>ej?Z?ej@Z@ejAZAejBZBejCZCejDZDejEZEejFZFejGZGejHZHejIZIejJZJejKZKejLZLejMZMejNZNdS )Ez.Common DNSSEC-related functions and constants.    Nc                   @      e Zd ZdZdS )UnsupportedAlgorithmz&The DNSSEC algorithm is not supported.N__name__
__module____qualname____doc__ r	   r	   @/var/www/html/gps/gps/lib/python3.10/site-packages/dns/dnssec.pyr   #       r   c                   @   r   )ValidationFailurez The DNSSEC signature is invalid.Nr   r	   r	   r	   r
   r   '   r   r   c                   @   s\   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZedd ZdS )	Algorithm                        
                           c                 C      dS N   r	   clsr	   r	   r
   _maximum>      zAlgorithm._maximumN)r   r   r   RSAMD5DHDSAECCRSASHA1DSANSEC3SHA1RSASHA1NSEC3SHA1	RSASHA256	RSASHA512ECCGOSTECDSAP256SHA256ECDSAP384SHA384ED25519ED448INDIRECT
PRIVATEDNS
PRIVATEOIDclassmethodr$   r	   r	   r	   r
   r   +   s(    r   c                 C   
   t | S )zConvert text into a DNSSEC algorithm value.

    *text*, a ``str``, the text to convert to into an algorithm value.

    Returns an ``int``.
    )r   	from_text)textr	   r	   r
   algorithm_from_textC      
r;   c                 C   r8   )zConvert a DNSSEC algorithm value to text

    *value*, an ``int`` a DNSSEC algorithm.

    Returns a ``str``, the name of a DNSSEC algorithm.
    )r   to_text)valuer	   r	   r
   algorithm_to_textN   r<   r?   c                 C   s   |   }| jtjkr|d d> |d  S d}tt|d D ]}||d|  d> |d| d   7 }qt|d dkrG||t|d  d> 7 }||d? d@ 7 }|d@ S )	zReturn the key id (a 16-bit number) for the specified key.

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

    Returns an ``int`` between 0 and 65535
    r   r   r   r   r   i  )to_wire	algorithmr   r&   rangelen)keyrdatatotalir	   r	   r
   key_idY   s   rJ   c                   @   s(   e Zd ZdZdZdZdZedd ZdS )DSDigestz(DNSSEC Delgation Signer Digest Algorithmr   r   r   c                 C   r   r    r	   r"   r	   r	   r
   r$   u   r%   zDSDigest._maximumN)	r   r   r   r   SHA1SHA256SHA384r7   r$   r	   r	   r	   r
   rK   n   s    rK   c                 C   s   zt |trt|  }W n ty   td| w |tjkr%t }n|tj	kr/t
 }n|tjkr9t }ntd| t | trKtj| |} ||    ||j|d | }tdt||j|| }tjtjjtjj|dt|S )aq  Create a DS record for a DNSSEC key.

    *name*, a ``dns.name.Name`` or ``str``, the owner name of the DS record.

    *key*, a ``dns.rdtypes.ANY.DNSKEY.DNSKEY``, the key the DS is about.

    *algorithm*, a ``str`` or ``int`` specifying the hash algorithm.
    The currently supported hashes are "SHA1", "SHA256", and "SHA384". Case
    does not matter for these strings.

    *origin*, a ``dns.name.Name`` or ``None``.  If `key` is a relative name,
    then it will be made absolute using the specified origin.

    Raises ``UnsupportedAlgorithm`` if the algorithm is unknown.

    Returns a ``dns.rdtypes.ANY.DS.DS``
    zunsupported algorithm "%s"originz!HBBr   )
isinstancestrrK   upper	Exceptionr   rL   hashlibsha1rM   sha256rN   sha384dnsnamer9   updatecanonicalizerB   digeststructpackrJ   rC   rG   	from_wire
rdataclassIN	rdatatypeDSrE   )rZ   rF   rC   rP   dshashr]   dsrdatar	   r	   r
   make_dsz   s2   







rg   c                 C   s   g }|  |j}|d u rd S t|tjjr,z|tjjtj	j
}W n ty+   Y d S w |}|D ]}|j|jkrDt||jkrD|| q0|S N)getsignerrQ   rY   nodeNodefind_rdatasetra   rb   rc   DNSKEYKeyErrorrC   rJ   key_tagappend)keysrrsigcandidate_keysr>   rdatasetrG   r	   r	   r
   _find_candidate_keys   s(   

rv   c                 C   s   | t jt jt jt jt jfv S rh   )r   r&   r*   r,   r-   r.   rC   r	   r	   r
   _is_rsa   s   
rx   c                 C      | t jt jfv S rh   )r   r(   r+   rw   r	   r	   r
   _is_dsa      rz   c                 C   ry   rh   )r   r0   r1   rw   r	   r	   r
   	_is_ecdsa   r{   r|   c                 C   ry   rh   )r   r2   r3   rw   r	   r	   r
   	_is_eddsa   r{   r}   c                 C   
   | t jkS rh   )r   r/   rw   r	   r	   r
   _is_gost      
r   c                 C   r~   rh   )r   r&   rw   r	   r	   r
   _is_md5   r   r   c                 C   s   | t jt jt jt jfv S rh   )r   r(   r*   r+   r,   rw   r	   r	   r
   _is_sha1   s   
r   c                 C   ry   rh   )r   r-   r0   rw   r	   r	   r
   
_is_sha256   r{   r   c                 C   r~   rh   )r   r1   rw   r	   r	   r
   
_is_sha384   r   r   c                 C   r~   rh   )r   r.   rw   r	   r	   r
   
_is_sha512   r   r   c                 C   s   t | rt S t| rt S t| rt S t| r t S t	| r(t
 S | tjkr1t
 S | tjkr;tdS td|  )Nr   zunknown hash for algorithm %u)r   hashesMD5r   rL   r   rM   r   rN   r   SHA512r   r2   r3   SHAKE256r   rw   r	   r	   r
   
_make_hash   s   


r   c                 C   s   t | dS )Nbig)int
from_bytes)br	   r	   r
   _bytes_to_long   s   r   c           $   
   C   sn  t |trtj|tjj}t||}|du rtd|D ]}t | tr.| d }| d }n| j}| }|du r;t		 }|j
|k rDtd|j|krMtdt|jr|j}	td|	dd \}
|	dd }	|
dkr{td|	dd	 \}
|	d	d }	|	d|
 }|	|
d }ztt|t|t }W n ty   td
w |j}n1t|jr1|j}	td|	dd \}|	dd }	d|d  }|	dd }|	dd }	|	d| }|	|d }	|	d| }|	|d }	|	d| }ztt|tt|t|t|t }W n ty   td
w |jdd }|jdd }tt|t|}nt|jr|j}	|jtj krHt!" }d}nt!# }d}|	d| }|	||d	  }zt!j$|t|t|dt }W n tyz   td
w |jd| }|j|d }tt|t|}nEt%|jr|j}	|jtj&krt'j(}nt)j*}z|+|	}W n ty   td
w |j}nt,|jrt-dt.|j td|j d}||j/|ddd 7 }||j01|7 }|2|}t3|d |j4k rtd|j4t3|d k r|5|j4d d }tjd|}|1 }t6d|j7|j8|j9}t:|}|D ] } ||7 }||7 }| 1|}!t6dt3|!}"||"7 }||!7 }q2t;|j}#zPt|jrm|<||t=> |# W  dS t|jr~|<|||# W  dS t|jr|<||t!?|# W  dS t%|jr|<|| W  dS td|j  t@y   Y qw td)a*  Validate an RRset against a single signature rdata, throwing an
    exception if validation is not successful.

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

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

    *keys*, 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*, a ``dns.name.Name`` or ``None``, the origin to use for relative
    names.

    *now*, an ``int`` or ``None``, the time, in seconds since the epoch, to
    use as the current time when validating.  If ``None``, the actual current
    time is used.

    Raises ``ValidationFailure`` if the signature is expired, not yet valid,
    the public key is invalid, the algorithm is unknown, the verification
    fails, etc.

    Raises ``UnsupportedAlgorithm`` if the algorithm is recognized by
    dnspython but not implemented.
    Nzunknown keyr   r   expiredznot yet validz!Bz!Hr   zinvalid public key@   r             0   )curvexyz)algorithm "%s" not supported by dnspythonzunknown algorithm %u    rO      z#owner name longer than RRSIG labels*z!HHIzverify failure)ArQ   rR   rY   rZ   r9   rootrv   r   tupletime
expiration	inceptionrx   rC   rF   r^   unpackrsaRSAPublicNumbersr   
public_keydefault_backend
ValueError	signaturerz   dsaDSAPublicNumbersDSAParameterNumbersutilsencode_dss_signaturer|   r   r0   ec	SECP256R1	SECP384R1EllipticCurvePublicNumbersr}   r2   ed25519Ed25519PublicKeyed448Ed448PublicKeyfrom_public_bytesr   r   r?   rB   rj   to_digestablederelativizerE   labelssplitr_   rdtyperdclassoriginal_ttlsortedr   verifypaddingPKCS1v15ECDSAInvalidSignature)$rrsetrs   rr   rP   nowrt   candidate_keyrrnameru   keyptrbytes_rsa_ersa_nr   sigtoctetsdsa_qdsa_pdsa_gdsa_ysig_rsig_sr   ecdsa_xecdsa_yloaderdatasuffix	rrnamebufrrfixedrrlistrrrrdatarrlenchosen_hashr	   r	   r
   _validate_rrsig   s2  













	r   c           	   
   C   s   t |trtj|tjj}t | tr| d }n| j}t |tr)|d }|d }n|j}|}||}||}||kr@td|D ]}zt	| |||| W  dS  tt
fy[   Y qBw td)a  Validate an RRset against a signature RRset, throwing an exception
    if none of the signatures validate.

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

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

    *keys*, 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*, a ``dns.name.Name``, the origin to use for relative names;
    defaults to None.

    *now*, an ``int`` or ``None``, the time, in seconds since the epoch, to
    use as the current time when validating.  If ``None``, the actual current
    time is used.

    Raises ``ValidationFailure`` if the signature is expired, not yet valid,
    the public key is invalid, the algorithm is unknown, the verification
    fails, etc.
    r   r   zowner names do not matchNzno RRSIGs validated)rQ   rR   rY   rZ   r9   r   r   choose_relativityr   r   r   )	r   rrsigsetrr   rP   r   r   	rrsignamerrsigrdatasetrs   r	   r	   r
   	_validate  s,   






r   c                   @   s    e Zd ZdZdZedd ZdS )	NSEC3HashzNSEC3 hash algorithmr   c                 C   r   r    r	   r"   r	   r	   r
   r$     r%   zNSEC3Hash._maximumN)r   r   r   r   rL   r7   r$   r	   r	   r	   r
   r     s
    r   c           
      C   s  t dd}zt|t rt|  }W n ty   tdw |tjkr(td|}|du r1d}nt|t rHt|d dkrDt	
|}ntdt| tjjsUtj| } |   }t||  }t|D ]}t||  }qht|d	}	|	|}	|	S )
a  
    Calculate the NSEC3 hash, according to
    https://tools.ietf.org/html/rfc5155#section-5

    *domain*, a ``dns.name.Name`` or ``str``, the name to hash.

    *salt*, a ``str``, ``bytes``, or ``None``, the hash salt.  If a
    string, it is decoded as a hex string.

    *iterations*, an ``int``, the number of iterations.

    *algorithm*, a ``str`` or ``int``, the hash algorithm.
    The only defined algorithm is SHA1.

    Returns a ``str``, the encoded NSEC3 hash.
     ABCDEFGHIJKLMNOPQRSTUVWXYZ234567 0123456789ABCDEFGHIJKLMNOPQRSTUVz-Wrong hash algorithm (only SHA1 is supported)Nr   r   r   zInvalid salt lengthzutf-8)rR   	maketransrQ   r   rS   rT   r   rL   rE   bytesfromhexrY   rZ   Namer9   r\   rB   rU   rV   r]   rD   base64	b32encodedecode	translate)
domainsalt
iterationsrC   b32_conversionsalt_encodeddomain_encodedr]   _outputr	   r	   r
   
nsec3_hash  s8   



r   c                  O   s   t d)Nz.DNSSEC validation requires python cryptography)ImportError)argskwargsr	   r	   r
   
_need_pyca0  s   r   )r   )r   )r   )r   )r   )r   )r   )r   )r   )r   FTrh   )NN)Or   rU   r^   r   r   dns.enumrY   dns.exceptiondns.namedns.nodedns.rdataset	dns.rdatadns.rdatatypedns.rdataclass	exceptionDNSExceptionr   r   enumIntEnumr   r;   r?   rJ   rK   rg   rv   rx   rz   r|   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   cryptography.exceptionsr   cryptography.hazmat.backendsr   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r   r   r   r   validatevalidate_rrsig
_have_pycar&   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r	   r	   r	   r
   <module>   s   
.
 
::	6
