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

HOTP Algorithm: HMAC-Based One-Time Password Algorithm

See more Encryption Examples

Demonstrates how to generate an HMAC one-time password (HOTP) as specified in RFC 4226.

Note: This example requires Chilkat v9.5.0.77 or greater.

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;
  secret: string;
  count: Integer;
  counterHex: string;
  hotp: string;

begin
  //  This example requires the Chilkat API to have been previously unlocked.
  //  See Global Unlock Sample for sample code.

  crypt := TCrypt2.Create;

  //  Duplicate the following results from RFC 4226

  //  Appendix D - HOTP Algorithm: Test Values
  //  
  //    The following test data uses the ASCII string
  //    "12345678901234567890" for the secret:
  //  
  //    Secret = 0x3132333435363738393031323334353637383930
  //  
  //                      Truncated
  //    Count    Hexadecimal    Decimal        HOTP
  //    0        4c93cf18       1284755224     755224
  //    1        41397eea       1094287082     287082
  //    2         82fef30        137359152     359152
  //    3        66ef7655       1726969429     969429
  //    4        61c5938a       1640338314     338314
  //    5        33c083d4        868254676     254676
  //    6        7256c032       1918287922     287922
  //    7         4e5b397         82162583     162583
  //    8        2823443f        673399871     399871
  //    9        2679dc69        645520489     520489

  secret := '12345678901234567890';

  for count := 0 to 9 do
    begin
      counterHex := crypt.EncodeInt(count,8,False,'hex');
      hotp := crypt.Hotp(secret,'ascii',counterHex,6,-1,'sha1');
      WriteLn(count + '  HOTP = ' + hotp);
    end;

  //  Output is:
  //  0  HOTP = 755224
  //  1  HOTP = 287082
  //  2  HOTP = 359152
  //  3  HOTP = 969429
  //  4  HOTP = 338314
  //  5  HOTP = 254676
  //  6  HOTP = 287922
  //  7  HOTP = 162583
  //  8  HOTP = 399871
  //  9  HOTP = 520489


  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.