Sample code for 30+ languages & platforms
Unicode C

TOTP Authenticator: Duplicate Results of Online Tools

See more Encryption Examples

Duplicates the online tool for the Google 2FA Authenticator online tools at

Chilkat Unicode C Downloads

Unicode C
#include <C_CkCrypt2W.h>

void ChilkatSample(void)
    {
    HCkCrypt2W crypt;
    const wchar_t *secretKey;

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.
    // 
    // Note: This example was written on 7-March-2020.  If the online tools have since changed, the instructions provided here may no longer be valid.
    // 

    crypt = CkCrypt2W_Create();

    // ---------------------------------------------------------------------------------------------
    // To duplicate the results of the Authenticator Test at https://rootprojects.org/authenticator/
    // do the following:
    // 1) At the bottom of the screen you will see a URI such as:
    // 
    //    otpauth://totp/ACME%20Co:john@example.com?secret=HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ&issuer=ACME%20Co&algorithm=SHA1&digits=6&period=30
    // 
    //    Use the uppercase secret.  For example:
    secretKey = L"HXDMVJECJJWSRB3HWIZR4IFUGFTMXBOZ";

    // 2) DO NOT cick the "Regenerate" button.  The regenerate button will generate a new secret.
    // 
    // 3) Run the following code to generate your 6-digit token.  Compare with the token shown in the picture of the iPhone at https://rootprojects.org/authenticator/
    //      Note: A new token is generated every 30 seconds.  You must generate within the same 30 second interval to get the same result.
    wprintf(L"Your token is: %s\n",CkCrypt2W_totp(crypt,secretKey,L"base32",L"0",L"",30,6,-1,L"sha1"));

    // ---------------------------------------------------------------------------------------------
    // To duplicate the results of the Google2FA Playground at https://pragmarx.com/playground/google2fa#/
    // do the following:

    // 1) Copy the 64-byte secret key:
    secretKey = L"OR2VQTRVHB2HO2LCGVWXQSCDK5ZHQS2D3THQ6UXO57XIE7ZHOWS6HDPQ622GU747";

    // 2) Run the same code:
    //    (Note: The online tool generates a new result every 30 seconds.  You must generate and compare within the same 30-second interval.)
    wprintf(L"Your token is: %s\n",CkCrypt2W_totp(crypt,secretKey,L"base32",L"0",L"",30,6,-1,L"sha1"));


    CkCrypt2W_Dispose(crypt);

    }