3
K^>*                 @   s   d dl mZmZmZ d dlmZ d dlmZmZ d dl	m
Z
 d dlmZ dd Zdd	 ZejejG d
d deZdd Zdd 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)UnsupportedAlgorithm_Reasons)serialization)dhc             C   s   |j }|j}|j| }|j||jk |j||j}|jr|jd}|j	| |j||j |j
|d }|j||j||j}|j|dk |S )Nz	BIGNUM **r      )_lib_ffiZDHparams_dupopenssl_assertNULLgcZDH_freeZ"CRYPTOGRAPHY_OPENSSL_LESS_THAN_102newDH_get0_pqgBN_dupZDH_set0_pqg)dh_cdatabackendlibffiparam_cdataqZq_dupres r   K/tmp/pip-unpacked-wheel-vvkwn1hz/cryptography/hazmat/backends/openssl/dh.py_dh_params_dup   s    

r   c             C   s   t | |}t||S )N)r   _DHParameters)r   r   r   r   r   r   _dh_cdata_to_parameters   s    
r   c               @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
r   c             C   s   || _ || _d S )N)_backend	_dh_cdata)selfr   r   r   r   r   __init__&   s    z_DHParameters.__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 |d | j jjkrd }n| j j|d }t	j
| j j|d | j j|d |dS )Nz	BIGNUM **r   )pgr   )r   r   r   r   r   r    r   r   
_bn_to_intr	   DHParameterNumbers)r!   r#   r$   r   q_valr   r   r   parameter_numbers*   s    z_DHParameters.parameter_numbersc             C   s   | j j| S )N)r   Zgenerate_dh_private_key)r!   r   r   r   generate_private_key;   s    z"_DHParameters.generate_private_keyc             C   s~   |t jjk	rtd| jjjsl| jjjd}| jjj	| j
| jjj|| jjj |d | jjjkrltdtj| jj||| j
S )Nz%Only PKCS3 serialization is supportedz	BIGNUM **r   z'DH X9.42 serialization is not supported)r   ZParameterFormatZPKCS3
ValueErrorr   r   Cryptography_HAS_EVP_PKEY_DHXr   r   r   r    r   r   r   UNSUPPORTED_SERIALIZATIONZ_parameter_bytes)r!   encodingformatr   r   r   r   parameter_bytes>   s"    
z_DHParameters.parameter_bytesN)__name__
__module____qualname__r"   r(   r)   r/   r   r   r   r   r   $   s   r   c             C   s,   |j }|j| d j|j|j tdd S )Nr   z.Public key value is invalid for this exchange.)r   r   Z_lib_reason_matchZ
ERR_LIB_DHZDH_R_INVALID_PUBKEYr*   )errorsr   r   r   r   r   _handle_dh_compute_key_errorU   s
    r4   c             C   sL   | j jd}| jj||| j j| j j | j|d | j jk | jj|d S )Nz	BIGNUM **r   )r   r   r   r   r   r   ZBN_num_bits)r   r   r#   r   r   r   _get_dh_num_bitsa   s    

r5   c               @   sH   e Zd Zdd Zedd Zdd Zdd Zd	d
 Zdd Z	dd Z
dS )_DHPrivateKeyc             C   s&   || _ || _|| _| j jj|| _d S )N)r   r    	_evp_pkeyr   ZDH_size_key_size_bytes)r!   r   r   evp_pkeyr   r   r   r"   l   s    z_DHPrivateKey.__init__c             C   s   t | j| jS )N)r5   r   r    )r!   r   r   r   key_sizer   s    z_DHPrivateKey.key_sizec             C   sT  | 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 |d | j jjkrd }n| 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 t
jt
jt
j| j j|d | j j|d |d| j j|d d| j j|d dS )Nz	BIGNUM **r   )r#   r$   r   )r(   y)public_numbersx)r   r   r   r   r   r    r   r   r%   DH_get0_keyr	   ZDHPrivateNumbersDHPublicNumbersr&   )r!   r#   r$   r   r'   pub_keyZpriv_keyr   r   r   private_numbersv   s,    z_DHPrivateKey.private_numbersc             C   s   | j jjd| j}| j jjd}| j jj|j|| j jj | j j|d | j jjk | j jj	||d | j}|dkr| j j
 }t|| j S | j j|dk | j jj|d | }| jt| }|dkrd| | }|S d S )Nzunsigned char[]z	BIGNUM **r   r
       )r   r   r   r8   r   r>   r    r   r   ZDH_compute_keyZ_consume_errorsr4   bufferlen)r!   Zpeer_public_keybufr@   r   r3   keypadr   r   r   exchange   s$    
