U
    <æ{f©  ã                   @   sœ   d dl Z d dlmZ d dlmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZ d dlm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dS )é    N)Údefault_backend)Úhashes)ÚdsaÚutils)ÚCryptographyPrivateKeyÚCryptographyPublicKey)Ú	Algorithm)ÚDNSKEYc                   @   s`   e Zd ZU ejed< ejZejZ	e
 ¡ Zeeddœdd„Zedœdd„Zeed d	œd
d„ƒZdS )Ú	PublicDSAÚkeyN)Ú	signatureÚdataÚreturnc                 C   sJ   |dd… }|dd … }t  t |d¡t |d¡¡}| j ||| j¡ d S )Né   é   Úbig)r   Zencode_dss_signatureÚintÚ
from_bytesr   ÚverifyÚchosen_hash)Úselfr   r   Zsig_rZsig_sÚsig© r   úQ/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/dns/dnssecalgs/dsa.pyr      s    
 
ÿzPublicDSA.verify)r   c                 C   s˜   | j  ¡ }| j jd d d }|dkr.tdƒ‚d|d  }t d|¡}||jj dd¡7 }||jj	 |d¡7 }||jj
 |d¡7 }||j |d¡7 }|S )z,Encode a public key per RFC 2536, section 2.é   é@   zunsupported DSA key sizeú!Bé   r   )r   Zpublic_numbersÚkey_sizeÚ
ValueErrorÚstructÚpackZparameter_numbersÚqÚto_bytesÚpÚgÚy)r   ZpnÚdsa_tÚoctetsÚresr   r   r   Úencode_key_bytes   s    
zPublicDSA.encode_key_bytes)r   r   c           	      C   sÖ   |   |¡ |j}t d|dd… ¡\}|dd … }d|d  }|dd… }|dd … }|d|… }||d … }|d|… }||d … }|d|… }| t t |d¡t t |d¡t |d¡t |d¡¡¡ 	t
ƒ ¡dS )	Nr   r   r   r   r   r   r   ©r   )Z!_ensure_algorithm_key_combinationr   r    Úunpackr   ZDSAPublicNumbersr   r   ZDSAParameterNumbersÚ
public_keyr   )	Úclsr   ZkeyptrÚtr(   Zdsa_qZdsa_pZdsa_gZdsa_yr   r   r   Úfrom_dnskey(   s0    




ýþùÿzPublicDSA.from_dnskey)Ú__name__Ú
__module__Ú__qualname__r   ZDSAPublicKeyÚ__annotations__Úkey_clsr   ZDSAÚ	algorithmr   ÚSHA1r   Úbytesr   r*   Úclassmethodr	   r0   r   r   r   r   r
      s   

r
   c                   @   sJ   e Zd ZU ejed< ejZeZd
e	e
e	dœdd„Zeed dœdd„ƒZd	S )Ú
PrivateDSAr   F)r   r   r   c           
      C   s–   | j  ¡ }|jdkrtdƒ‚| j  || jj¡}t |¡\}}|jd d d }d}t	 
d|¡tj||dd tj||dd }	|r’|  ¡  |	|¡ |	S )	z1Sign using a private key per RFC 2536, section 3.i   zDSA key size overflowr   r   r   r   r   )ÚlengthÚ	byteorder)r   r-   r   r   ÚsignÚ
public_clsr   r   Zdecode_dss_signaturer    r!   r   r#   r   )
r   r   r   Zpublic_dsa_keyZder_signatureZdsa_rZdsa_sr'   r(   r   r   r   r   r=   G   s     


ÿþÿzPrivateDSA.sign)r   r   c                 C   s   | t j|ddS )N)r   r+   )r   Zgenerate_private_key)r.   r   r   r   r   ÚgenerateY   s    
ÿzPrivateDSA.generateN)F)r1   r2   r3   r   ZDSAPrivateKeyr4   r5   r
   r>   r8   Úboolr=   r9   r   r?   r   r   r   r   r:   B   s   

r:   c                   @   s   e Zd ZejZdS )ÚPublicDSANSEC3SHA1N)r1   r2   r3   r   ZDSANSEC3SHA1r6   r   r   r   r   rA   `   s   rA   c                   @   s   e Zd ZeZdS )ÚPrivateDSANSEC3SHA1N)r1   r2   r3   rA   r>   r   r   r   r   rB   d   s   rB   )r    Zcryptography.hazmat.backendsr   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   r   Zdns.dnssecalgs.cryptographyr   r   Zdns.dnssectypesr   Zdns.rdtypes.ANY.DNSKEYr	   r
   r:   rA   rB   r   r   r   r   Ú<module>   s   6