3
ꅭhV � @ sp d dl mZmZmZ d dlmZ d dlmZmZm Z d dl
mZmZ d dl
mZ ejej�G dd� de��ZdS ) � )�absolute_import�division�print_function)�utils)�InvalidSignature�UnsupportedAlgorithm�_Reasons)�
constant_time�mac)�CBCc @ s@ e Zd Zd
dd�Zejd�Zdd� Zdd� Zd d
� Z dd� Z
dS )�_CMACContextNc C s� |j |�stdtj��|| _|j| _|| _|jd | _ |d kr�| jj
}|t|�tf }|| j|t�}| jj
j� }| jj|| jjjk� | jjj|| jj
j�}| jjj| j�}| jj
j||t| j�|| jjj�}| jj|dk� || _d S )Nz#This backend does not support CMAC.� � )Zcmac_algorithm_supportedr r ZUNSUPPORTED_CIPHER�_backend�keyZ_key�
_algorithmZ
block_size�_output_lengthZ_cipher_registry�typer �_lib�CMAC_CTX_new�openssl_assert�_ffiZNULL�gc�
CMAC_CTX_freeZfrom_bufferZ CMAC_Init�len�_ctx) �selfZbackend� algorithm�ctx�registryZadapterZ
evp_cipherZkey_ptr�res� r! �/usr/lib64/python3.6/cmac.py�__init__ s0
z_CMACContext.__init__r c C s, | j jj| j|t|��}| j j|dk� d S )Nr )r r ZCMAC_Updater r r )r �datar r! r! r" �update9 s z_CMACContext.updatec C sd | j jjd| j�}| j jjd| j�}| j jj| j||�}| j j|dk� d | _| j jj|�d d � S )Nzunsigned char[]zsize_t *r ) r r �newr r Z
CMAC_Finalr r �buffer)r ZbufZlengthr r! r! r" �finalize= s z_CMACContext.finalizec C sV | j jj� }| j jj|| j jj�}| j jj|| j�}| j j|dk� 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" �copyG s z_CMACContext.copyc C s | j � }tj||�std��d S )NzSignature did not match digest.)r( r Zbytes_eqr )r Z signatureZdigestr! r! r" �verifyP s z_CMACContext.verify)N)�__name__�
__module__�__qualname__r# r Zread_only_propertyr r% r( r) r* r! r! r! r" r s
#
r N)Z
__future__r r r Zcryptographyr Zcryptography.exceptionsr r r Zcryptography.hazmat.primitivesr r
Z,cryptography.hazmat.primitives.ciphers.modesr Zregister_interfaceZ
MACContext�objectr r! r! r! r" �