o
    h                     @   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   Zencode_dss_signatureint
from_bytesr   verifychosen_hash)selfr   r   Zsig_rZsig_ssig r   E/var/www/html/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   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_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   )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(   s.   




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                	   @   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   r-   r   r   sign
public_clsr   r   Zdecode_dss_signaturer    r!   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.signr   c                 C   s   | t j|ddS )N)r   r+   )r   Zgenerate_private_key)r.   r   r   r   r   generate^   s   
zPrivateDSA.generateN)FT)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   rB   e   s    
rB   c                   @   s   e Zd ZeZdS )PrivateDSANSEC3SHA1N)r1   r2   r3   rB   r?   r   r   r   r   rC   i   s    rC   )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:   rB   rC   r   r   r   r   <module>   s    6#