59 lines
1.7 KiB
Python
59 lines
1.7 KiB
Python
|
|
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
|
||
|
|
)
|