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

Plaza API (bol.com) HMAC-SHA256 Authentication

See more Encryption Examples

Demonstrates how to compute the Authorization header for bol.com using HMAC-SHA256.

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

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

procedure RunDemo;
var
  crypt: TCrypt2;
  publicKey: string;
  privateKey: string;
  http_verb: string;
  content_type: string;
  x_bol_date: string;
  uri: string;
  sb: TStringBuilder;
  mac: string;
  sbHeader: TStringBuilder;
  hdrValue: string;

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

  crypt := TCrypt2.Create;

  crypt.EncodingMode := 'base64';
  crypt.HashAlgorithm := 'sha256';
  crypt.MacAlgorithm := 'hmac';

  publicKey := 'oRNWbHFXtAECmhnZmEndcjLIaSKbRMVE';
  privateKey := 'MaQHPOnmYkPZNgeRziPnQyyOJYytUbcFBVJBvbMKoDdpPqaZbaOiLUTWzPAkpPsZFZbJHrcoltdgpZolyNcgvvBaKcmkqFjucFzXhDONTsPAtHHyccQlLUZpkOuywMiOycDWcCySFsgpDiyGnCWCZJkNTtVdPxbSUTWVIFQiUxaPDYDXRQAVVTbSVZArAZkaLDLOoOvPzxSdhnkkJWzlQDkqsXNKfAIgAldrmyfROSyCGMCfvzdQdUQEaYZTPEoA';

  //  The string to sign is this:
  //  http_verb +'\n\n'+ content_type +'\n'+ x_bol_date +'\n'+ 'x-bol-date:'+ x_bol_date +'\n'+ uri

  http_verb := 'GET';
  content_type := 'application/xml';
  x_bol_date := 'Wed, 17 Feb 2016 00:00:00 GMT';
  uri := '/services/rest/orders/v2';

  //  IMPORTANT: Notice the use of underscore and hyphen (dash) chars in x-bol-date vs. x_bol_date.
  //  In one place hypens are used.  In two places, underscore chars are used.
  sb := TStringBuilder.Create;
  sb.Append(http_verb);
  sb.Append(#10 + #10);
  sb.Append(content_type);
  sb.Append(#10);
  sb.Append(x_bol_date);
  sb.Append(#10 + 'x-bol-date:');
  sb.Append(x_bol_date);
  sb.Append(#10);
  sb.Append(uri);
  WriteLn('[' + sb.GetAsString() + ']');

  //  Set the HMAC key:
  crypt.SetMacKeyEncoded(privateKey,'ascii');
  mac := crypt.MacStringENC(sb.GetAsString());

  //  The answer should be: nqzLWvXI1eBhBXrRx5NF23V5hS8Q1xWCloJzPi/RAts=
  WriteLn(mac);

  //  The last step is to append the public key with the signature
  sbHeader := TStringBuilder.Create;
  sbHeader.Append(publicKey);
  sbHeader.Append(':');
  sbHeader.Append(mac);

  hdrValue := sbHeader.GetAsString();
  WriteLn(hdrValue);


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