o
    )%a)                     @   s   d dl Z d dlmZ d dlmZ d dlmZmZmZ d dl	m
Z
mZ d dlmZmZmZmZ dd Zd	d
 ZG dd deZG dd deZG dd dejZG dd dejZG dd dejZdS )    N)utils)InvalidSignature)_calculate_digest_and_algorithm_check_not_prehashed_warn_sign_verify_deprecated)hashesserialization)AsymmetricSignatureContextAsymmetricVerificationContextdsar   c                 C   sx   | j |j}| jd|}| jd}| j d|t||||j}| |dk | |d  | j|d |d  S )Nzunsigned char[]zunsigned int *r      )	_libDSA_size
_dsa_cdata_ffinewDSA_signlenopenssl_assertbuffer)backendprivate_keydatasig_buf_lensig_bufbuflenres r   J/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/dsa.py_dsa_sig_sign   s   r   c                 C   s8   | j d|t||t||j}|dkr|   td S )Nr   r   )r   
DSA_verifyr   r   _consume_errorsr   )r   
public_key	signaturer   r   r   r   r   _dsa_sig_verify(   s   r$   c                   @   s$   e Zd Zdd Zdd Zdd ZdS )_DSAVerificationContextc                 C   s.   || _ || _|| _|| _t| j| j | _d S N)_backend_public_key
_signature
_algorithmr   Hash	_hash_ctx)selfr   r"   r#   	algorithmr   r   r   __init__5   s
   z _DSAVerificationContext.__init__c                 C      | j | d S r&   r,   updater-   r   r   r   r   r2   =      z_DSAVerificationContext.updatec                 C   s"   | j  }t| j| j| j| d S r&   )r,   finalizer$   r'   r(   r)   )r-   data_to_verifyr   r   r   verify@   s   
