U
    ÒZjÆ/  ã                   @   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   új/var/www/html/TRUCKING_PROJECT/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rŒd }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s€t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Cryptography_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_bytesA   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_bitsl   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$   t   s    z_DHPrivateKey.__init__r%   c                 C   s   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rŒd }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_errors_with_textr6   )r#   r[   Zerrors_with_textr   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   r`   ZKeySerializationEncryptionra   r   r   r   r   r@   s   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   )rg   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rŒd }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$   rb   rc   rE   r   rL   rH   rf   r^   r   r3   rh   r>   ri   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    rf   r   rc   r?   r=   r@   rd   rR   r   r   r   r   Ú<module>   s   E 
