o
    Þý°j  ã                   @   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                   @   sf   e Zd ZU ejed< ejZejZ	e
 ¡ Zdededdfdd„Zdefdd	„Zededd fd
d„ƒZdS )Ú	PublicDSAÚkeyÚ	signatureÚdataÚreturnNc                 C   sJ   |dd… }|dd … }t  t |d¡t |d¡¡}| j ||| j¡ d S )Né   é   Úbig)r   Úencode_dss_signatureÚintÚ
from_bytesr   ÚverifyÚchosen_hash)Úselfr   r   Úsig_rÚsig_sÚsig© r   ú…/root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/dns/dnssecalgs/dsa.pyr      s   ÿzPublicDSA.verifyc                 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   Úpublic_numbersÚkey_sizeÚ
ValueErrorÚstructÚpackÚparameter_numbersÚqÚto_bytesÚpÚgÚy)r   ÚpnÚdsa_tÚoctetsÚresr   r   r   Úencode_key_bytes   s   
zPublicDSA.encode_key_bytesc           	      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   )Ú!_ensure_algorithm_key_combinationr   r$   Úunpackr   ÚDSAPublicNumbersr   r   ÚDSAParameterNumbersÚ
public_keyr   )	Úclsr   ÚkeyptrÚtr.   Údsa_qÚdsa_pÚdsa_gÚdsa_yr   r   r   Úfrom_dnskey(   s.   




ýþøzPublicDSA.from_dnskey)Ú__name__Ú
__module__Ú__qualname__r   ÚDSAPublicKeyÚ__annotations__Úkey_clsr   ÚDSAÚ	algorithmr   ÚSHA1r   Úbytesr   r0   Úclassmethodr	   r>   r   r   r   r   r
      s   
 
r
   c                	   @   sX   e Zd ZU ejed< ejZeZ		dde	de
de
de	fdd	„Zed
edd fdd„ƒZdS )Ú
PrivateDSAr   FTr   r   Údeterministicr   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� }
|rI|  ¡  |
|¡ |
S )	z1Sign using a private key per RFC 2536, section 3.i   zDSA key size overflowr   r   r    r   r   )ÚlengthÚ	byteorder)r   r6   r"   r#   ÚsignÚ
public_clsr   r   Údecode_dss_signaturer$   r%   r   r(   r   )r   r   r   rK   Úpublic_dsa_keyÚder_signatureÚdsa_rÚdsa_sr-   r.   r   r   r   r   rN   G   s$   

ÿ
ÿþÿzPrivateDSA.signr"   c                 C   s   | t j|d�d�S )N)r"   r1   )r   Úgenerate_private_key)r7   r"   r   r   r   Úgenerate`   s   
ÿzPrivateDSA.generateN)FT)r?   r@   rA   r   ÚDSAPrivateKeyrC   rD   r
   rO   rH   ÚboolrN   rI   r   rV   r   r   r   r   rJ   B   s"   
 
üþýü
ûrJ   c                   @   s   e Zd ZejZdS )ÚPublicDSANSEC3SHA1N)r?   r@   rA   r   ÚDSANSEC3SHA1rF   r   r   r   r   rY   g   s    
rY   c                   @   s   e Zd ZeZdS )ÚPrivateDSANSEC3SHA1N)r?   r@   rA   rY   rO   r   r   r   r   r[   k   s    r[   )r$   Úcryptography.hazmat.backendsr   Úcryptography.hazmat.primitivesr   Ú)cryptography.hazmat.primitives.asymmetricr   r   Údns.dnssecalgs.cryptographyr   r   Údns.dnssectypesr   Údns.rdtypes.ANY.DNSKEYr	   r
   rJ   rY   r[   r   r   r   r   Ú<module>   s    6%