defgenerate_totp(secret: str, period: int=30, token_length: int=6) -> int: """Generate time-based one time password (TOTP) from the secret. Some HPCs use TOTP for two-factor authentication for safety. Parameters ---------- secret: str The encoded secret provided by the HPC. It's usually extracted from a 2D code and base32 encoded. period: int, default=30 Time period where the code is valid in seconds. token_length: int, default=6 The token length. Returns ------- token: int The generated token. """ timestamp = time.time() counter = int(timestamp) // period msg = struct.pack('>Q', counter) digest = hmac.new(base64.b32decode(secret), msg, hashlib.sha1).digest() ob = digest[19] pos = ob & 15 base = struct.unpack('>I', digest[pos:pos + 4])[0] & 0x7fffffff token = base % (10**token_length) returnstr(token).zfill(token_length)