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

Compute JWK Thumbprint for RSA and EC Public Keys

See more ECC Examples

Demonstrates how to compute a JSON Web Key thumbprint for a public key (RSA or ECC).

Note: This example requires Chilkat v9.5.0.66 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.StringBuilder,
  Chilkat.PublicKey;

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

procedure RunDemo;
var
  success: Boolean;
  pubKey: TPublicKey;
  sb: TStringBuilder;

begin
  success := False;

  pubKey := TPublicKey.Create;

  //  A public key can be loaded from any format (binary DER, PEM, etc.)
  //  This example will load the public keys from JWK format, 
  //  and will then compute the JWK thumbprint.

  //  First do it for an RSA public key...

  sb := TStringBuilder.Create;
  sb.Append('{');
  sb.Append('"kty": "RSA",');
  sb.Append('"n": "0vx7agoebGcQSuuPiLJXZptN9nndrQmbXEps2aiAFbWhM78LhWx4cbbfAAt');
  sb.Append('VT86zwu1RK7aPFFxuhDR1L6tSoc_BJECPebWKRXjBZCiFV4n3oknjhMstn6');
  sb.Append('4tZ_2W-5JsGY4Hc5n9yBXArwl93lqt7_RN5w6Cf0h4QyQ5v-65YGjQR0_FD');
  sb.Append('W2QvzqY368QQMicAtaSqzs8KJZgnYb9c7d0zgdAZHzu6qMQvRL5hajrn1n9');
  sb.Append('1CbOpbISD08qNLyrdkt-bFTWhAI4vMQFh6WeZu0fM4lFd2NcRwr3XPksINH');
  sb.Append('aQ-G_xBniIqbw0Ls1jF44-csFCur-kEgU8awapJzKnqDKgw",');
  sb.Append('"e": "AQAB",');
  sb.Append('"alg": "RS256",');
  sb.Append('"kid": "2011-04-29"');
  sb.Append('}');

  //  The JWK format is automatically detected..
  success := pubKey.LoadFromString(sb.GetAsString());
  if (success <> True) then
    begin
      WriteLn(pubKey.LastErrorText);
      Exit;
    end;

  //  Get the JWK thumbprint (using SHA256)
  WriteLn('JWK thumbprint: ' + pubKey.GetJwkThumbprint('SHA256'));

  //  Output:
  //  JWK thumbprint: NzbLsXh8uDCcd-6MNwXF4W_7noWXFZAfHkxZsRGC9Xs

  //  --------------------------------------------------------------
  //  Now let's do an EC public key:
  sb.Clear();
  sb.Append('{ ');
  sb.Append('  "kty": "EC",');
  sb.Append('  "crv": "P-256",');
  sb.Append('  "x": "tDeeYABgKEAbWicYPCEEI8sP4SRIhHKcHDW7VqrB4LA",');
  sb.Append('  "y": "J08HOoIZ0rX2Me3bNFZUltfxIk1Hrc8FsLu8VaSxsMI"');
  sb.Append('}');

  success := pubKey.LoadFromString(sb.GetAsString());
  if (success <> True) then
    begin
      WriteLn(pubKey.LastErrorText);
      Exit;
    end;

  //  Get the JWK thumbprint (using SHA256)
  WriteLn('JWK thumbprint: ' + pubKey.GetJwkThumbprint('SHA256'));

  //  Output:
  //  JWK thumbprint: 8fm8079s3nu4FLV_7dVJoJ69A8XCXn7Za2mtaWCnxR4


  pubKey.Free;
  sb.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.