z_DSAVerificationContext.verifyN)__name__
__module____qualname__r/   r2   r7   r   r   r   r   r%   4   s    r%   c                   @   sB   e Zd ZdejdejfddZdeddfdd	Z	defd
dZ
dS )_DSASignatureContextr   r.   c                 C   s(   || _ || _|| _t| j| j | _d S r&   )r'   _private_keyr*   r   r+   r,   )r-   r   r   r.   r   r   r   r/   I   s   z_DSASignatureContext.__init__r   returnNc                 C   r0   r&   r1   r3   r   r   r   r2   T   r4   z_DSASignatureContext.updatec                 C   s   | j  }t| j| j|S r&   )r,   r5   r   r'   r<   )r-   data_to_signr   r   r   r5   W   s   
z_DSASignatureContext.finalize)r8   r9   r:   r   DSAPrivateKeyr   HashAlgorithmr/   bytesr2   r5   r   r   r   r   r;   H   s    
r;   c                   @   s4   e Zd Zdd ZdejfddZdejfddZdS )	_DSAParametersc                 C   s   || _ || _d S r&   )r'   r   )r-   r   	dsa_cdatar   r   r   r/   ]   s   
z_DSAParameters.__init__r=   c                 C   s   | j jd}| j jd}| j jd}| j j| j||| | j |d | j jjk | j |d | j jjk | j |d | j jjk tj	| j 
|d | j 
|d | j 
|d dS )N	BIGNUM **r   pqg)r'   r   r   r   DSA_get0_pqgr   r   NULLr   DSAParameterNumbers
_bn_to_int)r-   rF   rG   rH   r   r   r   parameter_numbersa   s   z _DSAParameters.parameter_numbersc                 C   s   | j | S r&   )r'   generate_dsa_private_key)r-   r   r   r   generate_private_keyo   s   z#_DSAParameters.generate_private_keyN)	r8   r9   r:   r/   r   rK   rM   r?   rO   r   r   r   r   rB   \   s    rB   c                   @   s   e Zd Zdd ZedZdejde	fddZ
dejfdd	Zdejfd
dZdejfddZdejdejdejdefddZdedejejejf defddZdS )_DSAPrivateKeyc                 C   p   || _ || _|| _| j jd}| j j||| j jj| j jj | j |d |jjk | j j	|d | _
d S NrD   r   r'   r   	_evp_pkeyr   r   r   rI   rJ   r   BN_num_bits	_key_sizer-   r   rC   evp_pkeyrF   r   r   r   r/   t   s   z_DSAPrivateKey.__init__rV   signature_algorithmr=   c                 C   s   t   t| t| j| |S r&   )r   r   r;   r'   )r-   rY   r   r   r   signer   s   z_DSAPrivateKey.signerc              	   C   sR  | j jd}| j jd}| j jd}| j jd}| j jd}| j j| j||| | j |d | j jjk | j |d | j jjk | j |d | j jjk | j j| j|| | j |d | j jjk | j |d | j jjk t	j
t	jt	j| j |d | j |d | j |d d| j |d d| j |d dS )NrD   r   rE   rM   y)public_numbersx)r'   r   r   r   rI   r   r   rJ   DSA_get0_keyr   DSAPrivateNumbersDSAPublicNumbersrK   rL   )r-   rF   rG   rH   pub_keypriv_keyr   r   r   private_numbers   s.   z_DSAPrivateKey.private_numbersc                 C   s   | j j| j}| j || j jjk | j j|| j jj}| j j	d}| j j
| j|| j jj | j |d | j jjk | j j|d }| j j||| j jj}| j |dk | j |}t| j ||S )NrD   r   r   )r'   r   DSAparams_dupr   r   r   rJ   gcDSA_freer   r_   BN_dupDSA_set0_key_dsa_cdata_to_evp_pkey_DSAPublicKey)r-   rC   rb   pub_key_dupr   rX   r   r   r   r"      s"   
z_DSAPrivateKey.public_keyc                 C   sH   | j j| j}| j || j jjk | j j|| j jj}t	| j |S r&   )
r'   r   re   r   r   r   rJ   rf   rg   rB   r-   rC   r   r   r   
parameters   s   
z_DSAPrivateKey.parametersencodingformatencryption_algorithmc                 C   s   | j |||| | j| jS r&   )r'   _private_key_bytesrT   r   )r-   ro   rp   rq   r   r   r   private_bytes   s   z_DSAPrivateKey.private_bytesr   r.   c                 C   s    t | j||\}}t| j| |S r&   )r   r'   r   )r-   r   r.   r   r   r   sign   s   z_DSAPrivateKey.signN)r8   r9   r:   r/   r   read_only_propertykey_sizer   r@   r	   rZ   r   r`   rd   DSAPublicKeyr"   DSAParametersrn   r   EncodingPrivateFormatKeySerializationEncryptionrA   rs   typingUnion
asym_utils	Prehashedrt   r   r   r   r   rP   s   s6    


rP   c                   @   s   e Zd Zdd ZedZdedej	de
fddZdejfd	d
ZdejfddZdejdejdefddZdededejejej	f fddZdS )rk   c                 C   rQ   rR   rS   rW   r   r   r   r/      s   z_DSAPublicKey.__init__rV   r#   rY   r=   c                 C   s*   t   td| t| t| j| ||S )Nr#   )r   r   _check_bytesr   r%   r'   )r-   r#   rY   r   r   r   verifier   s   
z_DSAPublicKey.verifierc                 C   s  | j jd}| j jd}| j jd}| j jd}| j j| j||| | j |d | j jjk | j |d | j jjk | j |d | j jjk | j j| j|| j jj | j |d | j jjk t	j
t	j| j |d | j |d | j |d d| j |d dS )NrD   r   rE   r[   )r'   r   r   r   rI   r   r   rJ   r_   r   ra   rK   rL   )r-   rF   rG   rH   rb   r   r   r   r]      s(   z_DSAPublicKey.public_numbersc                 C   s2   | j j| j}| j j|| j jj}t| j |S r&   )r'   r   re   r   r   rf   rg   rB   rm   r   r   r   rn     s
   
z_DSAPublicKey.parametersro   rp   c                 C   s   | j ||| | jd S r&   )r'   _public_key_bytesrT   )r-   ro   rp   r   r   r   public_bytes  s   z_DSAPublicKey.public_bytesr   r.   c                 C   s"   t | j||\}}t| j| ||S r&   )r   r'   r$   )r-   r#   r   r.   r   r   r   r7     s   z_DSAPublicKey.verifyN)r8   r9   r:   r/   r   ru   rv   rA   r   r@   r
   r   r   ra   r]   rx   rn   r   ry   PublicFormatr   r|   r}   r~   r   r7   r   r   r   r   rk      s4    


	rk   )r|   cryptographyr   cryptography.exceptionsr   *cryptography.hazmat.backends.openssl.utilsr   r   r   cryptography.hazmat.primitivesr   r   )cryptography.hazmat.primitives.asymmetricr	   r
   r   r~   r   r$   r%   r;   rx   rB   r?   rP   rw   rk   r   r   r   r   <module>   s   d