U
    <{f,                     @   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G dd dej
j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G dd dej
jZG dd deZG dd deZG dd deZG dd deZejdZejdZejdZejdZejdZejdZejdZejdZejdZejdZ eZ!eded ed!ed"ed#ed$ed%ed!ed"e d&i
Z"G d'd( d(Z#G d)d* d*Z$G d+d, d,Z%d:d-d.Z&d/d0 Z'd;d2d3Z(d<d4d5Z)d6d7 Z*G d8d9 d9Z+dS )=zDNS TSIG support.    Nc                   @   s   e Zd ZdZdS )BadTimez8The current time is not within the TSIG's validity time.N__name__
__module____qualname____doc__ r   r   G/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/dns/tsig.pyr      s   r   c                   @   s   e Zd ZdZdS )BadSignaturez#The TSIG signature fails to verify.Nr   r   r   r   r	   r
   #   s   r
   c                   @   s   e Zd ZdZdS )BadKeyz2The TSIG record owner name does not match the key.Nr   r   r   r   r	   r   '   s   r   c                   @   s   e Zd ZdZdS )BadAlgorithmz*The TSIG algorithm does not match the key.Nr   r   r   r   r	   r   +   s   r   c                   @   s   e Zd ZdZdS )	PeerErrorz;Base class for all TSIG errors generated by the remote peerNr   r   r   r   r	   r   /   s   r   c                   @   s   e Zd ZdZdS )
PeerBadKeyz$The peer didn't know the key we usedNr   r   r   r   r	   r   3   s   r   c                   @   s   e Zd ZdZdS )PeerBadSignaturez*The peer didn't like the signature we sentNr   r   r   r   r	   r   7   s   r   c                   @   s   e Zd ZdZdS )PeerBadTimez%The peer didn't like the time we sentNr   r   r   r   r	   r   ;   s   r   c                   @   s   e Zd ZdZdS )PeerBadTruncationz=The peer didn't like amount of truncation in the TSIG we sentNr   r   r   r   r	   r   ?   s   r   zHMAC-MD5.SIG-ALG.REG.INTz	hmac-sha1zhmac-sha224zhmac-sha256zhmac-sha256-128zhmac-sha384zhmac-sha384-192zhmac-sha512zhmac-sha512-256gss-tsig             0      @      c                   @   s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )GSSTSigaG  
    GSS-TSIG TSIG implementation.  This uses the GSS-API context established
    in the TKEY message handshake to sign messages using GSS-API message
    integrity codes, per the RFC.

    In order to avoid a direct GSSAPI dependency, the keyring holds a ref
    to the GSSAPI object required, rather than the key itself.
    c                 C   s   || _ d| _d| _d S )N    r   )gssapi_contextdataname)selfr   r   r   r	   __init__j   s    zGSSTSig.__init__c                 C   s   |  j |7  _ d S N)r   r    r   r   r   r	   updateo   s    zGSSTSig.updatec                 C   s   | j | jS r"   )r   Zget_signaturer   )r    r   r   r	   signr   s    zGSSTSig.signc                 C   s0   z| j | j|W S  tk
r*   tY nX d S r"   )r   Zverify_signaturer   	Exceptionr
   )r    expectedr   r   r	   verifyv   s    zGSSTSig.verifyN)r   r   r   r   r!   r$   r%   r(   r   r   r   r	   r   `   s
   	r   c                   @   s(   e Zd Zdd Zdd Zedd ZdS )GSSTSigAdapterc                 C   s
   || _ d S r"   )keyring)r    r*   r   r   r	   r!      s    zGSSTSigAdapter.__init__c                 C   sF   || j kr>| j | }t|tr:|jtkr:|r:t||| |S d S d S r"   )r*   
isinstanceKey	algorithmGSS_TSIGr)   parse_tkey_and_step)r    messagekeynamekeyr   r   r	   __call__   s    

zGSSTSigAdapter.__call__c                 C   sX   z>| |j|tjjtjj}|r<|d j}|j}|	|W S W n t
k
rR   Y nX d S )Nr   )Z
find_rrsetZanswerdns
rdataclassANYZ	rdatatypeZTKEYr2   secretstepKeyError)clsr2   r0   r1   Zrrsettokenr   r   r   r	   r/      s       
z"GSSTSigAdapter.parse_tkey_and_stepN)r   r   r   r!   r3   classmethodr/   r   r   r   r	   r)      s   
r)   c                   @   sv   e Zd ZdZeejeeje	ej
eej
dfeejeejdfeejeejdfeeji	Zdd Zdd Zd	d
 Zdd ZdS )HMACTSigzo
    HMAC TSIG implementation.  This uses the HMAC python module to handle the
    sign/verify operations.
    r         c                 C   s   z| j | }W n$ tk
r2   td| dY nX t|tr^tj||d d| _|d | _ntj||d| _d | _| jj	| _	| jr|  j	d| j 7  _	d S )NzTSIG algorithm z is not supportedr   )	digestmod   -)
_hashesr9   NotImplementedErrorr+   tuplehmacnewhmac_contextsizer   )r    r2   r-   Zhashinfor   r   r	   r!      s    

zHMACTSig.__init__c                 C   s   | j |S r"   )rH   r$   r#   r   r   r	   r$      s    zHMACTSig.updatec                 C   s&   | j  }| jr"|d | jd  }|S )N   )rH   digestrI   )r    rK   r   r   r	   r%      s    
zHMACTSig.signc                 C   s   |   }t||std S r"   )r%   rF   compare_digestr
   )r    r'   macr   r   r	   r(      s    zHMACTSig.verifyN)r   r   r   r   	HMAC_SHA1hashlibsha1HMAC_SHA224sha224HMAC_SHA256sha256HMAC_SHA256_128HMAC_SHA384sha384HMAC_SHA384_192HMAC_SHA512sha512HMAC_SHA512_256HMAC_MD5md5rC   r!   r$   r%   r(   r   r   r   r	   r=      s0            r=   c                 C   s0  |o| }|r:t |}|r:|tdt| || |td|j || dd  |r||j  |tdtj	j
 |tdd |dkr|j}|d? d@ }|d@ }	td	||	|j}
t|j}|dkrtd
|r"||j |
  |td|j||j  n
||
 |S )zReturn a context containing the TSIG rdata for the input parameters
    @rtype: dns.tsig.HMACTSig or dns.tsig.GSSTSig object
    @raises ValueError: I{other_data} is too long
    @raises NotImplementedError: I{algorithm} is not supported
    !H   Nz!Ir   r   i  l    z!HIHz TSIG Other Data is > 65535 bytesz!HH)get_contextr$   structpacklenZoriginal_idr   Zto_digestabler4   r5   r6   time_signedfudgeother
ValueErrorr-   error)wirer2   rdatatimerequest_macctxmultifirstZ
upper_timeZ
lower_timeZtime_encodedZ	other_lenr   r   r	   _digest   s2    



rp   c                 C   s8   |r0t | }|tdt| || |S dS dS )zIf this is the first message in a multi-message sequence,
    start a new context.
    @rtype: dns.tsig.HMACTSig or dns.tsig.GSSTSig object
    r^   N)r`   r$   ra   rb   rc   )r2   rM   rn   rm   r   r   r	   _maybe_start_digest   s    
