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_ffiDHparams_dupopenssl_assertNULLgcDH_freeCRYPTOGRAPHY_IS_LIBRESSLnewDH_get0_pqgBN_dupDH_set0_pqg)dh_cdatar   libffiparam_cdataqq_dupres r   T/opt/certbot/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%   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   EncodingOpenSSH	TypeErrorParameterFormatPKCS3
ValueErrorr%   r   r   r   r   r&   r   Cryptography_HAS_EVP_PKEY_DHXr   r   UNSUPPORTED_SERIALIZATIONPEMPEM_write_bio_DHxparamsPEM_write_bio_DHparamsDERi2d_DHxparams_bioi2d_DHparams_bio_create_mem_bio_gcr   _read_mem_bio)r'   r3   r4   r   	write_biobior   r   r   r   parameter_bytes@   s:   
z_DHParameters.parameter_bytesNr   r   )__name__
__module____qualname__r(   r   r-   r/   DHPrivateKeyr2   r   r6   r9   bytesrH   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   BN_num_bits)r   r   r*   r   r   r   _get_dh_num_bitsk   s   rP   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   DH_size_key_size_bytesr'   r   r   evp_pkeyr   r   r   r(   s      z_DHPrivateKey.__init__r!   c                 C      t | j| jS r#   )rP   r%   r&   r1   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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_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_DHPublicKeyr8   r%   r   EVP_PKEY_CTX_newrR   r   r   r   r   EVP_PKEY_CTX_freeEVP_PKEY_derive_initEVP_PKEY_derive_set_peer_exchange_assertr   EVP_PKEY_derivebufferrT   len)r'   rd   ctxr   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%   _consume_errors_with_textr;   )r'   rv   errors_with_textr   r   r   rl      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   r^   r   r   r   DH_set0_key_dh_cdata_to_evp_pkeyrg   )r'   r   ra   pub_key_dupr   rV   r   r   r   
public_key   s   z_DHPrivateKey.public_keyc                 C   rX   r#   r$   r&   r%   r1   r   r   r   
parameters      z_DHPrivateKey.parametersr3   r4   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   r5   )r   PrivateFormatPKCS8r;   r%   r   r<   r   r   r   r&   r   r   r   r=   _private_key_bytesrR   )r'   r3   r4   r   r   r   r   r   private_bytes   s2   
z_DHPrivateKey.private_bytesrI   )rJ   rK   rL   r(   propertyintrY   r   r_   rc   DHPublicKeyrN   ru   boolrl   r|   DHParametersr~   r   r6   r   KeySerializationEncryptionr   r   r   r   r   rQ   r   s$    
$rQ   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 )rg   r   r   c                 C   s&   || _ || _|| _t| j | j| _d S r#   )r%   r&   rR   rP   _key_size_bitsrU   r   r   r   r(      rW   z_DHPublicKey.__init__r!   c                 C   s   | j S r#   )r   r1   r   r   r   rY     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)   rZ   )r%   r   r   r   r   r&   r   r   r,   r^   r   r`   r-   )r'   r*   r+   r   r.   ra   r   r   r   r\     s,   z_DHPublicKey.public_numbersc                 C   rX   r#   r}   r1   r   r   r   r~     r   z_DHPublicKey.parametersr3   r4   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   r5   )r   PublicFormatSubjectPublicKeyInfor;   r%   r   r<   r   r   r   r&   r   r   r   r=   _public_key_bytesrR   )r'   r3   r4   r   r   r   r   public_bytes"  s(   
z_DHPublicKey.public_bytesNrI   )rJ   rK   rL   r(   r   r   rY   r   r`   r\   r   r~   r   r6   r   rN   r   r   r   r   r   rg      s    
rg   rI   )r   r   r!   r"   )typingcryptography.exceptionsr   r   cryptography.hazmat.primitivesr   )cryptography.hazmat.primitives.asymmetricr   TYPE_CHECKING,cryptography.hazmat.backends.openssl.backendr   r    r$   r   r"   r   rP   rM   rQ   r   rg   r   r   r   r   <module>   s   

E 
