Pascal (Lazarus/Delphi)
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
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.