o
    e                     @  sp   d dl mZ 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r/d dlmZ d dlmZ G dd	 d	ZdS )
    )annotationsN)InvalidSignatureUnsupportedAlgorithm_Reasons)constant_time)CBC)Backend)ciphersc                   @  sB   e Zd Z	dddd	ZdddZdddZdddZdddZdS )_CMACContextNbackendr   	algorithmciphers.BlockCipherAlgorithmreturnNonec           	      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.      )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_ffiNULLgcCMAC_CTX_freefrom_bufferZ	CMAC_Initlen_ctx)	selfr   r   ctxregistryadapterZ
evp_cipherZkey_ptrres r(   YD:\Projects\ConvertPro\env\Lib\site-packages\cryptography/hazmat/backends/openssl/cmac.py__init__   s4   

z_CMACContext.__init__databytesc                 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.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   Z
CMAC_Finalr"   r   buffer)r#   buflengthr'   r(   r(   r)   finalizeC   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)   copyM   s   
z_CMACContext.copy	signaturec                 C  s    |   }t||stdd S )NzSignature did not match digest.)r2   r   Zbytes_eqr   )r#   r4   digestr(   r(   r)   verifyV   s   z_CMACContext.verify)N)r   r   r   r   r   r   )r+   r,   r   r   )r   r,   )r   r
   )r4   r,   r   r   )__name__
__module____qualname__r*   r-   r2   r3   r6   r(   r(   r(   r)   r
      s    
(


	r
   )
__future__r   typingZcryptography.exceptionsr   r   r   Zcryptography.hazmat.primitivesr   Z,cryptography.hazmat.primitives.ciphers.modesr   TYPE_CHECKINGZ,cryptography.hazmat.backends.openssl.backendr   r	   r
   r(   r(   r(   r)   <module>   s   