U
    cc                     @   sd   d dl Z d dlmZmZmZ d dlmZ d dlmZ e j	rRd dlm
Z
 d dlmZ G dd dZdS )	    N)InvalidSignatureUnsupportedAlgorithm_Reasons)constant_time)CBC)ciphers)Backendc                   @   s\   e Zd ZdddddddZedddd	Zed
ddZd d
ddZeddddZdS )_CMACContextNr   zciphers.BlockCipherAlgorithm)backend	algorithmreturnc           	      C   s   | |stdtj|| _|j| _|| _|jd | _	|d kr| jj
}|t|tf }|| j|t}| jj }| j|| jjjk | jj|| jjj}| jj| j}| jj||t| j|| jjj}| j|dk || _d S )Nz#This backend does not support CMAC.      )Zcmac_algorithm_supportedr   r   ZUNSUPPORTED_CIPHER_backendkey_key
_algorithm
block_size_output_lengthZ_cipher_registrytyper   _libCMAC_CTX_newopenssl_assert_ffiZNULLgcCMAC_CTX_freefrom_bufferZ	CMAC_Initlen_ctx)	selfr
   r   ctxregistryadapterZ
evp_cipherZkey_ptrres r$   M/tmp/pip-unpacked-wheel-4layejjw/cryptography/hazmat/backends/openssl/cmac.py__init__   s4    
z_CMACContext.__init__)datar   c                 C   s,   | j j| j|t|}| j |dk d S )Nr   )r   r   ZCMAC_Updater   r   r   )r   r'   r#   r$   r$   r%   update=   s    z_CMACContext.update)r   c                 C   sd   | j jd| j}| j jd| j}| j j| j||}| j |dk d | _| j j|d d  S )Nzunsigned char[]zsize_t *r   )	r   r   newr   r   Z
CMAC_Finalr   r   buffer)r   buflengthr#   r$   r$   r%   finalizeA   s    z_CMACContext.finalizec                 C   sV   | j j }| j j|| j jj}| j j|| j}| j |dk t	| j | j
|dS )Nr   )r    )r   r   r   r   r   r   ZCMAC_CTX_copyr   r   r	   r   )r   Z
copied_ctxr#   r$   r$   r%   copyK   s     z_CMACContext.copy)	signaturer   c                 C   s    |   }t||stdd S )NzSignature did not match digest.)r-   r   Zbytes_eqr   )r   r/   digestr$   r$   r%   verifyT   s    z_CMACContext.verify)N)	__name__
__module____qualname__r&   bytesr(   r-   r.   r1   r$   r$   r$   r%   r	      s    (
	r	   )typingZcryptography.exceptionsr   r   r   Zcryptography.hazmat.primitivesr   Z,cryptography.hazmat.primitives.ciphers.modesr   TYPE_CHECKINGr   Z,cryptography.hazmat.backends.openssl.backendr   r	   r$   r$   r$   r%   <module>   s   