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

Duplicate Java Secure Token Creation

See more RSA Examples

Demonstrates how to duplicate some Java code that creates an RSA signature to create a base64 token.

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.StringBuilder,
  Chilkat.Rsa,
  Chilkat.Cert,
  Chilkat.CkDateTime;

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

procedure RunDemo;
var
  success: Boolean;
  dt: TCkDateTime;
  timeCreated: string;
  sbToken: TStringBuilder;
  cert: TCert;
  rsa: TRsa;
  signature: string;
  token: string;

begin
  success := False;

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

  //  This example duplicates the following Java code:

  //  public X509Certificate2 cert = new X509Certificate2(@"Some path to p12/p12file_name.p12","Password_for_p12"); 
  //  
  //  public string GenerateSignToken(double timeValidityMin){ 
  //    string equalsSign = ":="; 
  //    string timeCreated = DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss.fffzzz"); 
  //    string tokenTimeInfo = "validityTimeMinutes" + equalsSign + timeValidityMin + ";"+"timeCreated" + equalsSign + timeCreated; 
  //    string signature = SignData(tokenTimeInfo); 
  //    string secureToken = tokenTimeInfo + ";" + "signature" + equalsSign + signature; 
  //    return Base64UrlEncode(secureToken); 
  //  } 
  //   
  //  public string SignData(string stringToSign){ 
  //    byte[] dataToSign = Encoding.UTF8.GetBytes(stringToSign); 
  //    RSACryptoServiceProvider privKey = (RSACryptoServiceProvider)cert.PrivateKey; 
  //    CspKeyContainerInfo containerInfo = new RSACryptoServiceProvider().CspKeyContainerInfo; 
  //    CspParameters cspparams = new CspParameters(containerInfo.ProviderType, containerInfo.ProviderName, privKey.CspKeyContainerInfo.KeyContainerName); 
  //    privKey = new RSACryptoServiceProvider(cspparams); 
  //    string id = CryptoConfig.MapNameToOID("SHA256"); 
  //    byte[] sign = privKey.SignData(dataToSign, id); 
  //    bool res = privKey.VerifyData(dataToSign, id, sign); 
  //    return Convert.ToBase64String(sign).Replace('+', '-').Replace('/', '_').Replace("=", ""); 
  //  } 
  //   
  //  private static string Base64UrlEncode(string input){ 
  //    var inputBytes = Encoding.UTF8.GetBytes(input); 
  //    return Convert.ToBase64String(inputBytes).Replace('+', '-').Replace('/', '_').Replace("=", ""); 
  //  } 

  dt := TCkDateTime.Create;
  dt.SetFromCurrentSystemTime();
  timeCreated := dt.GetAsTimestamp(True);

  //  Such as 2019-04-01T19:35:44-05:00
  WriteLn(timeCreated);

  sbToken := TStringBuilder.Create;
  sbToken.Append('validityTimeMinutes:=10.0;timeCreated:=');
  sbToken.Append(timeCreated);

  cert := TCert.Create;
  success := cert.LoadPfxFile('Some path to p12/p12file_name.p12','Password_for_p12');
  if (success <> True) then
    begin
      WriteLn(cert.LastErrorText);
      Exit;
    end;

  rsa := TRsa.Create;
  success := rsa.SetX509Cert(cert,True);
  if (success <> True) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  rsa.EncodingMode := 'base64url';

  signature := rsa.SignStringENC(sbToken.GetAsString(),'sha256');
  if (rsa.LastMethodSuccess = False) then
    begin
      WriteLn(rsa.LastErrorText);
      Exit;
    end;

  sbToken.Append(';signature:=');
  sbToken.Append(signature);

  //  Base64URL encode the result
  sbToken.Encode('base64url','utf-8');
  token := sbToken.GetAsString();

  WriteLn(token);


  dt.Free;
  sbToken.Free;
  cert.Free;
  rsa.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.