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