19#include <openssl/evp.h>
20#include <openssl/hmac.h>
27 unsigned char challenge[8];
28 for (
int i = 8; i--; timestamp >>= 8)
29 challenge[i] = timestamp;
33 HMAC(EVP_sha1(), secret.data(), secret.size(), challenge, 8, digest, &digestSize);
35 uint32 offset = digest[19] & 0xF;
36 uint32 truncated = (digest[offset] << 24) | (digest[offset + 1] << 16) | (digest[offset + 2] << 8) | (digest[offset + 3]);
37 truncated &= 0x7FFFFFFF;
38 return (truncated % 1000000);
43 time_t now = time(
nullptr);
46 (token == GenerateToken(secret, now)) ||
static constexpr uint32 TOTP_INTERVAL
static constexpr uint32 HMAC_RESULT_SIZE
std::vector< uint8 > Secret
static bool ValidateToken(Secret const &key, uint32 token)
static uint32 GenerateToken(Secret const &key, time_t timestamp)