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

JWE with DEFLATE Compression

See more JSON Web Encryption (JWE) Examples

Demonstrates how to DEFLATE ("zip") compress the JWE payload prior to encryption.

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.Jwe,
  Chilkat.StringBuilder,
  Chilkat.JsonObject;

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

procedure RunDemo;
var
  success: Boolean;
  sbPlainText: TStringBuilder;
  bCrLf: Boolean;
  line: string;
  jwe: TJwe;
  jweProtHdr: TJsonObject;
  aesWrappingKey: string;
  sbJweCompressed: TStringBuilder;
  sbJweUncompressed: TStringBuilder;
  jwe2: TJwe;
  sbOriginalText: TStringBuilder;

begin
  success := False;

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

  //  Note: This example requires Chilkat v9.5.0.66 or greater.

  //  Create some plaintext to be encrypted.
  //  This example will demonstrate with and without DEFLATE (zip) compression.
  sbPlainText := TStringBuilder.Create;
  bCrLf := True;
  line := 'Live long and prosper.';
  sbPlainText.AppendLine(line,bCrLf);
  sbPlainText.AppendLine(line,bCrLf);
  sbPlainText.AppendLine(line,bCrLf);
  sbPlainText.AppendLine(line,bCrLf);

  //  The text to be encrypted:
  WriteLn(sbPlainText.GetAsString());

  jwe := TJwe.Create;

  //  Build the JWE Protected Header: {"alg":"A128KW","enc":"A128CBC-HS256","zip":"DEF"}
  //  The "zip":"DEF" parameter indicates that the plaintext payload should
  //  be compressed prior to encryption.
  jweProtHdr := TJsonObject.Create;
  jweProtHdr.AppendString('alg','A128KW');
  jweProtHdr.AppendString('enc','A128CBC-HS256');
  jweProtHdr.AppendString('zip','DEF');
  jwe.SetProtectedHeader(jweProtHdr);

  //  Set the AES key wrap key:
  aesWrappingKey := 'GawgguFyGrWKav7AX4VKUg';
  jwe.SetWrappingKey(0,aesWrappingKey,'base64url');

  //  Encrypt and return the JWE in sbJweCompressed:
  sbJweCompressed := TStringBuilder.Create;
  success := jwe.EncryptSb(sbPlainText,'utf-8',sbJweCompressed);
  if (success <> True) then
    begin
      WriteLn(jwe.LastErrorText);
      Exit;
    end;

  //  Show the compressed JWE:
  WriteLn(sbJweCompressed.GetAsString());
  WriteLn('size of compressed JWE: ' + sbJweCompressed.Length);

  //  Now create a JWE without compression.
  jweProtHdr.Delete('zip');
  //  Make sure to update the shared protected header:
  jwe.SetProtectedHeader(jweProtHdr);

  sbJweUncompressed := TStringBuilder.Create;
  success := jwe.EncryptSb(sbPlainText,'utf-8',sbJweUncompressed);
  if (success <> True) then
    begin
      WriteLn(jwe.LastErrorText);
      Exit;
    end;

  //  Show the uncompressed JWE:
  WriteLn(sbJweUncompressed.GetAsString());
  WriteLn('size of uncompressed JWE: ' + sbJweUncompressed.Length);

  //  Decrypting is the same whether compression is used or not.
  //  The "zip" header in the JWE indicates that the payload should be 
  //  automatically decompressed (inflated) after decrypting.
  jwe2 := TJwe.Create;
  success := jwe2.LoadJweSb(sbJweCompressed);
  if (success <> True) then
    begin
      WriteLn(jwe2.LastErrorText);
      Exit;
    end;
  //  Set the AES wrap key.
  jwe2.SetWrappingKey(0,aesWrappingKey,'base64url');

  //  Decrypt (also automatically decompresses).
  sbOriginalText := TStringBuilder.Create;
  success := jwe2.DecryptSb(0,'utf-8',sbOriginalText);
  if (success <> True) then
    begin
      WriteLn(jwe2.LastErrorText);
      Exit;
    end;

  WriteLn('original text from compressed JWE: ');
  WriteLn(sbOriginalText.GetAsString());

  //  -----------------------------------------------------------
  //  Do the same with the uncompressed JWE

  success := jwe2.LoadJweSb(sbJweUncompressed);
  if (success <> True) then
    begin
      WriteLn(jwe2.LastErrorText);
      Exit;
    end;
  //  Set the AES wrap key.
  jwe2.SetWrappingKey(0,aesWrappingKey,'base64url');

  //  Decrypt.
  sbOriginalText.Clear();
  success := jwe2.DecryptSb(0,'utf-8',sbOriginalText);
  if (success <> True) then
    begin
      WriteLn(jwe2.LastErrorText);
      Exit;
    end;

  WriteLn('original text from uncompressed JWE: ');
  WriteLn(sbOriginalText.GetAsString());

  //  ------------------------------------------------
  //  The output of this example is:
  //  (Note: Your output data will be different because the content encryption key is randomly generated.)

  //  eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwiemlwIjoiREVGIn0.xuW-pEAIdEUFnk10m8ocursvktO8Of9ByCCAt6LgKkkOtCWCUn1kQw.zpGj-9WVni3cQxyOuZbcGA.0hzP1myua3oYpUHwCIY_3edBUREbUpLaX6wYuJduOdI.Ppc6aEO3y3B8BJ1FKMPjlA
  //  size of compressed JWE: 212
  //  eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.N4KeyC7nnSFkieJOyE24_zKeuV_m7v5UKoJb1TgV4Yc_r2RzUPNvyA.6AEdyXSCKx-iMmUJyypSLg.QpixfyrwhGpmwUDp623viik4smPav7vwPLiC2r-V-jwnSfEH3mxWu6DbrIz3mixaqATwynmEBzVPxvS9jTXpSAGCnniib4_0WoPl3r_wF5tlsKOEe--jpNso-DKd1Tp8jJxj3JkFWt3IRnUUKGj17g.sBfDwFc5fzpaI-UW8-SW4g
  //  size of uncompressed JWE: 303
  //  original text from compressed JWE: 
  //  Live long and prosper.
  //  Live long and prosper.
  //  Live long and prosper.
  //  Live long and prosper.
  //  
  //  original text from uncompressed JWE: 
  //  Live long and prosper.
  //  Live long and prosper.
  //  Live long and prosper.
  //  Live long and prosper.
  //  


  sbPlainText.Free;
  jwe.Free;
  jweProtHdr.Free;
  sbJweCompressed.Free;
  sbJweUncompressed.Free;
  jwe2.Free;
  sbOriginalText.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.