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

XML-DSig Add EncapsulatedTimestamp when Signing

See more XML Digital Signatures Examples

Demonstrates how to add an EncapsulatedTimestamp at the time of creating an XML signature.

Note: This example requires Chilkat v9.5.0.90 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.XmlDSigGen,
  Chilkat.XmlDSig,
  Chilkat.StringBuilder,
  Chilkat.JsonObject,
  Chilkat.Cert,
  Chilkat.Xml;

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

procedure RunDemo;
var
  success: Boolean;
  xmlToSign: TXml;
  gen: TXmlDSigGen;
  object1: TXml;
  xml1: TXml;
  xml2: TXml;
  cert: TCert;
  sbXml: TStringBuilder;
  jsonTsa: TJsonObject;
  verifier: TXmlDSig;
  numSigs: Integer;
  verifyIdx: Integer;
  verified: Boolean;

begin
  success := False;

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

  success := True;

  //  Create the folllowing XML to be signed...

  //  Use this online tool to generate code from sample XML: 
  //  Generate Code to Create XML

  //  <p:FatturaElettronica xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:p="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" versione="FPR12" xsi:schemaLocation="http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd">
  //      <FatturaElettronicaHeader>
  //          <DatiTrasmissione>
  //              <IdTrasmittente>
  //                  <IdPaese>IT</IdPaese>
  //                  <IdCodice>01234567890</IdCodice>
  //              </IdTrasmittente>
  //              <ProgressivoInvio>00001</ProgressivoInvio>
  //              <FormatoTrasmissione>FPR12</FormatoTrasmissione>
  //              <CodiceDestinatario>0000000</CodiceDestinatario>
  //              <PECDestinatario>betagamma@pec.it</PECDestinatario>
  //          </DatiTrasmissione>
  //          <CedentePrestatore>
  //              <DatiAnagrafici>
  //                  <IdFiscaleIVA>
  //                      <IdPaese>IT</IdPaese>
  //                      <IdCodice>01234567890</IdCodice>
  //                  </IdFiscaleIVA>
  //                  <Anagrafica>
  //                      <Denominazione>ALPHA SRL</Denominazione>
  //                  </Anagrafica>
  //                  <RegimeFiscale>RF19</RegimeFiscale>
  //              </DatiAnagrafici>
  //              <Sede>
  //                  <Indirizzo>VIALE ROMA 543</Indirizzo>
  //                  <CAP>07100</CAP>
  //                  <Comune>SASSARI</Comune>
  //                  <Provincia>SS</Provincia>
  //                  <Nazione>IT</Nazione>
  //              </Sede>
  //          </CedentePrestatore>
  //          <CessionarioCommittente>
  //              <DatiAnagrafici>
  //                  <CodiceFiscale>09876543210</CodiceFiscale>
  //                  <Anagrafica>
  //                      <Denominazione>AMMINISTRAZIONE BETA</Denominazione>
  //                  </Anagrafica>
  //              </DatiAnagrafici>
  //              <Sede>
  //                  <Indirizzo>VIA TORINO 38-B</Indirizzo>
  //                  <CAP>00145</CAP>
  //  
  //                  <Comune>ROMA</Comune>
  //                  <Provincia>RM</Provincia>
  //                  <Nazione>IT</Nazione>
  //              </Sede>
  //              <StabileOrganizzazione>
  //                  <Indirizzo>VIA CASELLE</Indirizzo>
  //                  <NumeroCivico>4/D</NumeroCivico>
  //                  <CAP>25027</CAP>
  //                  <Comune>QUINZANO D'OGLIO</Comune>
  //                  <Provincia>BS</Provincia>
  //                  <Nazione>IT</Nazione>
  //              </StabileOrganizzazione>
  //              <RappresentanteFiscale>
  //                  <IdFiscaleIVA>
  //                      <IdPaese>DE</IdPaese>
  //                      <IdCodice>DE12345</IdCodice>
  //                  </IdFiscaleIVA>
  //                  <Denominazione>RFCC - DENOMINAZIONE</Denominazione>
  //              </RappresentanteFiscale>
  //          </CessionarioCommittente>
  //      </FatturaElettronicaHeader>
  //      <FatturaElettronicaBody>
  //          <DatiGenerali>
  //              <DatiGeneraliDocumento>
  //                  <TipoDocumento>TD01</TipoDocumento>
  //                  <Divisa>EUR</Divisa>
  //                  <Data>2022-03-03</Data>
  //                  <Numero>123</Numero>
  //                  <Causale>LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA</Causale>
  //                  <Causale>SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB</Causale>
  //              </DatiGeneraliDocumento>
  //              <DatiOrdineAcquisto>
  //                  <RiferimentoNumeroLinea>1</RiferimentoNumeroLinea>
  //                  <IdDocumento>66685</IdDocumento>
  //                  <NumItem>1</NumItem>
  //                  <CodiceCUP>123abc</CodiceCUP>
  //                  <CodiceCIG>456def</CodiceCIG>
  //              </DatiOrdineAcquisto>
  //              <DatiContratto>
  //                  <RiferimentoNumeroLinea>1</RiferimentoNumeroLinea>
  //                  <IdDocumento>123</IdDocumento>
  //                  <Data>2022-01-01</Data>
  //                  <NumItem>5</NumItem>
  //                  <CodiceCUP>123abc</CodiceCUP>
  //                  <CodiceCIG>456def</CodiceCIG>
  //              </DatiContratto>
  //              <DatiConvenzione>
  //                  <RiferimentoNumeroLinea>1</RiferimentoNumeroLinea>
  //                  <IdDocumento>456</IdDocumento>
  //                  <NumItem>5</NumItem>
  //                  <CodiceCUP>123abc</CodiceCUP>
  //                  <CodiceCIG>456def</CodiceCIG>
  //              </DatiConvenzione>
  //              <DatiRicezione>
  //                  <RiferimentoNumeroLinea>1</RiferimentoNumeroLinea>
  //                  <IdDocumento>789</IdDocumento>
  //                  <NumItem>5</NumItem>
  //                  <CodiceCUP>123abc</CodiceCUP>
  //                  <CodiceCIG>456def</CodiceCIG>
  //              </DatiRicezione>
  //              <DatiTrasporto>
  //                  <DatiAnagraficiVettore>
  //                      <IdFiscaleIVA>
  //                          <IdPaese>IT</IdPaese>
  //                          <IdCodice>24681012141</IdCodice>
  //                      </IdFiscaleIVA>
  //                      <Anagrafica>
  //                          <Denominazione>Trasporto spa</Denominazione>
  //                      </Anagrafica>
  //                  </DatiAnagraficiVettore>
  //                  <DataOraConsegna>2022-03-01T14:26:39</DataOraConsegna>
  //              </DatiTrasporto>
  //          </DatiGenerali>
  //          <DatiBeniServizi>
  //              <DettaglioLinee>
  //                  <NumeroLinea>1</NumeroLinea>
  //                  <Descrizione>DESCRIZIONE DELLA FORNITURA</Descrizione>
  //                  <Quantita>5.005</Quantita>
  //                  <PrezzoUnitario>1.00</PrezzoUnitario>
  //                  <PrezzoTotale>5.00</PrezzoTotale>
  //                  <AliquotaIVA>22.00</AliquotaIVA>
  //              </DettaglioLinee>
  //              <DatiRiepilogo>
  //                  <AliquotaIVA>22.00</AliquotaIVA>
  //                  <ImponibileImporto>5.00</ImponibileImporto>
  //                  <Imposta>1.10</Imposta>
  //                  <EsigibilitaIVA>I</EsigibilitaIVA>
  //              </DatiRiepilogo>
  //          </DatiBeniServizi>
  //          <DatiPagamento>
  //              <CondizioniPagamento>TP01</CondizioniPagamento>
  //              <DettaglioPagamento>
  //                  <ModalitaPagamento>MP01</ModalitaPagamento>
  //                  <DataScadenzaPagamento>2017-02-18</DataScadenzaPagamento>
  //                  <ImportoPagamento>6.10</ImportoPagamento>
  //              </DettaglioPagamento>
  //          </DatiPagamento>
  //      </FatturaElettronicaBody>
  //  </p:FatturaElettronica>

  xmlToSign := TXml.Create;
  xmlToSign.Tag := 'p:FatturaElettronica';
  xmlToSign.AddAttribute('xmlns:ds','http://www.w3.org/2000/09/xmldsig#');
  xmlToSign.AddAttribute('xmlns:p','http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2');
  xmlToSign.AddAttribute('xmlns:xsi','http://www.w3.org/2001/XMLSchema-instance');
  xmlToSign.AddAttribute('versione','FPR12');
  xmlToSign.AddAttribute('xsi:schemaLocation','http://ivaservizi.agenziaentrate.gov.it/docs/xsd/fatture/v1.2 http://www.fatturapa.gov.it/export/fatturazione/sdi/fatturapa/v1.2/Schema_del_file_xml_FatturaPA_versione_1.2.xsd');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|DatiTrasmissione|IdTrasmittente|IdPaese','IT');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|DatiTrasmissione|IdTrasmittente|IdCodice','01234567890');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|DatiTrasmissione|ProgressivoInvio','00001');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|DatiTrasmissione|FormatoTrasmissione','FPR12');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|DatiTrasmissione|CodiceDestinatario','0000000');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|DatiTrasmissione|PECDestinatario','betagamma@pec.it');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|DatiAnagrafici|IdFiscaleIVA|IdPaese','IT');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|DatiAnagrafici|IdFiscaleIVA|IdCodice','01234567890');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|DatiAnagrafici|Anagrafica|Denominazione','ALPHA SRL');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|DatiAnagrafici|RegimeFiscale','RF19');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|Sede|Indirizzo','VIALE ROMA 543');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|Sede|CAP','07100');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|Sede|Comune','SASSARI');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|Sede|Provincia','SS');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CedentePrestatore|Sede|Nazione','IT');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|DatiAnagrafici|CodiceFiscale','09876543210');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|DatiAnagrafici|Anagrafica|Denominazione','AMMINISTRAZIONE BETA');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|Sede|Indirizzo','VIA TORINO 38-B');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|Sede|CAP','00145');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|Sede|Comune','ROMA');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|Sede|Provincia','RM');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|Sede|Nazione','IT');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|StabileOrganizzazione|Indirizzo','VIA CASELLE');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|StabileOrganizzazione|NumeroCivico','4/D');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|StabileOrganizzazione|CAP','25027');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|StabileOrganizzazione|Comune','QUINZANO D''OGLIO');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|StabileOrganizzazione|Provincia','BS');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|StabileOrganizzazione|Nazione','IT');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|RappresentanteFiscale|IdFiscaleIVA|IdPaese','DE');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|RappresentanteFiscale|IdFiscaleIVA|IdCodice','DE12345');
  xmlToSign.UpdateChildContent('FatturaElettronicaHeader|CessionarioCommittente|RappresentanteFiscale|Denominazione','RFCC - DENOMINAZIONE');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiGeneraliDocumento|TipoDocumento','TD01');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiGeneraliDocumento|Divisa','EUR');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiGeneraliDocumento|Data','2022-03-03');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiGeneraliDocumento|Numero','123');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiGeneraliDocumento|Causale','LA FATTURA FA RIFERIMENTO AD UNA OPERAZIONE AAAA');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiGeneraliDocumento|Causale[1]','SEGUE DESCRIZIONE CAUSALE NEL CASO IN CUI NON SIANO STATI SUFFICIENTI 200 CARATTERI AAAAAAAAAAA BBBBBBBBBBBBBBBBB');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiOrdineAcquisto|RiferimentoNumeroLinea','1');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiOrdineAcquisto|IdDocumento','66685');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiOrdineAcquisto|NumItem','1');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiOrdineAcquisto|CodiceCUP','123abc');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiOrdineAcquisto|CodiceCIG','456def');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiContratto|RiferimentoNumeroLinea','1');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiContratto|IdDocumento','123');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiContratto|Data','2022-01-01');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiContratto|NumItem','5');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiContratto|CodiceCUP','123abc');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiContratto|CodiceCIG','456def');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiConvenzione|RiferimentoNumeroLinea','1');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiConvenzione|IdDocumento','456');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiConvenzione|NumItem','5');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiConvenzione|CodiceCUP','123abc');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiConvenzione|CodiceCIG','456def');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiRicezione|RiferimentoNumeroLinea','1');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiRicezione|IdDocumento','789');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiRicezione|NumItem','5');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiRicezione|CodiceCUP','123abc');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiRicezione|CodiceCIG','456def');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiTrasporto|DatiAnagraficiVettore|IdFiscaleIVA|IdPaese','IT');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiTrasporto|DatiAnagraficiVettore|IdFiscaleIVA|IdCodice','24681012141');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiTrasporto|DatiAnagraficiVettore|Anagrafica|Denominazione','Trasporto spa');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiGenerali|DatiTrasporto|DataOraConsegna','2022-03-01T14:26:39');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DettaglioLinee|NumeroLinea','1');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DettaglioLinee|Descrizione','DESCRIZIONE DELLA FORNITURA');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DettaglioLinee|Quantita','5.005');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DettaglioLinee|PrezzoUnitario','1.00');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DettaglioLinee|PrezzoTotale','5.00');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DettaglioLinee|AliquotaIVA','22.00');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DatiRiepilogo|AliquotaIVA','22.00');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DatiRiepilogo|ImponibileImporto','5.00');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DatiRiepilogo|Imposta','1.10');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiBeniServizi|DatiRiepilogo|EsigibilitaIVA','I');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiPagamento|CondizioniPagamento','TP01');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiPagamento|DettaglioPagamento|ModalitaPagamento','MP01');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiPagamento|DettaglioPagamento|DataScadenzaPagamento','2017-02-18');
  xmlToSign.UpdateChildContent('FatturaElettronicaBody|DatiPagamento|DettaglioPagamento|ImportoPagamento','6.10');

  gen := TXmlDSigGen.Create;

  gen.SigLocation := 'p:FatturaElettronica';
  gen.SigLocationMod := 0;
  gen.SigId := 'signature-5580-7534-6530-8286';
  gen.AddSignatureNamespace('xadesv1410','http://uri.etsi.org/01903/v1.4.1');
  gen.AddSignatureNamespace('xades','http://uri.etsi.org/01903/v1.3.2#');
  //  xmlRoot tag = p:FatturaElettronica
  //  has xmlns:ds!
  gen.SigValueId := 'signature-value-5957-3819-1360-0727';
  gen.SignedInfoCanonAlg := 'EXCL_C14N';
  gen.SignedInfoDigestMethod := 'sha256';

  //  Set the KeyInfoId before adding references..
  gen.KeyInfoId := 'key-info-7422-1087-7530-8569';

  //  Create the following signed properties object to be added to the signature:

  //  Use this online tool to generate code from sample XML: 
  //  Generate Code to Create XML

  //  <xades:QualifyingProperties Target="#signature-5580-7534-6530-8286">
  //      <xades:SignedProperties Id="signed-properties-1545-8800-2160-3000">
  //          <xades:SignedSignatureProperties>
  //              <xades:SigningTime>TO BE GENERATED BY CHILKAT</xades:SigningTime>
  //              <xades:SigningCertificate>
  //                  <xades:Cert>
  //                      <xades:CertDigest>
  //                          <ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
  //                          <ds:DigestValue>TO BE GENERATED BY CHILKAT</ds:DigestValue>
  //  
  //                      </xades:CertDigest>
  //                      <xades:IssuerSerial>
  //                          <ds:X509IssuerName>TO BE GENERATED BY CHILKAT</ds:X509IssuerName>
  //                          <ds:X509SerialNumber>TO BE GENERATED BY CHILKAT</ds:X509SerialNumber>
  //                      </xades:IssuerSerial>
  //                  </xades:Cert>
  //              </xades:SigningCertificate>
  //          </xades:SignedSignatureProperties>
  //      </xades:SignedProperties>
  //      <xades:UnsignedProperties>
  //          <xades:UnsignedSignatureProperties>
  //              <xades:SignatureTimeStamp Id="signature-timestamp-5561-8212-3316-5191">
  //                  <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  //                  <xades:EncapsulatedTimeStamp Encoding="http://uri.etsi.org/01903/v1.2.2#DER">TO BE GENERATED BY CHILKAT</xades:EncapsulatedTimeStamp>
  //              </xades:SignatureTimeStamp>
  //          </xades:UnsignedSignatureProperties>
  //      </xades:UnsignedProperties>
  //  </xades:QualifyingProperties>

  //  Note: Chilkat will automatically fill in the values marked as "TO BE GENERATED BY CHILKAT" at the time of signing.
  //  The EncapsulatedTimestamp will be automatically generated.

  object1 := TXml.Create;
  object1.Tag := 'xades:QualifyingProperties';
  object1.AddAttribute('Target','#signature-5580-7534-6530-8286');
  object1.UpdateAttrAt('xades:SignedProperties',True,'Id','signed-properties-1545-8800-2160-3000');
  object1.UpdateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime','TO BE GENERATED BY CHILKAT');
  object1.UpdateAttrAt('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestMethod',True,'Algorithm','http://www.w3.org/2001/04/xmlenc#sha256');
  object1.UpdateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestValue','TO BE GENERATED BY CHILKAT');
  object1.UpdateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:IssuerSerialV2','TO BE GENERATED BY CHILKAT');
  object1.UpdateAttrAt('xades:UnsignedProperties|xades:UnsignedSignatureProperties|xades:SignatureTimeStamp',True,'Id','signature-timestamp-5561-8212-3316-5191');
  object1.UpdateAttrAt('xades:UnsignedProperties|xades:UnsignedSignatureProperties|xades:SignatureTimeStamp|ds:CanonicalizationMethod',True,'Algorithm','http://www.w3.org/2001/10/xml-exc-c14n#');
  object1.UpdateAttrAt('xades:UnsignedProperties|xades:UnsignedSignatureProperties|xades:SignatureTimeStamp|xades:EncapsulatedTimeStamp',True,'Encoding','http://uri.etsi.org/01903/v1.2.2#DER');
  object1.UpdateChildContent('xades:UnsignedProperties|xades:UnsignedSignatureProperties|xades:SignatureTimeStamp|xades:EncapsulatedTimeStamp','TO BE GENERATED BY CHILKAT');

  gen.AddObject('signature-object-8923-2359-1722-2161',object1.GetXml(),'','');

  //  -------- Reference 1 --------
  //  <ds:Transforms>
  //      <ds:Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2">
  //          <dsig-xpath:XPath xmlns:dsig-xpath="http://www.w3.org/2002/06/xmldsig-filter2" Filter="subtract">/descendant::ds:Signature</dsig-xpath:XPath>
  //      </ds:Transform>
  //      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  //  </ds:Transforms>

  xml1 := TXml.Create;
  xml1.Tag := 'ds:Transforms';
  xml1.UpdateAttrAt('ds:Transform',True,'Algorithm','http://www.w3.org/2002/06/xmldsig-filter2');
  xml1.UpdateAttrAt('ds:Transform|dsig-xpath:XPath',True,'xmlns:dsig-xpath','http://www.w3.org/2002/06/xmldsig-filter2');
  xml1.UpdateAttrAt('ds:Transform|dsig-xpath:XPath',True,'Filter','subtract');
  xml1.UpdateChildContent('ds:Transform|dsig-xpath:XPath','/descendant::ds:Signature');
  xml1.UpdateAttrAt('ds:Transform[1]',True,'Algorithm','http://www.w3.org/2001/10/xml-exc-c14n#');

  gen.AddSameDocRef2('','sha256',xml1,'');

  //  -------- Reference 2 --------
  //  <ds:Transforms>
  //      <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  //  </ds:Transforms>

  xml2 := TXml.Create;
  xml2.Tag := 'ds:Transforms';
  xml2.UpdateAttrAt('ds:Transform',True,'Algorithm','http://www.w3.org/2001/10/xml-exc-c14n#');

  gen.AddObjectRef2('signed-properties-1545-8800-2160-3000','sha256',xml2,'http://uri.etsi.org/01903#SignedProperties');

  //  Provide a certificate + private key. (PFX password is test123)
  cert := TCert.Create;
  success := cert.LoadPfxFile('qa_data/pfx/cert_test123.pfx','test123');
  if (success <> True) then
    begin
      WriteLn(cert.LastErrorText);
      Exit;
    end;
  gen.SetX509Cert(cert,True);

  gen.KeyInfoType := 'X509Data+KeyValue';
  gen.X509Type := 'Certificate';

  //  Load XML to be signed...
  sbXml := TStringBuilder.Create;
  xmlToSign.GetXmlSb(sbXml);

  gen.Behaviors := 'IndentedSignature,OmitAlreadyDefinedSigNamespace';

  //  -------------------------------------------------------------------------------------------
  //  To have the EncapsulatedTimeStamp automatically added, we only need to do 2 things.
  //  1) Add the <xades:EncapsulatedTimeStamp Encoding="http://uri.etsi.org/01903/v1.2.2#DER">TO BE GENERATED BY CHILKAT</xades:EncapsulatedTimeStamp>
  //     to the unsigned properties.
  //  2) Specify the TSA URL (Timestamping Authority URL).
  //     Here we specify the TSA URL:
  //  -------------------------------------------------------------------------------------------

  jsonTsa := TJsonObject.Create;
  jsonTsa.UpdateString('timestampToken.tsaUrl','http://timestamp.digicert.com');
  jsonTsa.UpdateBool('timestampToken.requestTsaCert',True);
  gen.SetTsa(jsonTsa);

  //  Sign the XML...
  success := gen.CreateXmlDSigSb(sbXml);
  if (success <> True) then
    begin
      WriteLn(gen.LastErrorText);
      Exit;
    end;

  //  Save the signed XML to a file.
  success := sbXml.WriteFile('qa_output/signedXml.xml','utf-8',False);

  //  ----------------------------------------
  //  Verify the signatures we just produced...
  verifier := TXmlDSig.Create;
  success := verifier.LoadSignatureSb(sbXml);
  if (success <> True) then
    begin
      WriteLn(verifier.LastErrorText);
      Exit;
    end;

  //  Add "VerifyEncapsulatedTimeStamp" to the UncommonOptions to also verify any EncapsulatedTimeStamps
  verifier.UncommonOptions := 'VerifyEncapsulatedTimeStamp';

  numSigs := verifier.NumSignatures;
  verifyIdx := 0;
  while verifyIdx < numSigs do
    begin
      verifier.Selector := verifyIdx;
      verified := verifier.VerifySignature(True);
      if (verified <> True) then
        begin
          WriteLn(verifier.LastErrorText);
          Exit;
        end;
      verifyIdx := verifyIdx + 1;
    end;

  WriteLn('All signatures were successfully verified.');


  xmlToSign.Free;
  gen.Free;
  object1.Free;
  xml1.Free;
  xml2.Free;
  cert.Free;
  sbXml.Free;
  jsonTsa.Free;
  verifier.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.