rq   Fc           	      C   s:   t | ||||||}| }|j||d}|t|||fS )a~  Return a (tsig_rdata, mac, ctx) tuple containing the HMAC TSIG rdata
    for the input parameters, the HMAC MAC calculated by applying the
    TSIG signature algorithm, and the TSIG digest context.
    @rtype: (string, dns.tsig.HMACTSig or dns.tsig.GSSTSig object)
    @raises ValueError: I{other_data} is too long
    @raises NotImplementedError: I{algorithm} is not supported
    )rd   rM   )rp   r%   replacerq   )	ri   r2   rj   rk   rl   rm   rn   rM   Ztsigr   r   r	   r%     s    	r%   c	                 C   s  t d| dd \}	|	dkr&tjj|	d8 }	| dd t d|	 | d|  }
|jdkr|jtjjkrpt	nJ|jtjj
krtn6|jtjjkrtn"|jtjjkrtntd|j t|j| |jkrt|j|krt|j|jkrtt|
||d|||}||j t||j|S )aF  Validate the specified TSIG rdata against the other input parameters.

    @raises FormError: The TSIG is badly formed.
    @raises BadTime: There is too much time skew between the client and the
    server.
    @raises BadSignature: The TSIG signature did not validate
    @rtype: dns.tsig.HMACTSig or dns.tsig.GSSTSig objectr^   
      r   rA   zunknown TSIG error code %dN)ra   unpackr4   	exceptionZ	FormErrorrb   rh   ZrcodeZBADSIGr   ZBADKEYr   ZBADTIMEr   ZBADTRUNCr   r   absrd   re   r   r   r   r-   r   rp   r(   rM   rq   )ri   r2   ownerrj   nowrl   Z
tsig_startrm   rn   ZadcountZnew_wirer   r   r	   validate  s0    $

rz   c                 C   s&   | j tkrt| jS t| j| j S dS )zReturns an HMAC context for the specified key.

    @rtype: HMAC context
    @raises NotImplementedError: I{algorithm} is not supported
    N)r-   r.   r   r7   r=   )r2   r   r   r	   r`   :  s    

r`   c                   @   s(   e Zd ZefddZdd Zdd ZdS )r,   c                 C   sZ   t |trtj|}|| _t |tr4t| }|| _t |trPtj|}|| _	d S r"   )
r+   strr4   r   	from_textbase64decodebytesencoder7   r-   )r    r   r7   r-   r   r   r	   r!   H  s    


zKey.__init__c                 C   s.   t |to,| j|jko,| j|jko,| j|jkS r"   )r+   r,   r   r7   r-   )r    rf   r   r   r	   __eq__S  s    



z
Key.__eq__c                 C   sN   d| j  dd| j d }| jtkrB|dt| j  d7 }|d7 }|S )Nz<DNS key name='z', zalgorithm=''z
, secret='>)r   r-   r.   r}   	b64encoder7   decode)r    rr   r   r	   __repr__[  s
    
zKey.__repr__N)r   r   r   default_algorithmr!   r   r   r   r   r   r	   r,   G  s   r,   )NNNN)NNNF)NF),r   r}   rO   rF   ra   Zdns.exceptionr4   Zdns.nameZ	dns.rcodeZdns.rdataclassrv   ZDNSExceptionr   r
   r   r   r   r   r   r   r   r   r|   r\   rN   rQ   rS   rU   rV   rX   rY   r[   r.   r   Z	mac_sizesr   r)   r=   rp   rq   r%   rz   r`   r,   r   r   r   r	   <module>   sx              4
#
   
&