o
    ge+                     @   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rd| | }|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 
