o
    îRµiÉ+  ã                   @   s€   d dl mZmZ d dlmZ d dlmZ dd„ Zdd„ ZG dd	„ d	ej	ƒZ
d
efdd„ZG dd„ dejƒZG dd„ dejƒZdS )é    )ÚUnsupportedAlgorithmÚ_Reasons)Úserialization)Údhc                 C   sŒ   |j }|j}| | ¡}| ||jk¡ | ||j¡}|jrD| d¡}| 	| |j||j¡ | 
|d ¡}| ||j||j¡}| |dk¡ |S ©Nú	BIGNUM **r   é   )Ú_libÚ_ffiÚDHparams_dupÚopenssl_assertÚNULLÚgcÚDH_freeÚCRYPTOGRAPHY_IS_LIBRESSLÚnewÚDH_get0_pqgÚBN_dupÚDH_set0_pqg)Údh_cdataÚbackendÚlibÚffiÚparam_cdataÚqÚ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                   @   sN   e Zd Z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S )r!   c                 C   s   || _ || _d S r    )Ú_backendÚ	_dh_cdata)Úselfr   r   r   r   r   Ú__init__#   s   
z_DHParameters.__init__Úreturnc                 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rFd }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#   Úgenerate_dh_private_key©r%   r   r   r   Úgenerate_private_key8   s   z"_DHParameters.generate_private_keyÚencodingÚformatc                 C   s~   |t jjur
tdƒ‚| jjjs6| jj d¡}| jj 	| j
| jjj|| jjj¡ |d | jjjkr6tdtjƒ‚| j ||| j
¡S )Nz%Only PKCS3 serialization is supportedr   r   ú'DH X9.42 serialization is not supported)r   ÚParameterFormatÚPKCS3Ú
ValueErrorr#   r	   ÚCryptography_HAS_EVP_PKEY_DHXr
   r   r   r$   r   r   r   ÚUNSUPPORTED_SERIALIZATIONÚ_parameter_bytes©r%   r2   r3   r   r   r   r   Úparameter_bytes;   s    
üþz_DHParameters.parameter_bytesN)Ú__name__Ú
__module__Ú__qualname__r&   r   r,   r.   ÚDHPrivateKeyr1   r   ÚEncodingr5   Úbytesr<   r   r   r   r   r!   "   s    þýür!   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   ÚBN_num_bits)r   r   r)   r   r   r   Ú_get_dh_num_bitsS   s   rD   c                   @   s’   e Zd Zdd„ Zedefdd„ƒZdejfdd„Z	dej
defd	d
„Z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S )Ú_DHPrivateKeyc                 C   s&   || _ || _|| _| j j |¡| _d S r    )r#   r$   Ú	_evp_pkeyr	   ÚDH_sizeÚ_key_size_bytes©r%   r   r   Úevp_pkeyr   r   r   r&   [   ó   z_DHPrivateKey.__init__r'   c                 C   ó   t | j| jƒS r    )rD   r#   r$   r0   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rFd }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   ÚDHPrivateNumbersÚDHPublicNumbersr,   )r%   r)   r*   r   r-   Úpub_keyÚpriv_keyr   r   r   Úprivate_numberse   s2   ýú÷z_DHPrivateKey.private_numbersÚpeer_public_keyc                 C   sT  t |tƒs	tdƒ‚| jj | j| jjj¡}| j 	|| jjjk¡ | jj 
|| jjj¡}| jj |¡}| j 	|dk¡ | jj ||j¡}|  |dk¡ | jj d¡}| jj || jjj|¡}|  |dk¡ | j 	|d dk¡ | jj d|d ¡}| jj |||¡}| j 	|dk¡ | jj ||d ¡d d … }| jt|ƒ }|dkr¨d| | }|S )Nz%peer_public_key must be a DHPublicKeyr   zsize_t *r   zunsigned char[]ó    )Ú
isinstanceÚ_DHPublicKeyÚ	TypeErrorr#   r	   ÚEVP_PKEY_CTX_newrF   r
   r   r   r   ÚEVP_PKEY_CTX_freeÚEVP_PKEY_derive_initÚEVP_PKEY_derive_set_peerÚ_exchange_assertr   ÚEVP_PKEY_deriveÚbufferrH   Úlen)r%   rX   Úctxr   ÚkeylenÚbufÚkeyÚpadr   r   r   Úexchange�   s6   
