3 ꅭh� �@stddlmZmZmZddlmZddlmZmZm Z ddl m Z m Z m Z eje j�eje j�Gdd�de���ZdS)�)�absolute_import�division�print_function)�utils)�InvalidSignature�UnsupportedAlgorithm�_Reasons)� constant_time�hashes�macc@s@eZdZd dd�Zejd�Zdd�Zdd�Zd d �Z d d �Z dS)� _HMACContextNcCs�||_||_|dkr�|jjj�}|jj||jjjk�|jjj||jjj�}|jj |�}||jjjkrzt dj |j �t j��|jjj|�}|jjj||t|�||jjj�}|jj|dk�||_||_dS)Nz*{} is not a supported hash on this backendr)� _algorithm�_backend�_lib�Cryptography_HMAC_CTX_new�openssl_assert�_ffi�NULL�gc�Cryptography_HMAC_CTX_freeZ_evp_md_from_algorithmr�format�namerZUNSUPPORTED_HASH� from_bufferZ HMAC_Init_ex�len�_ctx�_key)�selfZbackend�key� algorithm�ctxZevp_mdZkey_ptr�res�r!�/usr/lib64/python3.6/hmac.py�__init__s&  z_HMACContext.__init__r cCsp|jjj�}|jj||jjjk�|jjj||jjj�}|jjj||j �}|jj|dk�t |j|j |j |d�S)Nr)r) rrrrrrrrZ HMAC_CTX_copyrr rr)rZ copied_ctxr r!r!r"�copy1s z_HMACContext.copycCs:|jjj|�}|jjj|j|t|��}|jj|dk�dS)Nr)rrrrZ HMAC_Updaterrr)r�dataZdata_ptrr r!r!r"�update=sz_HMACContext.updatecCsz|jjjd|jjj�}|jjjd�}|jjj|j||�}|jj|dk�|jj|d|jj k�|jjj |�d|d�S)Nzunsigned char[]zunsigned int *r) rr�newrZEVP_MAX_MD_SIZEZ HMAC_FinalrrrZ digest_size�buffer)rZbufZoutlenr r!r!r"�finalizeBsz_HMACContext.finalizecCs |j�}tj||�std��dS)NzSignature did not match digest.)r)r Zbytes_eqr)rZ signatureZdigestr!r!r"�verifyLs z_HMACContext.verify)N) �__name__� __module__� __qualname__r#rZread_only_propertyrr$r&r)r*r!r!r!r"r s     r N)Z __future__rrrZ cryptographyrZcryptography.exceptionsrrrZcryptography.hazmat.primitivesr r r Zregister_interfaceZ MACContextZ HashContext�objectr r!r!r!r"�s