Sample code for 30+ languages & platforms
Dart

Create SOAP with one VeriFactu Digitally Signed Registration Record

See more Verifactu Examples

Creates a SOAP message containing a single digitally signed invoice registration record, formatted according to the specifications for Spain's Veri*Factu system.

Chilkat Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  // Create the following SOAP XML containing one Veri*Factu record to be signed...

  // <?xml version="1.0" encoding="UTF-8"?>
  // <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:sum="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd" xmlns:sum1="https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd" xmlns:xd="http://www.w3.org/2000/09/xmldsig#">
  // 	<soapenv:Header/>
  // 	<soapenv:Body>
  // 		<sum:RegFactuSistemaFacturacion>
  // 			<sum:Cabecera>
  // 				<sum1:ObligadoEmision>
  // 					<sum1:NombreRazon>XYZ STORE SL</sum1:NombreRazon>
  // 					<sum1:NIF>B99999999</sum1:NIF>
  // 				</sum1:ObligadoEmision>
  // 				<sum1:RemisionRequerimiento>
  // 					<sum1:RefRequerimiento>3333333333</sum1:RefRequerimiento>
  // 					<sum1:FinRequerimiento>S</sum1:FinRequerimiento>
  // 				</sum1:RemisionRequerimiento>
  // 			</sum:Cabecera>
  // 			<sum:RegistroFactura>
  // 				<sum1:RegistroAlta Id="001-2020003408">
  // 					<sum1:IDVersion>1.0</sum1:IDVersion>
  // 					<sum1:IDFactura>
  // 						<sum1:IDEmisorFactura>89890001K</sum1:IDEmisorFactura>
  // 						<sum1:NumSerieFactura>12345678-G66</sum1:NumSerieFactura>
  // 						<sum1:FechaExpedicionFactura>03-02-2025</sum1:FechaExpedicionFactura>
  // 					</sum1:IDFactura>
  // 					<sum1:NombreRazonEmisor>certificado uno telematicas</sum1:NombreRazonEmisor>
  // 					<sum1:Subsanacion>N</sum1:Subsanacion>
  // 					<sum1:RechazoPrevio>N</sum1:RechazoPrevio>
  // 					<sum1:TipoFactura>R3</sum1:TipoFactura>
  // 					<sum1:TipoRectificativa>I</sum1:TipoRectificativa>
  // 					<sum1:FacturasRectificadas>
  // 						<sum1:IDFacturaRectificada>
  // 							<sum1:IDEmisorFactura>89890001K</sum1:IDEmisorFactura>
  // 							<sum1:NumSerieFactura>12345600-G66</sum1:NumSerieFactura>
  // 							<sum1:FechaExpedicionFactura>01-04-2024</sum1:FechaExpedicionFactura>
  // 						</sum1:IDFacturaRectificada>
  // 					</sum1:FacturasRectificadas>
  // 					<sum1:FechaOperacion>03-02-2025</sum1:FechaOperacion>
  // 					<sum1:DescripcionOperacion>fecha entrega</sum1:DescripcionOperacion>
  // 					<sum1:Destinatarios>
  // 						<sum1:IDDestinatario>
  // 							<sum1:NombreRazon>certificado dos telematicas</sum1:NombreRazon>
  // 							<sum1:NIF>89890002E</sum1:NIF>
  // 						</sum1:IDDestinatario>
  // 					</sum1:Destinatarios>
  // 					<sum1:Desglose>
  // 						<sum1:DetalleDesglose>
  // 							<sum1:ClaveRegimen>01</sum1:ClaveRegimen>
  // 							<sum1:CalificacionOperacion>S1</sum1:CalificacionOperacion>
  // 							<sum1:TipoImpositivo>4</sum1:TipoImpositivo>
  // 							<sum1:BaseImponibleOimporteNoSujeto>10</sum1:BaseImponibleOimporteNoSujeto>
  // 							<sum1:CuotaRepercutida>0.4</sum1:CuotaRepercutida>
  // 						</sum1:DetalleDesglose>
  // 						<sum1:DetalleDesglose>
  // 							<sum1:ClaveRegimen>01</sum1:ClaveRegimen>
  // 							<sum1:CalificacionOperacion>S1</sum1:CalificacionOperacion>
  // 							<sum1:TipoImpositivo>21</sum1:TipoImpositivo>
  // 							<sum1:BaseImponibleOimporteNoSujeto>100</sum1:BaseImponibleOimporteNoSujeto>
  // 							<sum1:CuotaRepercutida>21</sum1:CuotaRepercutida>
  // 						</sum1:DetalleDesglose>
  // 						<sum1:DetalleDesglose>
  // 							<sum1:ClaveRegimen>05</sum1:ClaveRegimen>
  // 							<sum1:CalificacionOperacion>S1</sum1:CalificacionOperacion>
  // 							<sum1:TipoImpositivo>10</sum1:TipoImpositivo>
  // 							<sum1:BaseImponibleOimporteNoSujeto>100</sum1:BaseImponibleOimporteNoSujeto>
  // 							<sum1:CuotaRepercutida>10</sum1:CuotaRepercutida>
  // 						</sum1:DetalleDesglose>
  // 					</sum1:Desglose>
  // 					<sum1:CuotaTotal>41.4</sum1:CuotaTotal>
  // 					<sum1:ImporteTotal>241.4</sum1:ImporteTotal>
  // 					<sum1:Encadenamiento>
  // 						<sum1:RegistroAnterior>
  // 							<sum1:IDEmisorFactura>89890001K</sum1:IDEmisorFactura>
  // 							<sum1:NumSerieFactura>12345677-G33</sum1:NumSerieFactura>
  // 							<sum1:FechaExpedicionFactura>15-04-2024</sum1:FechaExpedicionFactura>
  // 							<sum1:Huella>C9AF4AF1EF5EBBA700350DE3EEF12C2D355C56AC56F13DB2A25E0031BD2B7ED5</sum1:Huella>
  // 						</sum1:RegistroAnterior>
  // 					</sum1:Encadenamiento>
  // 					<sum1:SistemaInformatico>
  // 						<sum1:NombreRazon>CERTIFICADO UNO TELEMATICAS</sum1:NombreRazon>
  // 						<sum1:NIF>89890001K</sum1:NIF>
  // 						<sum1:NombreSistemaInformatico>NombreSistemaInformatico</sum1:NombreSistemaInformatico>
  // 						<sum1:IdSistemaInformatico>77</sum1:IdSistemaInformatico>
  // 						<sum1:Version>1.0.03</sum1:Version>
  // 						<sum1:NumeroInstalacion>383</sum1:NumeroInstalacion>
  // 						<sum1:TipoUsoPosibleSoloVerifactu>S</sum1:TipoUsoPosibleSoloVerifactu>
  // 						<sum1:TipoUsoPosibleMultiOT>N</sum1:TipoUsoPosibleMultiOT>
  // 						<sum1:IndicadorMultiplesOT>N</sum1:IndicadorMultiplesOT>
  // 					</sum1:SistemaInformatico>
  // 					<sum1:FechaHoraHusoGenRegistro>2025-02-03T14:30:00+01:00</sum1:FechaHoraHusoGenRegistro>
  // 					<sum1:TipoHuella>01</sum1:TipoHuella>
  // 					<sum1:Huella>FF954378B64ED331A9B2366AD317D86E9DEC1716B12DD0ACCB172A6DC4C105AA</sum1:Huella>
  // 				</sum1:RegistroAlta>
  // 			</sum:RegistroFactura>
  // 		</sum:RegFactuSistemaFacturacion>
  // 	</soapenv:Body>
  // </soapenv:Envelope>

  final registroAltaId = '001-2020003408';

  final xml = CkXml();
  xml.tag = 'soapenv:Envelope';
  xml.addAttribute('xmlns:soapenv', 'http://schemas.xmlsoap.org/soap/envelope/');
  xml.addAttribute('xmlns:sum', 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroLR.xsd');
  xml.addAttribute('xmlns:sum1', 'https://www2.agenciatributaria.gob.es/static_files/common/internet/dep/aplicaciones/es/aeat/tike/cont/ws/SuministroInformacion.xsd');
  xml.addAttribute('xmlns:xd', 'http://www.w3.org/2000/09/xmldsig#');
  xml.updateChildContent('soapenv:Header', '');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:Cabecera|sum1:ObligadoEmision|sum1:NombreRazon', 'XYZ STORE SL');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:Cabecera|sum1:ObligadoEmision|sum1:NIF', 'B99999999');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:Cabecera|sum1:RemisionRequerimiento|sum1:RefRequerimiento', '3333333333');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:Cabecera|sum1:RemisionRequerimiento|sum1:FinRequerimiento', 'S');

  // This Id is URI in the XML digital signature Reference.
  xml.updateAttrAt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta', true, 'Id', registroAltaId);

  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:IDVersion', '1.0');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:IDFactura|sum1:IDEmisorFactura', '89890001K');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:IDFactura|sum1:NumSerieFactura', '12345678-G66');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:IDFactura|sum1:FechaExpedicionFactura', '03-02-2025');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:NombreRazonEmisor', 'certificado uno telematicas');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Subsanacion', 'N');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:RechazoPrevio', 'N');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:TipoFactura', 'R3');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:TipoRectificativa', 'I');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:FacturasRectificadas|sum1:IDFacturaRectificada|sum1:IDEmisorFactura', '89890001K');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:FacturasRectificadas|sum1:IDFacturaRectificada|sum1:NumSerieFactura', '12345600-G66');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:FacturasRectificadas|sum1:IDFacturaRectificada|sum1:FechaExpedicionFactura', '01-04-2024');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:FechaOperacion', '03-02-2025');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:DescripcionOperacion', 'fecha entrega');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Destinatarios|sum1:IDDestinatario|sum1:NombreRazon', 'certificado dos telematicas');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Destinatarios|sum1:IDDestinatario|sum1:NIF', '89890002E');

  var i = 0;
  xml.i = i;
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:ClaveRegimen', 01);
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:CalificacionOperacion', 'S1');
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:TipoImpositivo', 4);
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:BaseImponibleOimporteNoSujeto', 10);
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:CuotaRepercutida', '0.4');

  i++;
  xml.i = i;
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:ClaveRegimen', 01);
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:CalificacionOperacion', 'S1');
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:TipoImpositivo', 21);
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:BaseImponibleOimporteNoSujeto', 100);
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:CuotaRepercutida', 21);

  i++;
  xml.i = i;
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:ClaveRegimen', 05);
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:CalificacionOperacion', 'S1');
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:TipoImpositivo', 10);
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:BaseImponibleOimporteNoSujeto', 100);
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Desglose|sum1:DetalleDesglose[i]|sum1:CuotaRepercutida', 10);

  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:CuotaTotal', '41.4');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:ImporteTotal', '241.4');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Encadenamiento|sum1:RegistroAnterior|sum1:IDEmisorFactura', '89890001K');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Encadenamiento|sum1:RegistroAnterior|sum1:NumSerieFactura', '12345677-G33');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Encadenamiento|sum1:RegistroAnterior|sum1:FechaExpedicionFactura', '15-04-2024');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Encadenamiento|sum1:RegistroAnterior|sum1:Huella', 'C9AF4AF1EF5EBBA700350DE3EEF12C2D355C56AC56F13DB2A25E0031BD2B7ED5');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:NombreRazon', 'CERTIFICADO UNO TELEMATICAS');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:NIF', '89890001K');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:NombreSistemaInformatico', 'NombreSistemaInformatico');
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:IdSistemaInformatico', 77);
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:Version', '1.0.03');
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:NumeroInstalacion', 383);
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:TipoUsoPosibleSoloVerifactu', 'S');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:TipoUsoPosibleMultiOT', 'N');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:SistemaInformatico|sum1:IndicadorMultiplesOT', 'N');
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:FechaHoraHusoGenRegistro', '2025-02-03T14:30:00+01:00');
  xml.updateChildContentInt('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:TipoHuella', 01);
  xml.updateChildContent('soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta|sum1:Huella', 'FF954378B64ED331A9B2366AD317D86E9DEC1716B12DD0ACCB172A6DC4C105AA');

  // Generate an ID such as "xmldsig-90637596-e368-4bd0-bcf8-d9a7be617d9a"
  final sbSigId = CkStringBuilder();
  sbSigId.append('xmldsig-');
  sbSigId.appendUuid(true);

  // Generate an ID such as "xmldsig-90637596-e368-4bd0-bcf8-d9a7be617d9a-sigvalue"
  final sbSigValueId = CkStringBuilder();
  sbSigValueId.appendSb(sbSigId);
  sbSigValueId.append('-sigvalue');

  // Generate an ID such as "xmldsig-90637596-e368-4bd0-bcf8-d9a7be617d9a-signedprops"
  final sbSignedPropsId = CkStringBuilder();
  sbSignedPropsId.appendSb(sbSigId);
  sbSignedPropsId.append('-signedprops');

  // Generate an ID such as "xmldsig-90637596-e368-4bd0-bcf8-d9a7be617d9a-ref0"
  final sbObjectRefId = CkStringBuilder();
  sbObjectRefId.appendSb(sbSigId);
  sbObjectRefId.append('-ref0');

  final gen = CkXmlDSigGen();

  gen.sigLocation = 'soapenv:Envelope|soapenv:Body|sum:RegFactuSistemaFacturacion|sum:RegistroFactura|sum1:RegistroAlta';
  gen.sigLocationMod = 0;
  gen.sigId = sbSigId.getAsString();
  gen.sigNamespacePrefix = 'ds';
  gen.sigNamespaceUri = 'http://www.w3.org/2000/09/xmldsig#';
  gen.sigValueId = sbSigValueId.getAsString();
  gen.signedInfoCanonAlg = 'C14N';
  gen.signedInfoDigestMethod = 'sha256';

  // Create an Object to be added to the Signature.
  final object1 = CkXml();
  object1.tag = 'xades:QualifyingProperties';
  object1.addAttribute('xmlns:xades', 'http://uri.etsi.org/01903/v1.3.2#');
  object1.addAttribute('xmlns:xades141', 'http://uri.etsi.org/01903/v1.4.1#');

  // "#xmldsig-90637596-e368-4bd0-bcf8-d9a7be617d9a"
  sbSigId.prepend('#');
  object1.addAttribute('Target', sbSigId.getAsString());

  object1.updateAttrAt('xades:SignedProperties', true, 'Id', sbSignedPropsId.getAsString());
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime', 'TO BE GENERATED BY CHILKAT');

  object1.updateAttrAt('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:CertDigest|ds:DigestMethod', true, 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:CertDigest|ds:DigestValue', 'TO BE GENERATED BY CHILKAT');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:IssuerSerial|ds:X509IssuerName', 'TO BE GENERATED BY CHILKAT');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert|xades:IssuerSerial|ds:X509SerialNumber', 'TO BE GENERATED BY CHILKAT');

  object1.updateAttrAt('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert[1]|xades:CertDigest|ds:DigestMethod', true, 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert[1]|xades:CertDigest|ds:DigestValue', 'TO BE GENERATED BY CHILKAT');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert[1]|xades:IssuerSerial|ds:X509IssuerName', 'TO BE GENERATED BY CHILKAT');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert[1]|xades:IssuerSerial|ds:X509SerialNumber', 'TO BE GENERATED BY CHILKAT');

  object1.updateAttrAt('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert[2]|xades:CertDigest|ds:DigestMethod', true, 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert[2]|xades:CertDigest|ds:DigestValue', 'TO BE GENERATED BY CHILKAT');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert[2]|xades:IssuerSerial|ds:X509IssuerName', 'TO BE GENERATED BY CHILKAT');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificate|xades:Cert[2]|xades:IssuerSerial|ds:X509SerialNumber', 'TO BE GENERATED BY CHILKAT');

  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Identifier', 'urn:oid:2.16.724.1.3.1.1.2.1.9');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Description', '');
  object1.updateAttrAt('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestMethod', true, 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestValue', 'G7roucf600+f03r/o0bAOQ6WAs0=');

  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyQualifiers|xades:SigPolicyQualifier|xades:SPURI', 'https://sede.administracion.gob.es/politica_de_firma_anexo_1.pdf');

  sbObjectRefId.prepend('#');

  object1.updateAttrAt('xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat', true, 'ObjectReference', sbObjectRefId.getAsString());
  object1.updateChildContent('xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:MimeType', 'text/xml');

  gen.addObject('', object1.getXml(), '', '');

  // -------- Reference 1 --------
  // The URI for this Reference is the registroAlta_id
  gen.addSameDocRef(registroAltaId, 'sha256', '', '', '');

  // Remove the "#"
  sbObjectRefId.removeCharsAt(0, 1);
  gen.setRefIdAttr(registroAltaId, sbObjectRefId.getAsString());

  // -------- Reference 2 --------
  gen.addObjectRef(sbSignedPropsId.getAsString(), 'sha256', 'C14N', '', 'http://uri.etsi.org/01903#SignedProperties');

  // Provide a certificate + private key. (PFX password is test123)
  final cert = CkCert();
  try {
    cert.loadPfxFile('qa_data/pfx/cert_test123.pfx', 'test123');
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  gen.setX509Cert(cert, true);

  gen.keyInfoType = 'X509Data+KeyValue';
  gen.x509Type = 'Certificate';

  // Load XML to be signed...
  final sbXml = CkStringBuilder();
  xml.getXmlSb(sbXml);

  gen.behaviors = 'IndentedSignature,Base64Cr13Entity';

  // Sign the XML...
  try {
    gen.createXmlDSigSb(sbXml);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

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

  // Save the signed XML to a file.
  sbXml.writeFile('c:/temp/qa_output/signedSoapXml1.xml', 'utf-8', false);

  print(sbXml.getAsString());

  // ----------------------------------------
  // Verify the signatures we just produced...
  final verifier = CkXmlDSig();
  try {
    verifier.loadSignatureSb(sbXml);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  final numSigs = verifier.numSignatures;
  var verifyIdx = 0;
  while (verifyIdx < numSigs) {
    verifier.selector = verifyIdx;
    try {
      verifier.verifySignature(true);
    } on ChilkatException catch (e) {
      print(e.lastErrorText);
      return;
    }

    verifyIdx++;
  }

  print('All signatures were successfully verified.');
}