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

Create JWK Set Containing Certificates

See more Certificates Examples

Demonstrates how to create a JWK Set containing N certificates.

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.PublicKey,
  Chilkat.Cert,
  Chilkat.JsonObject,
  Chilkat.Crypt2;

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

procedure RunDemo;
var
  success: Boolean;
  cert1: TCert;
  cert2: TCert;
  crypt: TCrypt2;
  json: TJsonObject;
  hexThumbprint: string;
  base64Thumbprint: string;
  pubKey: TPublicKey;
  pubKeyJwk: TJsonObject;

begin
  success := False;

  //  This example creates the following JWK Set from two certificates:

  //  {
  //    "keys": [
  //      {
  //        "kty": "RSA",
  //        "use": "sig",
  //        "kid": "BB8CeFVqyaGrGNuehJIiL4dfjzw",
  //        "x5t": "BB8CeFVqyaGrGNuehJIiL4dfjzw",
  //        "n": "nYf1jpn7cFdQ...9Iw",
  //        "e": "AQAB",
  //        "x5c": [
  //          "MIIDBTCCAe2...Z+NTZo"
  //        ]
  //      },
  //      {
  //        "kty": "RSA",
  //        "use": "sig",
  //        "kid": "M6pX7RHoraLsprfJeRCjSxuURhc",
  //        "x5t": "M6pX7RHoraLsprfJeRCjSxuURhc",
  //        "n": "xHScZMPo8F...EO4QQ",
  //        "e": "AQAB",
  //        "x5c": [
  //          "MIIC8TCCAdmgA...Vt5432GA=="
  //        ]
  //      }
  //    ]
  //  }

  //  First get two certificates from files.
  cert1 := TCert.Create;
  success := cert1.LoadFromFile('qa_data/certs/brasil_cert.pem');
  if (success = False) then
    begin
      WriteLn(cert1.LastErrorText);
      Exit;
    end;

  cert2 := TCert.Create;
  success := cert2.LoadFromFile('qa_data/certs/testCert.cer');
  if (success = False) then
    begin
      WriteLn(cert2.LastErrorText);
      Exit;
    end;

  //  We'll need this crypt object re-encode the SHA1 thumbprint from hex to base64.
  crypt := TCrypt2.Create;

  json := TJsonObject.Create;

  //  Let's begin with the 1st cert:
  json.I := 0;
  json.UpdateString('keys[i].kty','RSA');
  json.UpdateString('keys[i].use','sig');

  hexThumbprint := cert1.Sha1Thumbprint;
  base64Thumbprint := crypt.ReEncode(hexThumbprint,'hex','base64');
  json.UpdateString('keys[i].kid',base64Thumbprint);
  json.UpdateString('keys[i].x5t',base64Thumbprint);

  //  (We're assuming these are RSA certificates)
  //  To get the modulus (n) and exponent (e), we need to get the cert's public key and then get its JWK.
  pubKey := TPublicKey.Create;
  cert1.GetPublicKey(pubKey);

  pubKeyJwk := TJsonObject.Create;
  pubKeyJwk.Load(pubKey.GetJwk());
  json.UpdateString('keys[i].n',pubKeyJwk.StringOf('n'));
  json.UpdateString('keys[i].e',pubKeyJwk.StringOf('e'));

  //  Now add the entire X.509 certificate 
  json.UpdateString('keys[i].x5c[0]',cert1.GetEncoded());

  //  Now do the same for cert2..
  json.I := 1;

  json.UpdateString('keys[i].kty','RSA');
  json.UpdateString('keys[i].use','sig');

  hexThumbprint := cert2.Sha1Thumbprint;
  base64Thumbprint := crypt.ReEncode(hexThumbprint,'hex','base64');
  json.UpdateString('keys[i].kid',base64Thumbprint);
  json.UpdateString('keys[i].x5t',base64Thumbprint);
  cert2.GetPublicKey(pubKey);

  pubKeyJwk.Load(pubKey.GetJwk());
  json.UpdateString('keys[i].n',pubKeyJwk.StringOf('n'));
  json.UpdateString('keys[i].e',pubKeyJwk.StringOf('e'));

  //  Now add the entire X.509 certificate 
  json.UpdateString('keys[i].x5c[0]',cert2.GetEncoded());

  //  Emit the JSON..
  json.EmitCompact := False;
  WriteLn(json.Emit());


  cert1.Free;
  cert2.Free;
  crypt.Free;
  json.Free;
  pubKey.Free;
  pubKeyJwk.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.