Skip to content

OTP (RFC 4226, same as Google is using) for Delphi

Notifications You must be signed in to change notification settings

Valdeirsk8/DelphiOTP

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OTP for Delphi

Google Authenticator is based on RFC 4226 - a Time based One Time Password (TOTP) which is initialised using a 16 digit base 32 (RFC 4648) encoded seed value. Initial seeds used for the TOTP can be entered into the Google Authenticator via a camera using QR codes or via the keyboard.

This Repository contains the working functions and all dependencies to either create a token generator or to validate tokens.

Things that were in my way

  • Delphi XE2 doesn't come with Base32 functionality
  • DateTimeToUnix from DateUtils Unit performs a shitty conversion.
  • Indy 10's ToBytes on a Unicode String comes back with some surprises.
  • Indy 10's ToBytes on a Int64: The Result is the reverse of what I a) expected and b) wanted

How to generate Time-based OTP using the code provided?

MYBASE32SECRET is the pre-shared secret.

uses
  GoogleOTP;
  
[...]

var
	Token: Integer;
begin
	// Using time-based Token
	Token := CalculateOTP('MYBASE32SECRET'); // Returns the Token as Integer;

	// To display the token, use the Format-Function
	ShowMessage(Format('%.6d', [Token]);
end;

How to generate Counter-based OTP using the code provided?

MYBASE32SECRET is the pre-shared secret. 4 is an example value from the counter

uses
  GoogleOTP;
  
[...]

var
	Token: Integer;
begin
	// Using counter-based Token
	Token := CalculateOTP('MYBASE32SECRET', 4); // Returns the Token as Integer;

	// To display the token, use the Format-Function
	ShowMessage(Format('%.6d', [Token]);
end;

How to validate Time-based OTP using the code provided?

uses
  GoogleOTP;
  
[...]

var
	Token: Integer;
begin
	// Ask the user for a token
	Token := 123456;
	
	// Check the Token
	if (ValidateTOPT('MYBASE32SECRET', Token)) then
		ShowMessage('Access granted')
	else
		ShowMessage('Access denied');
end;

About

OTP (RFC 4226, same as Google is using) for Delphi

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Pascal 100.0%