a
    Ç `4'  ã                   @   sü   d dl mZmZm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 d dlmZmZmZ dd„ Zd	d
„ Ze e¡G dd„ deƒƒZe e¡G dd„ deƒƒZe ej¡G dd„ deƒƒZe ej¡G dd„ deƒƒZe ej¡G dd„ deƒƒZdS )é    )Úabsolute_importÚdivisionÚprint_function)Úutils)ÚInvalidSignature)Ú_calculate_digest_and_algorithmÚ_check_not_prehashedÚ_warn_sign_verify_deprecated)Úhashes)ÚAsymmetricSignatureContextÚAsymmetricVerificationContextÚdsac                 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   é   )	Ú_libZDSA_sizeÚ
_dsa_cdataÚ_ffiÚnewZDSA_signÚlenÚopenssl_assertÚbuffer)ÚbackendÚprivate_keyÚdataZsig_buf_lenZsig_bufZ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r4|  ¡  t‚d S )Nr   r   )r   Z
DSA_verifyr   r   Z_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__4   s
    z _DSAVerificationContext.__init__c                 C   s   | j  |¡ d S r!   ©r'   Úupdate©r(   r   r   r   r   r,   <   s    z_DSAVerificationContext.updatec                 C   s"   | j  ¡ }t| j| j| j|ƒ d S r!   )r'   Úfinalizer   r"   r#   r$   )r(   Zdata_to_verifyr   r   r   Úverify?   s    
ÿz_DSAVerificationContext.verifyN)Ú__name__Ú
__module__Ú__qualname__r*   r,   r/   r   r   r   r   r    2   s   r    c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_DSASignatureContextc                 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__c                 C   s   | j  |¡ d S r!   r+   r-   r   r   r   r,   O   s    z_DSASignatureContext.updatec                 C   s   | j  ¡ }t| j| j|ƒS r!   )r'   r.   r   r"   r4   )r(   Zdata_to_signr   r   r   r.   R   s    
z_DSASignatureContext.finalizeN)r0   r1   r2   r*   r,   r.   r   r   r   r   r3   G   s   r3   c                   @   s$   e Zd Zdd„ Zdd„ Zdd„ ZdS )Ú_DSAParametersc                 C   s   || _ || _d S r!   )r"   r   )r(   r   Ú	dsa_cdatar   r   r   r*   Y   s    z_DSAParameters.__init__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(   r9   r:   r;   r   r   r   Úparameter_numbers]   s    ýz _DSAParameters.parameter_numbersc                 C   s   | j  | ¡S r!   )r"   Zgenerate_dsa_private_key)r(   r   r   r   Úgenerate_private_keyk   s    z#_DSAParameters.generate_private_keyN)r0   r1   r2   r*   r@   rA   r   r   r   r   r5   W   s   r5   c                   @   sN   e Zd Zdd„ Ze d¡Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ Zdd„ ZdS )Ú_DSAPrivateKeyc                 C   sp   || _ || _|| _| j j d¡}| j j ||| j jj| j jj¡ | j  |d |jjk¡ | j j 	|d ¡| _
d S ©Nr7   r   ©r"   r   Ú	_evp_pkeyr   r   r   r<   r=   r   ZBN_num_bitsÚ	_key_size©r(   r   r6   Úevp_pkeyr9   r   r   r   r*   q   s    ÿz_DSAPrivateKey.__init__rF   c                 C   s   t ƒ  t|ƒ t| j| |ƒS r!   )r	   r   r3   r"   )r(   Úsignature_algorithmr   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 )Nr7   r   r8   ©r@   Úy)Úpublic_numbersÚx)r"   r   r   r   r<   r   r   r=   ÚDSA_get0_keyr   ZDSAPrivateNumbersÚDSAPublicNumbersr>   r?   )r(   r9   r:   r;   Úpub_keyZ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 )Nr7   r   r   )r"   r   ÚDSAparams_dupr   r   r   r=   ÚgcÚDSA_freer   rO   ZBN_dupZDSA_set0_keyZ_dsa_cdata_to_evp_pkeyÚ_DSAPublicKey)r(   r6   rQ   Zpub_key_dupr   rH   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   rS   r   r   r   r=   rT   rU   r5   ©r(   r6   r   r   r   Ú
parameters°   s    
ÿz_DSAPrivateKey.parametersc                 C   s   | j  |||| | j| j¡S r!   )r"   Z_private_key_bytesrE   r   )r(   ÚencodingÚformatZencryption_algorithmr   r   r   Úprivate_bytes¸   s    úz_DSAPrivateKey.private_bytesc                 C   s    t | j||ƒ\}}t| j| |ƒS r!   )r   r"   r   )r(   r   r)   r   r   r   ÚsignÂ   s    ÿz_DSAPrivateKey.signN)r0   r1   r2   r*   r   Úread_only_propertyÚkey_sizerJ   rR   r   rX   r[   r\   r   r   r   r   rB   o   s   

rB   c                   @   sF   e Zd Zdd„ Ze d¡Zdd„ Zdd„ Zdd	„ Z	d
d„ Z
dd„ ZdS )rV   c                 C   sp   || _ || _|| _| j j d¡}| j j ||| j jj| j jj¡ | j  |d |jjk¡ | j j 	|d ¡| _
d S rC   rD   rG   r   r   r   r*   Ë   s    ÿz_DSAPublicKey.__init__rF   c                 C   s*   t ƒ  t d|¡ t|ƒ t| j| ||ƒS )Nr   )r	   r   Ú_check_bytesr   r    r"   )r(   r   rI   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 )Nr7   r   r8   rK   )r"   r   r   r   r<   r   r   r=   rO   r   rP   r>   r?   )r(   r9   r:   r;   rQ   r   r   r   rM   á   s(    ÿýúz_DSAPublicKey.public_numbersc                 C   s2   | j j | j¡}| j j || j jj¡}t| j |ƒS r!   )r"   r   rS   r   r   rT   rU   r5   rW   r   r   r   rX   ÷   s
    
ÿz_DSAPublicKey.parametersc                 C   s   | j  ||| | jd ¡S r!   )r"   Z_public_key_bytesrE   )r(   rY   rZ   r   r   r   Úpublic_bytesþ   s    ÿz_DSAPublicKey.public_bytesc                 C   s"   t | j||ƒ\}}t| j| ||ƒS r!   )r   r"   r   )r(   r   r   r)   r   r   r   r/     s    ÿz_DSAPublicKey.verifyN)r0   r1   r2   r*   r   r]   r^   r`   rM   rX   ra   r/   r   r   r   r   rV   É   s   
	rV   N)Z
__future__r   r   r   Zcryptographyr   Zcryptography.exceptionsr   Z*cryptography.hazmat.backends.openssl.utilsr   r   r	   Zcryptography.hazmat.primitivesr
   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r   r   Zregister_interfaceÚobjectr    r3   ZDSAParametersWithNumbersr5   ZDSAPrivateKeyWithSerializationrB   ZDSAPublicKeyWithSerializationrV   r   r   r   r   Ú<module>   s"   

Y
