OTP library for C (All MCU)(Pure C)
Library to generate Time-based One-Time Passwords.
Implements the Time-based One-Time Password algorithm specified in RFC 6238. Supports different time steps and is compatible with tokens that use the same standard (including software ones, like the Google Authenticator app).
Tested on MCUs: MSP430, RP2040
First include header to your file
#include <totp.h>
After included, define key ex. Key is MyLegoDoor
uint8_t hmacKey[] = {0x4d, 0x79, 0x4c, 0x65, 0x67, 0x6f, 0x44, 0x6f, 0x6f, 0x72}; // Secret key
Instantiate the TOTP class by providing the secret hmacKey, the length of the hmacKey and the Timestep between codes.
TOTP(hmacKey, 10, 30); // Secret key, Secret key length, Timestep (30s)
Use the getCodeFromTimestamp()
function to get a TOTP from a unix epoch timestamp
uint32_t newCode = getCodeFromTimestamp(1557414000); // Current timestamp since Unix epoch in seconds
Or getCodeFromTimeStruct()
if you want to get a TOTP from a tm struct (Time Struct in C),
struct tm datetime;
datetime.tm_hour = 9;
datetime.tm_min = 0;
datetime.tm_sec = 0;
datetime.tm_mday = 13;
datetime.tm_mon = 5;
datetime.tm_year = 2019;
uint32_t newCode = getCodeFromTimeStruct(datetime);
If the provided unix timestamp isn't in UTC±0, use setTimezone()
before getCodeFromTimestamp()
or getCodeFromTimeStruct()
to offset the time.
setTimezone(9); // Set timezone +9 Japan
You can see an example in blink.c