from __future__ import absolute_import, division, print_function, unicode_literals from . import utils from .otp import OTP from .compat import str class HOTP(OTP): """ Handler for HMAC-based OTP counters. """ def at(self, count): """ Generates the OTP for the given count. :param count: the OTP HMAC counter :type count: int :returns: OTP :rtype: str """ return self.generate_otp(count) def verify(self, otp, counter): """ Verifies the OTP passed in against the current counter OTP. :param otp: the OTP to check against :type otp: str :param count: the OTP HMAC counter :type count: int """ return utils.strings_equal(str(otp), str(self.at(counter))) def provisioning_uri(self, name, initial_count=0, issuer_name=None): """ Returns the provisioning URI for the OTP. This can then be encoded in a QR Code and used to provision an OTP app like Google Authenticator. See also: https://github.com/google/google-authenticator/wiki/Key-Uri-Format :param name: name of the user account :type name: str :param initial_count: starting HMAC counter value, defaults to 0 :type initial_count: int :param issuer_name: the name of the OTP issuer; this will be the organization title of the OTP entry in Authenticator :returns: provisioning URI :rtype: str """ return utils.build_uri( self.secret, name, initial_count=initial_count, issuer_name=issuer_name, algorithm=self.digest().name, digits=self.digits )