U
    EZh/                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZ e jrBd dl	m
Z
 dddd	Zdd
d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 )    N)UnsupportedAlgorithm_Reasons)serialization)dh)Backendr   backendc                 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_cdatar   libffiparam_cdataqZq_dupres r   n/home/aprabhat/apps/x.techxrdev.in/venv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/dh.py_dh_params_dup   s    

r   _DHParameters)r   returnc                 C   s   t | |}t||S N)r   r   )r   r   r   r   r   r   _dh_cdata_to_parameters!   s    
r    c                   @   sP   e Zd Zd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 )r   r   r   c                 C   s   || _ || _d S r   )_backend	_dh_cdata)selfr   r   r   r   r   __init__'   s    z_DHParameters.__init__r   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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_key=   s    z"_DHParameters.generate_private_keyencodingformatr   c                 C   s&  |t jjkrtd|t jjk	r(td| jj	d}| jj
| j| jjj|| jjj |d | jjjkr| jj
jstdtj|t jjkr|d | jjjkr| jj
j}q| jj
j}n>|t jjkr|d | jjjkr| jj
j}q| jj
j}ntd| j }||| j}| j|dk | j|S )Nz!OpenSSH encoding is not supportedz%Only PKCS3 serialization is supportedr
   r   'DH X9.42 serialization is not supportedz/encoding must be an item from the Encoding enumr   )r   EncodingZOpenSSH	TypeErrorParameterFormatZPKCS3
ValueErrorr!   r   r   r   r   r"   r   Cryptography_HAS_EVP_PKEY_DHXr   r   UNSUPPORTED_SERIALIZATIONZPEMZPEM_write_bio_DHxparamsZPEM_write_bio_DHparamsZDERZi2d_DHxparams_bioZi2d_DHparams_bioZ_create_mem_bio_gcr   Z_read_mem_bio)r#   r0   r1   r   Z	write_bioZbior   r   r   r   parameter_bytes@   s@       
z_DHParameters.parameter_bytesN)__name__
__module____qualname__r$   r   r*   r,   DHPrivateKeyr.   r   r3   r5   bytesr9   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_bitsk   s    r?   c                   @   s   e Zd ZddddZeedddZejddd	Z	ej
ed
ddZed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 )_DHPrivateKeyr   r   c                 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   s    z_DHPrivateKey.__init__r%   c                 C   s   t | j| jS r   )r?   r!   r"   r-   r   r   r   key_sizey   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_numbers}   s2    z_DHPrivateKey.private_numbers)peer_public_keyr   c                 C   sV  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rRd| | }|S )Nz%peer_public_key must be a DHPublicKeyr   zsize_t *r   zunsigned char[]    )
isinstance_DHPublicKeyr4   r!   r   ZEVP_PKEY_CTX_newrA   r   r   r   r   ZEVP_PKEY_CTX_freeZEVP_PKEY_derive_initZEVP_PKEY_derive_set_peer_exchange_assertr   ZEVP_PKEY_derivebufferrB   len)r#   rO   ctxr   Zkeylenbufkeypadr   r   r   exchange   s>    
    
z_DHPrivateKey.exchangeN)okr   c                 C   s   |s| j  }td|d S )NzError computing shared key.)r!   Z_consume_errorsr6   )r#   r[   errorsr   r   r   rS      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   rJ   r   r   r   ZDH_set0_keyZ_dh_cdata_to_evp_pkeyrR   )r#   r   rM   Zpub_key_dupr   rD   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)r0   r1   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   r2   )r   PrivateFormatZPKCS8r6   r!   r   r7   r   r   r   r"   r   r   r   r8   Z_private_key_bytesrA   )r#   r0   r1   r`   r   r   r   r   private_bytes   s2    
z_DHPrivateKey.private_bytes)r:   r;   r<   r$   propertyintrE   r   rK   rN   DHPublicKeyr>   rZ   boolrS   r]   DHParametersr_   r   r3   ra   ZKeySerializationEncryptionrb   r   r   r   r   r@   r   s   $r@   c                   @   sb   e Zd Zdd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 )rR   r   r   c                 C   s&   || _ || _|| _t| j | j| _d S r   )r!   r"   rA   r?   _key_size_bitsrC   r   r   r   r$      s    z_DHPublicKey.__init__r%   c                 C   s   | j S r   )rh   r-   r   r   r   rE     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&   rF   )r!   r   r   r   r   r"   r   r   r)   rJ   r   rL   r*   )r#   r'   r(   r   r+   rM   r   r   r   rH     s0      z_DHPublicKey.public_numbersc                 C   s   t | j| jS r   r^   r-   r   r   r   r_     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   r2   )r   PublicFormatZSubjectPublicKeyInfor6   r!   r   r7   r   r   r   r"   r   r   r   r8   Z_public_key_bytesrA   )r#   r0   r1   r   r   r   r   public_bytes"  s0    
    z_DHPublicKey.public_bytesN)r:   r;   r<   r$   rc   rd   rE   r   rL   rH   rg   r_   r   r3   ri   r>   rj   r   r   r   r   rR      s   rR   )typingZcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r   r    rg   r   rd   r?   r=   r@   re   rR   r   r   r   r   <module>   s   E 
