U
    çe¨]>*  ã                   @   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 ej¡G d
d„ deƒƒZdd„ Zdd„ 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)ÚUnsupportedAlgorithmÚ_Reasons)Úserialization)Údhc                 C   sŒ   |j }|j}| | ¡}| ||jk¡ | ||j¡}|jrˆ| d¡}| 	| |j||j¡ | 
|d ¡}| ||j||j¡}| |dk¡ |S ©Nú	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ÚlibZffiÚparam_cdataÚqZq_dupÚres© r   úI/usr/lib/python3/dist-packages/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 r   )Ú_backendÚ	_dh_cdata)Úselfr   r   r   r   r   Ú__init__&   s    z_DHParameters.__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¡ |d | j jjkrŒd }n| j  |d ¡}t	j
| j  |d ¡| j  |d ¡|dS )Nr   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  | ¡S r   )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 d¡}| jj 	| j
| jjj|| jjj¡ |d | jjjkrltdtjƒ‚| j ||| j
¡S )Nz%Only PKCS3 serialization is supportedr   r   ú'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-   r5   r   r   r   r   r   $   s   r   c                 C   s,   |j }| | d  |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     ÿÿr:   c                 C   sL   | j  d¡}| j ||| j j| j j¡ |  |d | j jk¡ | j |d ¡S )Nr   r   )r   r   r   r   r   r   ZBN_num_bits)r   r   r&   r   r   r   Ú_get_dh_num_bitsa   s    
þr;   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 |¡| _d S r   )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 r   )r;   r!   r"   r,   r   r   r   Úkey_sizer   s    z_DHPrivateKey.key_sizec                 C   sT  | j j d¡}| j j d¡}| j j d¡}| j j | j|||¡ | j  |d | j jjk¡ | j  |d | j jjk¡ |d | j jjkrŒd }n| j  |d ¡}| j j d¡}| j j d¡}| 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 ¡|d| j  |d ¡d| j  |d ¡dS )Nr   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   s2    ýú÷z_DHPrivateKey.private_numbersc                 C   sÚ   | j j d| j¡}| j j d¡}| j j |j|| j jj¡ | j  |d | j jjk¡ | j j 	||d | j¡}|dkrŠ| j  
¡ }t|| j ƒS | j  |dk¡ | j j |¡d |… }| jt|ƒ }|dkrÒd| | }|S d S )Nzunsigned char[]r   r   éÿÿÿÿr   ó    )r!   r   r   r>   r   rF   r"   r   r   ZDH_compute_keyZ_consume_errorsr:   ÚbufferÚlen)r#   Zpeer_public_keyZbufrH   r   r9   ÚkeyZpadr   r   r   Úexchange’   s(    ÿý
z_DHPrivateKey.exchangec                 C   sº   t | j| jƒ}| jj d¡}| jj | j|| jjj¡ | j |d | jjjk¡ | jj 	|d ¡}| j || jjjk¡ | jj 
||| jjj¡}| j |dk¡ | j |¡}t| j||ƒS r
   )r   r"   r!   r   r   r   rF   r   r   r   ZDH_set0_keyZ_dh_cdata_to_evp_pkeyÚ_DHPublicKey)r#   r   rH   Zpub_key_dupr   r@   r   r   r   Ú
public_key­   s      ÿ
þz_DHPrivateKey.public_keyc                 C   s   t | j| jƒS r   ©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 d¡}| jj 	| j
| jjj|| jjj¡ |d | jjjkrltdtjƒ‚| j |||| j| j
¡S )Nz0DH private keys support only PKCS8 serializationr   r   r.   )r   ZPrivateFormatZPKCS8r/   r!   r   r0   r   r   r   r"   r   r   r   r1   Z_private_key_bytesr=   )r#   r3   r4   Zencryption_algorithmr   r   r   r   Úprivate_bytesÀ   s.    ÿ
ýþûz_DHPrivateKey.private_bytesN)r6   r7   r8   r$   ÚpropertyrA   rI   rO   rQ   rS   rT   r   r   r   r   r<   j   s   
r<   c                   @   s8   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	d
„ ZdS )rP   c                 C   s&   || _ || _|| _t| j | jƒ| _d S r   )r!   r"   r=   r;   Ú_key_size_bitsr?   r   r   r   r$   Û   s    z_DHPublicKey.__init__c                 C   s   | j S r   )rV   r,   r   r   r   rA   á   s    z_DHPublicKey.key_sizec                 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¡ |d | j jjkrŒd }n| j  |d ¡}| j j d¡}| j j 	| j|| j jj¡ | j  |d | j jjk¡ t
jt
j| j  |d ¡| j  |d ¡|d| j  |d ¡dS )Nr   r   r%   rB   )r!   r   r   r   r   r"   r   r   r(   rF   r	   rG   r)   )r#   r&   r'   r   r*   rH   r   r   r   rD   å   s.     ÿýúz_DHPublicKey.public_numbersc                 C   s   t | j| jƒS r   rR   r,   r   r   r   rS   ý   s    z_DHPublicKey.parametersc                 C   s‚   |t jjk	rtdƒ‚| jjjsl| jj d¡}| jj 	| j
| jjj|| jjj¡ |d | jjjkrltdtjƒ‚| j ||| | jd ¡S )Nz>DH public keys support only SubjectPublicKeyInfo serializationr   r   r.   )r   ZPublicFormatZSubjectPublicKeyInfor/   r!   r   r0   r   r   r   r"   r   r   r   r1   Z_public_key_bytesr=   r2   r   r   r   Úpublic_bytes   s.    ÿ
ýþûz_DHPublicKey.public_bytesN)	r6   r7   r8   r$   rU   rA   rD   rS   rW   r   r   r   r   rP   Ù   s   
rP   N)Z
__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   r:   r;   ZDHPrivateKeyWithSerializationr<   ZDHPublicKeyWithSerializationrP   r   r   r   r   Ú<module>   s   
0	
n
