o
    c/                     @   s   d dl Z d dlmZmZ d dlmZ d dlmZ e jr!d dl	m
Z
 ddd	Zd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 )    N)UnsupportedAlgorithm_Reasons)serialization)dh)Backendbackendr   c                 C   s   |j }|j}|| }|||jk |||j}|jrD|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   Kusr/lib/python3.10/site-packages/cryptography/hazmat/backends/openssl/dh.py_dh_params_dup   s   

r   return_DHParametersc                 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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   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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    Zgenerate_dh_private_keyr"   r   r   r   generate_private_key>   s   z"_DHParameters.generate_private_keyencodingformatc                 C   s&  |t jju r
td|t jjurtd| jj	d}| jj
| j| jjj|| jjj |d | jjjkr@| jj
js@tdtj|t jju r[|d | jjjkrU| jj
j}n%| jj
j}n|t jju rv|d | jjjkrp| jj
j}n
| 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Cryptography_i2d_DHxparams_bioZi2d_DHparams_bioZ_create_mem_bio_gcr   Z_read_mem_bio)r"   r-   r.   r   Z	write_biobior   r   r   r   parameter_bytesA   s8   
z_DHParameters.parameter_bytesNr   r   )__name__
__module____qualname__r#   r   r(   r*   DHPrivateKeyr,   r   r0   r2   bytesr7   r   r   r   r   r   '   s    
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_bitsl   s   r>   c                   @   s   e Zd Zd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edd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jdef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#   t      z_DHPrivateKey.__init__r   c                 C      t | j| jS r   )r>   r    r!   r+   r   r   r   key_sizez   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_keyZpriv_keyr   r   r   private_numbers~   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_DHPublicKeyr1   r    r   ZEVP_PKEY_CTX_newr@   r   r   r   r   ZEVP_PKEY_CTX_freeZEVP_PKEY_derive_initZEVP_PKEY_derive_set_peer_exchange_assertr   ZEVP_PKEY_derivebufferrA   len)r"   rP   ctxr   Zkeylenbufkeypadr   r   r   exchange   s6   
z_DHPrivateKey.exchangeokNc                 C   s   |s| j  }td|d S )NzError computing shared key.)r    Z_consume_errors_with_textr3   )r"   r\   Zerrors_with_textr   r   r   rT      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   rK   r   r   r   ZDH_set0_keyZ_dh_cdata_to_evp_pkeyrS   )r"   r   rN   Zpub_key_dupr   rC   r   r   r   
public_key   s   z_DHPrivateKey.public_keyc                 C   rE   r   r   r!   r    r+   r   r   r   
parameters      z_DHPrivateKey.parametersr-   r.   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   r/   )r   PrivateFormatZPKCS8r3   r    r   r4   r   r   r   r!   r   r   r   r5   Z_private_key_bytesr@   )r"   r-   r.   ra   r   r   r   r   private_bytes   s2   
z_DHPrivateKey.private_bytesr8   )r9   r:   r;   r#   propertyintrF   r   rL   rO   DHPublicKeyr=   r[   boolrT   r]   DHParametersr_   r   r0   rb   ZKeySerializationEncryptionrc   r   r   r   r   r?   s   s$    
$r?   c                   @   sb   e Zd Zd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 )rS   r   r   c                 C   s&   || _ || _|| _t| j | j| _d S r   )r    r!   r@   r>   _key_size_bitsrB   r   r   r   r#      rD   z_DHPublicKey.__init__r   c                 C   s   | j S r   )ri   r+   r   r   r   rF     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$   rG   )r    r   r   r   r   r!   r   r   r'   rK   r   rM   r(   )r"   r%   r&   r   r)   rN   r   r   r   rI     s,   z_DHPublicKey.public_numbersc                 C   rE   r   r^   r+   r   r   r   r_      r`   z_DHPublicKey.parametersr-   r.   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   r/   )r   PublicFormatZSubjectPublicKeyInfor3   r    r   r4   r   r   r   r!   r   r   r   r5   Z_public_key_bytesr@   )r"   r-   r.   r   r   r   r   public_bytes#  s(   
z_DHPublicKey.public_bytesNr8   )r9   r:   r;   r#   rd   re   rF   r   rM   rI   rh   r_   r   r0   rj   r=   rk   r   r   r   r   rS      s    
rS   r8   )r   r   r   r   )typingZcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r   r   rh   r   re   r>   r<   r?   rf   rS   r   r   r   r   <module>   s   

E 
