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

Calculate HRMC IRMark

See more XML Digital Signatures Examples

Demonstrates how to calculate an IRmark for an HMRC GovTalkMessage XML document.

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

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

procedure RunDemo;
var
  xml: TXml;
  xdsig: TXmlDSig;
  withComments: Boolean;
  canonXml: string;
  crypt: TCrypt2;
  irmark: string;

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

  //  First build a sample (but incomplete) GovTalkMessage.
  //  You can replace this code with a call to LoadXml or LoadXmlFile..
  //  
  //  Note: The online tool at https://tools.chilkat.io/xmlCreate.cshtml
  //  can be used to generate XML code that creates a given XML document.
  xml := TXml.Create;
  xml.Tag := 'GovTalkMessage';
  xml.AddAttribute('xmlns','http://www.govtalk.gov.uk/CM/envelope');
  xml.UpdateAttrAt('Body|Message',True,'xmlns','urn:g3.ge:dea:call:SendDocument:v1');
  xml.UpdateChildContent('Body|Message','................');

  //  This is the XML created:
  //  <?xml version="1.0" encoding="utf-8" ?>
  //  <GovTalkMessage xmlns="http://www.govtalk.gov.uk/CM/envelope">
  //      <Body>
  //          <Message xmlns="urn:g3.ge:dea:call:SendDocument:v1">................</Message>
  //      </Body>
  //  </GovTalkMessage>

  WriteLn(xml.GetXml());

  //  Canonicalize the XML (using C14N)
  xdsig := TXmlDSig.Create;
  withComments := False;
  canonXml := xdsig.CanonicalizeXml(xml.GetXml(),'C14N',withComments);

  //  Return the base64 SHA-1 HASH of the canonical XML.
  crypt := TCrypt2.Create;
  crypt.HashAlgorithm := 'sha1';
  crypt.EncodingMode := 'base64';
  irmark := crypt.HashStringENC(canonXml);

  WriteLn('IRMark = ' + irmark);


  xml.Free;
  xdsig.Free;
  crypt.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.