Sample code for 30+ languages & platforms
Pascal (Lazarus/Delphi)

TOTP Authenticator: Duplicate Results of Online Tools

See more Encryption Examples

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

Chilkat Pascal (Lazarus/Delphi) Downloads

Pascal (Lazarus/Delphi)
program ChilkatDemo;

// Demonstrates using the Chilkat Pascal wrapper via the C bridge DLL.
// Builds as a console application under Lazarus (FPC) or Delphi.

{$IFDEF FPC}
  {$MODE DELPHI}
{$ENDIF}
{$APPTYPE CONSOLE}

uses
  {$IFDEF UNIX}
  cthreads,
  {$ENDIF}
  SysUtils,
  CkDllLoader,
  Chilkat.Crypt2;

// ---------------------------------------------------------------------------

procedure RunDemo;
var
  crypt: TCrypt2;
  secretKey: string;

begin
  //  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 := TCrypt2.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 := '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.
  WriteLn('Your token is: ' + crypt.Totp(secretKey,'base32','0','',30,6,-1,'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 := '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.)
  WriteLn('Your token is: ' + crypt.Totp(secretKey,'base32','0','',30,6,-1,'sha1'));


  crypt.Free;

end;

// ---------------------------------------------------------------------------

begin

  try
    RunDemo;
  except
    on E: Exception do
      WriteLn('Unhandled exception: ', E.ClassName, ': ', E.Message);
  end;

  WriteLn;
  {$IFDEF MSWINDOWS}
  WriteLn('Press Enter to exit...');
  ReadLn;
  {$ENDIF}
end.