U
    [eE)                     @   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
ed
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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   i/var/www/html/services/stratfitenv/lib/python3.8/site-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                   @   sJ   e Zd Zdd ZejdddZejdddZe	j
e	jed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rd }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_key8   s    z"_DHParameters.generate_private_keyencodingformatr#   c                 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   ParameterFormatZPKCS3
ValueErrorr   r	   Cryptography_HAS_EVP_PKEY_DHXr
   r   r   r   r   r   r   UNSUPPORTED_SERIALIZATIONZ_parameter_bytesr    r.   r/   r   r   r   r   parameter_bytes;   s     
z_DHParameters.parameter_bytesN)__name__
__module____qualname__r!   r   r(   r*   DHPrivateKeyr,   r   Encodingr1   bytesr6   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   ZBN_num_bits)r   r   r%   r   r   r   _get_dh_num_bitsS   s    r=   c                   @   s   e Zd Zdd ZeedddZejdddZ	ej
edd	d
Zej
dddZejdddZejejejed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__r"   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rd }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_keyZpriv_keyr   r   r   private_numberse   s2    z_DHPrivateKey.private_numbers)peer_public_keyr#   c                 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rd| | }|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	   rH   r   r   r   ZDH_compute_keyZ_consume_errors_with_textr2   bufferlen)r    rM   bufrK   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	   rH   r   r   r   ZDH_set0_keyZ_dh_cdata_to_evp_pkey_DHPublicKey)r    r   rK   Zpub_key_dupr   rB   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.parameters)r.   r/   encryption_algorithmr#   c                 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   r0   )r   PrivateFormatZPKCS8r2   r   r	   r3   r
   r   r   r   r   r   r   r4   Z_private_key_bytesr?   )r    r.   r/   rZ   r   r   r   r   private_bytes   s2    
z_DHPrivateKey.private_bytesN)r7   r8   r9   r!   propertyintrC   r   rI   rL   DHPublicKeyr<   rU   rW   DHParametersrY   r   r;   r[   ZKeySerializationEncryptionr\   r   r   r   r   r>   Z   s   r>   c                   @   s\   e Zd Zdd ZeedddZejdddZ	ej
ddd	Zejejed
ddZdS )rV   c                 C   s&   || _ || _|| _t| j | j| _d S r   )r   r   r?   r=   _key_size_bitsrA   r   r   r   r!      s    z_DHPublicKey.__init__r"   c                 C   s   | j S r   )ra   r+   r   r   r   rC      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rd }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$   rD   )r   r
   r   r	   r   r   r   r   r'   rH   r   rJ   r(   )r    r%   r&   r   r)   rK   r   r   r   rF      s0      z_DHPublicKey.public_numbersc                 C   s   t | j| jS r   rX   r+   r   r   r   rY      s    z_DHPublicKey.parametersr-   c                 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   r0   )r   PublicFormatZSubjectPublicKeyInfor2   r   r	   r3   r
   r   r   r   r   r   r   r4   Z_public_key_bytesr?   r5   r   r   r   public_bytes   s0    
    z_DHPublicKey.public_bytesN)r7   r8   r9   r!   r]   r^   rC   r   rJ   rF   r`   rY   r   r;   rb   r<   rc   r   r   r   r   rV      s   rV   N)Zcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r`   r   r^   r=   r:   r>   r_   rV   r   r   r   r   <module>   s   1|