Pascal (Lazarus/Delphi)
Pascal (Lazarus/Delphi)
SII Chile - FRMA Signature Computation and Add to XML
See more XML Digital Signatures Examples
Compute the FRMA signature of a <DA> element enclosed inside a <CAF> element of the XML to be signed.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.StringBuilder,
Chilkat.PrivateKey,
Chilkat.Rsa,
Chilkat.Xml;
// ---------------------------------------------------------------------------
procedure RunDemo;
var
success: Boolean;
xml: TXml;
daXml: TXml;
sbFlattened: TStringBuilder;
privKey: TPrivateKey;
rsa: TRsa;
sig: string;
begin
success := False;
// This example assumes the Chilkat API to have been previously unlocked.
// See Global Unlock Sample for sample code.
// Also see: Compute the FRMT Signature and Add to XML
xml := TXml.Create;
// Load the unsigned XML that contains the following:
// <DTE version="1.0">
// <Documento ID="F60T33">
// <TED version="1.0">
// <DD>
// ...
// <CAF version="1.0">
// <DA>
// ...
// </DA>
// ... The FRMA will be added here ...
// </CAF>
// ...
// </DD>
// ... The FRMT will be added here in another example ...
// </TED>
// </Documento>
// </DTE>
success := xml.LoadXmlFile('qa_data/xml_dsig/sii_cl/test_0.xml');
if (success = False) then
begin
WriteLn('Failed to load initial XML file.');
Exit;
end;
// Get a reference to the "DA" element
daXml := xml.FindChild('Documento|TED|DD|CAF|DA');
if (xml.LastMethodSuccess = False) then
begin
WriteLn('Failed to find DA element');
Exit;
end;
// We need to get the "flattened" DA XML where:
// - No whitespace between elements.
// - The 5 pre-defined entities are converted.
// - The text is encoded in the ISO-8859-1 character set (Latin-1),
sbFlattened := TStringBuilder.Create;
daXml.EmitCompact := True;
daXml.EmitXmlDecl := False;
daXml.GetXmlSb(sbFlattened);
// Compute the SHA-1 message digest of the iso-8859-1 byte representation,
// and sign it with our RSA private key, getting the result in base64 format.
privKey := TPrivateKey.Create;
success := privKey.LoadAnyFormatFile('qa_data/rsa/rsaPrivKey_pkcs8.pem','');
if (success = False) then
begin
WriteLn(privKey.LastErrorText);
Exit;
end;
rsa := TRsa.Create;
rsa.UsePrivateKey(privKey);
rsa.EncodingMode := 'base64';
rsa.Charset := 'iso-8859-1';
sig := rsa.SignStringENC(sbFlattened.GetAsString(),'sha1');
// Add the FRMA signature element to the XML.
xml.UpdateChildContent('Documento|TED|DD|CAF|FRMA',sig);
xml.UpdateAttrAt('Documento|TED|DD|CAF|FRMA',True,'algoritmo','SHA1withRSA');
daXml.Free;
// See what we have:
xml.EmitCompact := False;
xml.EmitXmlDecl := True;
WriteLn(xml.GetXml());
xml.SaveXml('qa_data/xml_dsig/sii_cl/test_1.xml');
xml.Free;
sbFlattened.Free;
privKey.Free;
rsa.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.