o
    b+                     @   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_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   f/var/www/secure340b-portal/env/lib/python3.10/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                   @   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   Z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   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   Encodingr/   bytesr4   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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	   ZDH_size_key_size_bytesr    r   r   evp_pkeyr   r   r   r!   [      z_DHPrivateKey.__init__r"   c                 C      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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_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	   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bufferr>   len)r    rM   ctxr   Z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   Z_consume_errors_with_textr0   )r    okZerrors_with_textr   r   r   rR      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	   rH   r   r   r   ZDH_set0_keyZ_dh_cdata_to_evp_pkeyrP   )r    r   rK   Zpub_key_dupr   r@   r   r   r   
public_key   s   z_DHPrivateKey.public_keyc                 C   rB   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PKCS8r0   r   r	   r1   r
   r   r   r   r   r   r   r2   Z_private_key_bytesr=   )r    r,   r-   r_   r   r   r   r   private_bytes   s2   
z_DHPrivateKey.private_bytesN)r5   r6   r7   r!   propertyintrC   r   rI   rL   DHPublicKeyr:   rY   rR   r[   DHParametersr]   r   r9   r`   ZKeySerializationEncryptionra   r   r   r   r   r<   Z   s$    $r<   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 )rP   c                 C   s&   || _ || _|| _t| j | j| _d S r   )r   r   r=   r;   _key_size_bitsr?   r   r   r   r!      rA   z_DHPublicKey.__init__r"   c                 C   s   | j S r   )rf   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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#   rD   )r   r
   r   r	   r   r   r   r   r&   rH   r   rJ   r'   )r    r$   r%   r   r(   rK   r   r   r   rF      s,   z_DHPublicKey.public_numbersc                 C   rB   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SubjectPublicKeyInfor0   r   r	   r1   r
   r   r   r   r   r   r   r2   Z_public_key_bytesr=   r3   r   r   r   public_bytes
  s(   
z_DHPublicKey.public_bytesN)r5   r6   r7   r!   rb   rc   rC   r   rJ   rF   re   r]   r   r9   rg   r:   rh   r   r   r   r   rP      s    rP   N)Zcryptography.exceptionsr   r   Zcryptography.hazmat.primitivesr   Z)cryptography.hazmat.primitives.asymmetricr   r   r   re   r   rc   r;   r8   r<   rd   rP   r   r   r   r   <module>   s   1 
