3 l�_w �@s�ddlmZmZmZddlZddlZddlmZmZddl m Z ddl m Z ddl mZmZddlmZmZmZddlmZdd lmZGd d �d e�ZdS) �)�absolute_import�division�print_functionN)�UnsupportedAlgorithm�_Reasons)� _get_backend)� HMACBackend)� constant_time�hmac)�SHA1�SHA256�SHA512)� InvalidToken)� _generate_uric@s6eZdZd dd�Zdd�Zdd�Zd d �Zd d �ZdS)�HOTPNTcCs�t|�}t|t�stdtj��t|�dkr:|dkr:td��t|tj �sNt d��|dks^|dkrftd��t|t t t f�s~t d ��||_||_||_||_dS) Nz.Backend object does not implement HMACBackend.�Tz'Key length has to be at least 128 bits.z)Length parameter must be an integer type.��z(Length of HOTP has to be between 6 to 8.z)Algorithm must be SHA1, SHA256 or SHA512.)r� isinstancerrrZBACKEND_MISSING_INTERFACE�len� ValueError�sixZ integer_types� TypeErrorr r r �_key�_length� _algorithm�_backend)�self�keyZlength� algorithmZbackendZenforce_key_length�r �/usr/lib64/python3.6/hotp.py�__init__s"  z HOTP.__init__cCs*|j|�}|d|j}dj||j�j�S)N� z{0:0{1}})�_dynamic_truncater�format�encode)r�counterZtruncated_value�hotpr r r!�generate0s z HOTP.generatecCstj|j|�|�std��dS)Nz#Supplied HOTP value does not match.)r Zbytes_eqr)r)rr(r'r r r!�verify5sz HOTP.verifycCsjtj|j|j|j�}|jtjd|��|j�}t j |t |�d�d@}|||d�}tj d|�dd@S)Nz>Q���z>Iri���) r ZHMACrrr�update�struct�pack�finalizerZ indexbytesr�unpack)rr'ZctxZ hmac_value�offset�pr r r!r$9s zHOTP._dynamic_truncatecCst|d||dt|�fg�S)Nr(r')r�int)rZ account_namer'Zissuerr r r!�get_provisioning_uriBszHOTP.get_provisioning_uri)NT)�__name__� __module__� __qualname__r"r)r*r$r6r r r r!rs   r)Z __future__rrrr/rZcryptography.exceptionsrrZcryptography.hazmat.backendsrZ'cryptography.hazmat.backends.interfacesrZcryptography.hazmat.primitivesr r Z%cryptography.hazmat.primitives.hashesr r r Z(cryptography.hazmat.primitives.twofactorrZ.cryptography.hazmat.primitives.twofactor.utilsr�objectrr r r r!�s