U
    çe¨]ô'  ã                   @   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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Úserialization)Ú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__1   s
    z _DSAVerificationContext.__init__c                 C   s   | j  |¡ d S r"   ©r(   Úupdate©r)   r   r   r   r   r-   9   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-   r0   r   r   r   r   r!   /   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+   F   s    z_DSASignatureContext.__init__c                 C   s   | j  |¡ d S r"   r,   r.   r   r   r   r-   L   s    z_DSASignatureContext.updatec                 C   s   | j  ¡ }t| j| j|ƒS r"   )r(   r/   r   r#   r5   )r)   Zdata_to_signr   r   r   r/   O   s    
z_DSASignatureContext.finalizeN)r1   r2   r3   r+   r-   r/   r   r   r   r   r4   D   s   r4   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+   V   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)   r:   r;   r<   r   r   r   Úparameter_numbersZ   s    ýz _DSAParameters.parameter_numbersc                 C   s   | j  | ¡S r"   )r#   Zgenerate_dsa_private_key)r)   r   r   r   Úgenerate_private_keyh   s    z#_DSAParameters.generate_private_keyN)r1   r2   r3   r+   rA   rB   r   r   r   r   r6   T   s   r6   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 ©Nr8   r   ©r#   r   Ú	_evp_pkeyr   r   r   r=   r>   r   ZBN_num_bitsÚ	_key_size©r)   r   r7   Úevp_pkeyr:   r   r   r   r+   n   s       ÿz_DSAPrivateKey.__init__rG   c                 C   s   t ƒ  t|ƒ t| j| |ƒS r"   )r	   r   r4   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 )Nr8   r   r9   ©rA   Úy)Úpublic_numbersÚx)r#   r   r   r   r=   r   r   r>   ÚDSA_get0_keyr   ZDSAPrivateNumbersÚDSAPublicNumbersr?   r@   )r)   r:   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 )Nr8   r   r   )r#   r   ÚDSAparams_dupr   r   r   r>   ÚgcÚDSA_freer   rP   ZBN_dupZDSA_set0_keyZ_dsa_cdata_to_evp_pkeyÚ_DSAPublicKey)r)   r7   rR   Zpub_key_dupr   rI   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   rT   r   r   r   r>   rU   rV   r6   ©r)   r7   r   r   r   Ú
parameters­   s     ÿz_DSAPrivateKey.parametersc                 C   s   | j  |||| j| j¡S r"   )r#   Z_private_key_bytesrF   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)r1   r2   r3   r+   r   Úread_only_propertyÚkey_sizerK   rS   r   rY   r\   r]   r   r   r   r   rC   l   s   
	rC   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 )rW   c                 C   sp   || _ || _|| _| j j d¡}| j j ||| j jj| j jj¡ | j  |d |jjk¡ | j j 	|d ¡| _
d S rD   rE   rH   r   r   r   r+   Ç   s       ÿz_DSAPublicKey.__init__rG   c                 C   s*   t ƒ  t d|¡ t|ƒ t| j| ||ƒS )Nr   )r	   r   Ú_check_bytesr   r!   r#   )r)   r   rJ   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 )Nr8   r   r9   rL   )r#   r   r   r   r=   r   r   r>   rP   r   rQ   r?   r@   )r)   r:   r;   r<   rR   r   r   r   rN   Ý   s,      ÿýúz_DSAPublicKey.public_numbersc                 C   s2   | j j | j¡}| j j || j jj¡}t| j |ƒS r"   )r#   r   rT   r   r   rU   rV   r6   rX   r   r   r   rY   ó   s     ÿz_DSAPublicKey.parametersc                 C   s*   |t jjkrtdƒ‚| j ||| | jd ¡S )Nz2DSA public keys do not support PKCS1 serialization)r   ZPublicFormatZPKCS1Ú
ValueErrorr#   Z_public_key_bytesrF   )r)   rZ   r[   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   r0     s      ÿz_DSAPublicKey.verifyN)r1   r2   r3   r+   r   r^   r_   ra   rN   rY   rc   r0   r   r   r   r   rW   Å   s   
	rW   N)Z
__future__r   r   r   Zcryptographyr   Zcryptography.exceptionsr   Z*cryptography.hazmat.backends.openssl.utilsr   r   r	   Zcryptography.hazmat.primitivesr
   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r   r    Zregister_interfaceÚobjectr!   r4   ZDSAParametersWithNumbersr6   ZDSAPrivateKeyWithSerializationrC   ZDSAPublicKeyWithSerializationrW   r   r   r   r   Ú<module>   s"   

X