z_DHPrivateKey.exchangec             C   s   t | 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k | jjj
||| jjj}| jj|dk | jj|}t| j||S )Nz	BIGNUM **r   r
   )r   r    r   r   r   r   r>   r   r   r   ZDH_set0_keyZ_dh_cdata_to_evp_pkey_DHPublicKey)r!   r   r@   Zpub_key_dupr   r9   r   r   r   
public_key   s    
z_DHPrivateKey.public_keyc             C   s   t | j| jS )N)r   r    r   )r!   r   r   r   
parameters   s    z_DHPrivateKey.parametersc             C   s   |t jjk	rtd| jjjsl| jjjd}| jjj	| j
| jjj|| jjj |d | jjjkrltdtj| jj|||| j| j
S )Nz0DH private keys support only PKCS8 serializationz	BIGNUM **r   z'DH X9.42 serialization is not supported)r   ZPrivateFormatZPKCS8r*   r   r   r+   r   r   r   r    r   r   r   r,   Z_private_key_bytesr7   )r!   r-   r.   Zencryption_algorithmr   r   r   r   private_bytes   s&    
z_DHPrivateKey.private_bytesN)r0   r1   r2   r"   propertyr:   rA   rI   rK   rL   rM   r   r   r   r   r6   j   s   r6   c               @   s8   e Zd Zdd Zedd Zdd Zdd Zd	d
 ZdS )rJ   c             C   s&   || _ || _|| _t| j | j| _d S )N)r   r    r7   r5   _key_size_bits)r!   r   r   r9   r   r   r   r"      s    z_DHPublicKey.__init__c             C   s   | j S )N)rO   )r!   r   r   r   r:      s    z_DHPublicKey.key_sizec             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 |d | j jjkrd }n| j j|d }| j jjd}| j jj	| j|| j jj | j j|d | j jjk t
jt
j| j j|d | j j|d |d| j j|d dS )Nz	BIGNUM **r   )r#   r$   r   )r(   r;   )r   r   r   r   r   r    r   r   r%   r>   r	   r?   r&   )r!   r#   r$   r   r'   r@   r   r   r   r<      s&    z_DHPublicKey.public_numbersc             C   s   t | j| jS )N)r   r    r   )r!   r   r   r   rL      s    z_DHPublicKey.parametersc             C   s   |t jjk	rtd| jjjsl| jjjd}| jjj	| j
| jjj|| jjj |d | jjjkrltdtj| jj||| | jd S )Nz>DH public keys support only SubjectPublicKeyInfo serializationz	BIGNUM **r   z'DH X9.42 serialization is not supported)r   ZPublicFormatZSubjectPublicKeyInfor*   r   r   r+   r   r   r   r    r   r   r   r,   Z_public_key_bytesr7   )r!   r-   r.   r   r   r   r   public_bytes   s&    
z_DHPublicKey.public_bytesN)	r0   r1   r2   r"   rN   r:   r<   rL   rP   r   r   r   r   rJ      s
   rJ   N)
__future__r   r   r   Zcryptographyr   Zcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr	   r   r   Zregister_interfaceZDHParametersWithSerializationobjectr   r4   r5   ZDHPrivateKeyWithSerializationr6   ZDHPublicKeyWithSerializationrJ   r   r   r   r   <module>   s   0	n