ÿÿÿz_DHPrivateKey.exchangec                 C   s   |s| j  ¡ }td|ƒ‚d S )NzError computing shared key.)r#   Ú_consume_errors_with_textr7   )r%   ÚokÚerrors_with_textr   r   r   ra   ¥   s   
þþz_DHPrivateKey._exchange_assertc                 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	   rR   r   r   r   ÚDH_set0_keyÚ_dh_cdata_to_evp_pkeyr[   )r%   r   rU   Úpub_key_dupr   rJ   r   r   r   Ú
public_key­   s   ÿÿz_DHPrivateKey.public_keyc                 C   rL   r    ©r"   r$   r#   r0   r   r   r   Ú
parameters¾   ó   z_DHPrivateKey.parametersr2   r3   Úencryption_algorithmc                 C   s†   |t jjur
tdƒ‚| jjjs6| jj d¡}| jj 	| j
| jjj|| jjj¡ |d | jjjkr6tdtjƒ‚| j |||| | j| j
¡S )Nz0DH private keys support only PKCS8 serializationr   r   r4   )r   ÚPrivateFormatÚPKCS8r7   r#   r	   r8   r
   r   r   r$   r   r   r   r9   Ú_private_key_bytesrF   )r%   r2   r3   ru   r   r   r   r   Úprivate_bytesÁ   s2   ÿ
üþúz_DHPrivateKey.private_bytesN)r=   r>   r?   r&   ÚpropertyÚintrM   r   rS   rW   ÚDHPublicKeyrB   rj   ra   rq   ÚDHParametersrs   r   rA   rv   ÚKeySerializationEncryptionry   r   r   r   r   rE   Z   s$    $þýüûrE   c                   @   s`   e Zd Zdd„ Ze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S )r[   c                 C   s&   || _ || _|| _t| j | jƒ| _d S r    )r#   r$   rF   rD   Ú_key_size_bitsrI   r   r   r   r&   ä   rK   z_DHPublicKey.__init__r'   c                 C   s   | j S r    )r   r0   r   r   r   rM   ê   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rFd }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(   rN   )r#   r
   r   r	   r   r$   r   r   r+   rR   r   rT   r,   )r%   r)   r*   r   r-   rU   r   r   r   rP   î   s,   ÿýúz_DHPublicKey.public_numbersc                 C   rL   r    rr   r0   r   r   r   rs     rt   z_DHPublicKey.parametersr2   r3   c                 C   s‚   |t jjur
tdƒ‚| jjjs6| jj d¡}| jj 	| j
| jjj|| jjj¡ |d | jjjkr6tdtjƒ‚| j ||| | jd ¡S )Nz>DH public keys support only SubjectPublicKeyInfo serializationr   r   r4   )r   ÚPublicFormatÚSubjectPublicKeyInfor7   r#   r	   r8   r
   r   r   r$   r   r   r   r9   Ú_public_key_bytesrF   r;   r   r   r   Úpublic_bytes
  s(   ÿ
üþÿz_DHPublicKey.public_bytesN)r=   r>   r?   r&   rz   r{   rM   r   rT   rP   r}   rs   r   rA   r€   rB   rƒ   r   r   r   r   r[   ã   s    þýür[   N)Úcryptography.exceptionsr   r   Úcryptography.hazmat.primitivesr   Ú)cryptography.hazmat.primitives.asymmetricr   r   r"   r}   r!   r{   rD   r@   rE   r|   r[   r   r   r   r   Ú<module>   s   1 
