U
    *”}fÿ'  ã                   @   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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_IS_LIBRESSLÚ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-x36vw73o/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.   r6   r   r   r   r   r    $   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_bitsR   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%   [   s    z_DHPrivateKey.__init__c                 C   s   t | j| jƒS r   )r:   r"   r#   r-   r   r   r   Úkey_sizea   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_numberse   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d|ƒ‚nL| j  |dk¡ | j j |¡d |… }| jt|ƒ }|dkrÒd| | }|S d S )Nzunsigned char[]r   r   éÿÿÿÿzKError computing shared key. Public key is likely invalid for this exchange.r   ó    )r"   r   r   r=   r   rE   r#   r   r   ZDH_compute_keyZ_consume_errors_with_textr0   ÚbufferÚlen)r$   Zpeer_public_keyÚbufrG   r   Zerrors_with_textÚkeyÚpadr   r   r   Úexchange   s2      ÿ  ÿ
ý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   rE   r   r   r   ZDH_set0_keyZ_dh_cdata_to_evp_pkeyÚ_DHPublicKey)r$   r   rG   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PKCS8r0   r"   r   r1   r   r   r   r#   r   r   r   r2   Z_private_key_bytesr<   )r$   r4   r5   Zencryption_algorithmr   r   r   r   Úprivate_bytes³   s2    ÿ
üþúz_DHPrivateKey.private_bytesN)r7   r8   r9   r%   Úpropertyr@   rH   rP   rR   rT   rU   r   r   r   r   r;   Y   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 )rQ   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   )rW   r-   r   r   r   r@   Ø   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&   rA   )r"   r   r   r   r   r#   r   r   r)   rE   r	   rF   r*   )r$   r'   r(   r   r+   rG   r   r   r   rC   Ü   s0      ÿýúz_DHPublicKey.public_numbersc                 C   s   t | j| jƒS r   rS   r-   r   r   r   rT   õ   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SubjectPublicKeyInfor0   r"   r   r1   r   r   r   r#   r   r   r   r2   Z_public_key_bytesr<   r3   r   r   r   Úpublic_bytesø   s0    ÿ
üþ    ÿz_DHPublicKey.public_bytesN)	r7   r8   r9   r%   rV   r@   rC   rT   rX   r   r   r   r   rQ   Ð   s   
rQ   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    r:   ZDHPrivateKeyWithSerializationr;   ZDHPublicKeyWithSerializationrQ   r   r   r   r   Ú<module>   s   
-
v
