U
    d                     @   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   6/tmp/pip-unpacked-wheel-pk5slln3/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