o
    -&%a                     @   sL   d dl mZ d dlmZmZmZ d dlmZ d dlm	Z	 G dd de
ZdS )    )utils)InvalidSignatureUnsupportedAlgorithm_Reasons)constant_time)CBCc                   @   s\   e Zd ZdddZedZdeddfddZdefd	d
Z	dddZ
deddfddZdS )_CMACContextNc           	      C   s   | |stdtj|| _|j| _|| _|jd | _	|d u ro| 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.      )cmac_algorithm_supportedr   r   UNSUPPORTED_CIPHER_backendkey_key
_algorithm
block_size_output_length_cipher_registrytyper   _libCMAC_CTX_newopenssl_assert_ffiNULLgcCMAC_CTX_freefrom_buffer	CMAC_Initlen_ctx)	selfbackend	algorithmctxregistryadapter
evp_cipherkey_ptrres r)   K/usr/lib/python3/dist-packages/cryptography/hazmat/backends/openssl/cmac.py__init__   s4   

z_CMACContext.__init__r   datareturnc                 C   s,   | j j| j|t|}| j |dk d S )Nr
   )r   r   CMAC_Updater   r   r   )r    r,   r(   r)   r)   r*   update6   s   z_CMACContext.updatec                 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   
CMAC_Finalr   r   buffer)r    buflengthr(   r)   r)   r*   finalize:   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   CMAC_CTX_copyr   r   r   r   )r    
copied_ctxr(   r)   r)   r*   copyD   s   
z_CMACContext.copy	signaturec                 C   s    |   }t||stdd S )NzSignature did not match digest.)r5   r   bytes_eqr   )r    r9   digestr)   r)   r*   verifyM   s   z_CMACContext.verify)N)r-   r   )__name__
__module____qualname__r+   r   read_only_propertyr"   bytesr/   r5   r8   r<   r)   r)   r)   r*   r      s    

#

	r   N)cryptographyr   cryptography.exceptionsr   r   r   cryptography.hazmat.primitivesr   ,cryptography.hazmat.primitives.ciphers.modesr   objectr   r)   r)   r)   r*   <module>   s
   