3
K^'                 @   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jeG dd deZejeG dd deZejejG dd deZejejG dd deZej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}| jjd|}| jjd}| j jd|t||||j}| j|dk | j|d  | j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_bufbuflenres r   L/tmp/pip-unpacked-wheel-vvkwn1hz/cryptography/hazmat/backends/openssl/dsa.py_dsa_sig_sign   s    r   c             C   s8   | j jd|t||t||j}|dkr4| j  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| 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 j| d S )N)r(   update)r)   r   r   r   r   r,   9   s    z_DSAVerificationContext.updatec             C   s"   | j j }t| j| j| j| d S )N)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"   /   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| j | _d S )N)r#   _private_keyr&   r
   r'   r(   )r)   r   r   r*   r   r   r   r+   F   s    z_DSASignatureContext.__init__c             C   s   | j j| d S )N)r(   r,   )r)   r   r   r   r   r,   L   s    z_DSASignatureContext.updatec             C   s   | j j }t| j| j|S )N)r(   r-   r   r#   r3   )r)   Zdata_to_signr   r   r   r-   O   s    
z_DSASignatureContext.finalizeN)r/   r0   r1   r+   r,   r-   r   r   r   r   r2   D   s   r2   c               @   s$   e Zd Zdd Zdd Zdd ZdS )_DSAParametersc             C   s   || _ || _d S )N)r#   r   )r)   r   	dsa_cdatar   r   r   r+   V   s    z_DSAParameters.__init__c             C   s   | j jjd}| j jjd}| j jjd}| j jj| j||| | j j|d | j jjk | j j|d | j jjk | j j|d | j jjk tj	| j j
|d | j j
|d | j j
|d dS )Nz	BIGNUM **r   )pqg)r#   r   r   r   DSA_get0_pqgr   r   NULLr   DSAParameterNumbers
_bn_to_int)r)   r6   r7   r8   r   r   r   parameter_numbersZ   s    z _DSAParameters.parameter_numbersc             C   s   | j j| S )N)r#   Zgenerate_dsa_private_key)r)   r   r   r   generate_private_keyh   s    z#_DSAParameters.generate_private_keyN)r/   r0   r1   r+   r=   r>   r   r   r   r   r4   T   s   r4   c               @   sN   e Zd Zdd Zej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jd}| j jj||| j jj| j jj | j j|d |jjk | j jj	|d | _
d S )Nz	BIGNUM **r   )r#   r   	_evp_pkeyr   r   r   r9   r:   r   BN_num_bits	_key_size)r)   r   r5   evp_pkeyr6   r   r   r   r+   n   s    z_DSAPrivateKey.__init__rB   c             C   s   t   t| t| j| |S )N)r	   r   r2   r#   )r)   signature_algorithmr   r   r   signer|   s    z_DSAPrivateKey.signerc             C   sR  | j jjd}| j jjd}| j jjd}| j jjd}| j jjd}| j jj| j||| | j j|d | j jjk | j j|d | j jjk | j j|d | j jjk | j jj| j|| | j j|d | j jjk | j j|d | j jjk t	j
t	jt	j| j j|d | j j|d | j j|d d| j j|d d| j j|d dS )Nz	BIGNUM **r   )r6   r7   r8   )r=   y)public_numbersx)r#   r   r   r   r9   r   r   r:   DSA_get0_keyr   ZDSAPrivateNumbersDSAPublicNumbersr;   r<   )r)   r6   r7   r8   pub_keyZpriv_keyr   r   r   private_numbers   s(    z_DSAPrivateKey.private_numbersc             C   s   | j jj| j}| j j|| j jjk | j jj|| j jj}| j jj	d}| j jj
| j|| j jj | j j|d | j jjk | j jj|d }| j jj||| j jj}| j j|dk | j j|}t| j ||S )Nz	BIGNUM **r   r   )r#   r   DSAparams_dupr   r   r   r:   gcDSA_freer   rI   ZBN_dupZDSA_set0_keyZ_dsa_cdata_to_evp_pkey_DSAPublicKey)r)   r5   rK   Zpub_key_dupr   rC   r   r   r   r      s    z_DSAPrivateKey.public_keyc             C   sH   | j jj| j}| j j|| j jjk | j jj|| j jj}t	| j |S )N)
r#   r   rM   r   r   r   r:   rN   rO   r4   )r)   r5   r   r   r   
parameters   s
    z_DSAPrivateKey.parametersc             C   s   | j j|||| j| jS )N)r#   Z_private_key_bytesr@   r   )r)   encodingformatZencryption_algorithmr   r   r   private_bytes   s    z_DSAPrivateKey.private_bytesc             C   s    t | j||\}}t| j| |S )N)r   r#   r   )r)   r   r*   r   r   r   sign   s    z_DSAPrivateKey.signN)r/   r0   r1   r+   r   read_only_propertykey_sizerE   rL   r   rQ   rT   rU   r   r   r   r   r?   l   s   
	r?   c               @   sF   e Zd Zdd ZejdZdd Zdd Zdd	 Z	d
d Z
dd ZdS )rP   c             C   sp   || _ || _|| _| j jjd}| j jj||| j jj| j jj | j j|d |jjk | j jj	|d | _
d S )Nz	BIGNUM **r   )r#   r   r@   r   r   r   r9   r:   r   rA   rB   )r)   r   r5   rC   r6   r   r   r   r+      s    z_DSAPublicKey.__init__rB   c             C   s*   t   tjd| t| t| j| ||S )Nr    )r	   r   _check_bytesr   r"   r#   )r)   r    rD   r   r   r   verifier   s
    z_DSAPublicKey.verifierc             C   s  | j jjd}| j jjd}| j jjd}| j jjd}| j jj| j||| | j j|d | j jjk | j j|d | j jjk | j j|d | j jjk | j jj| j|| j jj | j j|d | j jjk t	j
t	j| j j|d | j j|d | j j|d d| j j|d dS )Nz	BIGNUM **r   )r6   r7   r8   )r=   rF   )r#   r   r   r   r9   r   r   r:   rI   r   rJ   r;   r<   )r)   r6   r7   r8   rK   r   r   r   rG      s"    z_DSAPublicKey.public_numbersc             C   s2   | j jj| j}| j jj|| j jj}t| j |S )N)r#   r   rM   r   r   rN   rO   r4   )r)   r5   r   r   r   rQ      s    z_DSAPublicKey.parametersc             C   s*   |t jjkrtd| jj||| | jd S )Nz2DSA public keys do not support PKCS1 serialization)r   ZPublicFormatZPKCS1
ValueErrorr#   Z_public_key_bytesr@   )r)   rR   rS   r   r   r   public_bytes   s    z_DSAPublicKey.public_bytesc             C   s"   t | j||\}}t| j| ||S )N)r   r#   r!   )r)   r    r   r*   r   r   r   r.     s    z_DSAPublicKey.verifyN)r/   r0   r1   r+   r   rV   rW   rY   rG   rQ   r[   r.   r   r   r   r   rP      s   
	rP   N)
__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"   r2   ZDSAParametersWithNumbersr4   ZDSAPrivateKeyWithSerializationr?   ZDSAPublicKeyWithSerializationrP   r   r   r   r   <module>   s"   X