3
ãdel  ã               @   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|| jjkƒ | jj|| j jƒ}| j j|ƒ}| j|dkƒ | j jrl| j j	||j
dƒ}n| j 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|||ƒ}|dk�r| jƒ }td|ƒ‚| jj||d ƒd d … S )Né   r   zsize_t *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%Cryptography_HAS_EVP_PKEY_SET_PEER_EXZEVP_PKEY_derive_set_peer_exZ	_evp_pkeyZEVP_PKEY_derive_set_peerÚnewZEVP_PKEY_deriveZ_consume_errorsÚ
ValueErrorÚbuffer)r   Zevp_pkeyZpeer_public_keyÚctxÚresZkeylenÚbufÚerrors© r   úa/var/www/agendate/envp3/lib/python3.6/site-packages/cryptography/hazmat/backends/openssl/utils.pyÚ_evp_pkey_derive   s*    


r   )ÚdataÚ	algorithmr   c             C   sL   t |tƒs(tj|ƒ}|j| ƒ |jƒ } 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   