U
�e�]# � @ sd d dl mZmZmZ d dlZd dlmZ d dlmZ d dl m
Z
dd� Zdd � Zd
d� Z
dd
� ZdS )� )�absolute_import�division�print_functionN)�utils)�hashes)� Prehashedc C s� | j �|| jj�}| �|| jjk� | j�|| j j�}| j �|�}| �|dk� | j �||j �}| �|dk� | j�
d�}| j �|| jj|�}| �|dk� | �|d dk� | j�
d|d �}| j �|||�}|dkr�td��| j�
||d �d d � S )N� zsize_t *r zunsigned char[]z1Null shared key derived from public/private pair.)Z_libZEVP_PKEY_CTX_newZ_ffiZNULLZopenssl_assert�gcZEVP_PKEY_CTX_freeZEVP_PKEY_derive_initZEVP_PKEY_derive_set_peerZ _evp_pkey�newZEVP_PKEY_derive�
ValueError�buffer)�backendZevp_pkeyZpeer_public_keyZctx�resZkeylenZbuf� r �L/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/utils.py�_evp_pkey_derive s* ��r c C sN t |t�s*t�|| �}|�|� |�� }n|j}t|�|jkrFt d��||fS )NzNThe provided data must be the same length as the hash algorithm's digest size.)
�
isinstancer r ZHash�update�finalizeZ
_algorithm�lenZdigest_sizer )r
�data� algorithmZhash_ctxr r r �_calculate_digest_and_algorithm&