|
2 | 2 | #include <limits> |
3 | 3 | #include "hmac_cpp/hmac_utils.hpp" |
4 | 4 |
|
| 5 | +TEST(HOTPTest, RFC4226Vectors) { |
| 6 | + const std::string key = "12345678901234567890"; |
| 7 | + const int digits = 6; |
| 8 | + struct Case { uint64_t counter; int code; } cases[] = { |
| 9 | + {0, 755224}, {1, 287082}, {2, 359152}, {3, 969429}, {4, 338314}, |
| 10 | + {5, 254676}, {6, 287922}, {7, 162583}, {8, 399871}, {9, 520489}, |
| 11 | + }; |
| 12 | + for (const auto& c : cases) { |
| 13 | + EXPECT_EQ(hmac::get_hotp_code(key.data(), key.size(), c.counter, digits, hmac::TypeHash::SHA1), c.code); |
| 14 | + } |
| 15 | +} |
| 16 | + |
| 17 | +TEST(TOTPTest, RFC6238SHA1) { |
| 18 | + const std::string key = "12345678901234567890"; |
| 19 | + const int digits = 8; |
| 20 | + struct Case { uint64_t time; int code; } cases[] = { |
| 21 | + {59, 94287082}, {1111111109, 7081804}, {1111111111, 14050471}, |
| 22 | + {1234567890, 89005924}, {2000000000, 69279037}, {20000000000ULL, 65353130}, |
| 23 | + }; |
| 24 | + for (const auto& c : cases) { |
| 25 | + EXPECT_EQ(hmac::get_totp_code_at(key.data(), key.size(), c.time, 30, digits, hmac::TypeHash::SHA1), c.code); |
| 26 | + } |
| 27 | +} |
| 28 | + |
| 29 | +TEST(TOTPTest, RFC6238SHA256) { |
| 30 | + const std::string key = "12345678901234567890123456789012"; |
| 31 | + const int digits = 8; |
| 32 | + struct Case { uint64_t time; int code; } cases[] = { |
| 33 | + {59, 46119246}, {1111111109, 68084774}, {1111111111, 67062674}, |
| 34 | + {1234567890, 91819424}, {2000000000, 90698825}, {20000000000ULL, 77737706}, |
| 35 | + }; |
| 36 | + for (const auto& c : cases) { |
| 37 | + EXPECT_EQ(hmac::get_totp_code_at(key.data(), key.size(), c.time, 30, digits, hmac::TypeHash::SHA256), c.code); |
| 38 | + } |
| 39 | +} |
| 40 | + |
| 41 | +TEST(TOTPTest, RFC6238SHA512) { |
| 42 | + const std::string key = "1234567890123456789012345678901234567890123456789012345678901234"; |
| 43 | + const int digits = 8; |
| 44 | + struct Case { uint64_t time; int code; } cases[] = { |
| 45 | + {59, 90693936}, {1111111109, 25091201}, {1111111111, 99943326}, |
| 46 | + {1234567890, 93441116}, {2000000000, 38618901}, {20000000000ULL, 47863826}, |
| 47 | + }; |
| 48 | + for (const auto& c : cases) { |
| 49 | + EXPECT_EQ(hmac::get_totp_code_at(key.data(), key.size(), c.time, 30, digits, hmac::TypeHash::SHA512), c.code); |
| 50 | + } |
| 51 | +} |
| 52 | + |
5 | 53 | TEST(TotpBoundaryTest, EarlyTimestampValidatesCounterZero) { |
6 | 54 | std::string key = "12345678901234567890"; |
7 | 55 | int digits = 6; |
|
0 commit comments