U
    §òcc¹  ã                   @   sp   d dl Z d dlmZ d dlmZ e jr2d dlmZ dedœdd„Z	ee j
eejf e jeejf d	œd
d„ZdS )é    N)Úhashes)Ú	Prehashed)ÚBackendr   )ÚbackendÚreturnc                 C   s  | j  || jj¡}|  || jjk¡ | j || j j¡}| j  |¡}|  |dk¡ | j  ||j	¡}|  |dk¡ | j 
d¡}| j  || jj|¡}|  |dk¡ |  |d dk¡ | j 
d|d ¡}| j  |||¡}|dkrê|  ¡ }td|ƒ‚| j ||d ¡d d … S )Né   zsize_t *r   zunsigned char[]zError computing shared key.)Z_libZEVP_PKEY_CTX_newZ_ffiZNULLZopenssl_assertÚgcZEVP_PKEY_CTX_freeZEVP_PKEY_derive_initZEVP_PKEY_derive_set_peerZ	_evp_pkeyÚnewZEVP_PKEY_deriveZ_consume_errors_with_textÚ
ValueErrorÚbuffer)r   Zevp_pkeyZpeer_public_keyÚctxÚresZkeylenÚbufZerrors_with_text© r   úd/var/www/html/project/venv/lib/python3.8/site-packages/cryptography/hazmat/backends/openssl/utils.pyÚ_evp_pkey_derive   s"    
r   )ÚdataÚ	algorithmr   c                 C   sL   t |tƒs(t |¡}| | ¡ | ¡ } n|j}t| ƒ|jkrDt	dƒ‚| |fS )NzNThe provided data must be the same length as the hash algorithm's digest size.)
Ú
isinstancer   r   ZHashÚupdateÚfinalizeÚ
_algorithmÚlenÚdigest_sizer
   )r   r   Zhash_ctxr   r   r   Ú_calculate_digest_and_algorithm#   s    



ÿr   )ÚtypingZcryptography.hazmat.primitivesr   Z/cryptography.hazmat.primitives.asymmetric.utilsr   ÚTYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   Úbytesr   ÚUnionZHashAlgorithmÚTupler   r   r   r   r   Ú<module>   s   ý