Sample code for 30+ languages & platforms
Dart

SII XML Digital Signature

See more uncategorized Examples

Example for SII XML Digital Signature.

Chilkat Dart Downloads

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

void main() {
  // Load the XML to be signed.
  final xmlToSign = CkXml();
  try {
    xmlToSign.loadXmlFile('c:/aaworkarea/eduardo/sii_unsigned.xml');
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // The sample XML to be signed looks like this:

  // <?xml version="1.0" encoding="ISO-8859-1"?>
  // <EnvioDTE xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE_v10.xsd" version="1.0">
  // <SetDTE ID="SetDocF0T33_20240425_170512">
  //  <Caratula version="1.0">
  //   <RutEmisor>99999999-4</RutEmisor>
  //   <RutEnvia>12345678-6</RutEnvia>
  //   <RutReceptor>888888000-K</RutReceptor>
  //   <FchResol>2014-08-22</FchResol>
  //   <NroResol>80</NroResol>
  //   <TmstFirmaEnv>2024-04-25T17:05:13</TmstFirmaEnv>
  //   <SubTotDTE>
  //    <TpoDTE>33</TpoDTE>
  //    <NroDTE>1</NroDTE>
  //   </SubTotDTE>
  //  </Caratula>
  // <DTE version="1.0">
  // <Documento ID="F555T55">
  // ...
  // </Documento>
  // </EnvioDTE>

  final gen = CkXmlDSigGen();

  gen.sigLocation = 'EnvioDTE|SetDTE|DTE';
  gen.sigLocationMod = 0;
  gen.sigNamespacePrefix = '';
  gen.sigNamespaceUri = 'http://www.w3.org/2000/09/xmldsig#';
  gen.signedInfoCanonAlg = 'C14N';
  gen.signedInfoDigestMethod = 'sha1';

  // -------- Reference 1 --------
  final xml1 = CkXml();
  xml1.tag = 'Transforms';
  xml1.updateAttrAt('Transform', true, 'Algorithm', 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315');

  gen.addSameDocRef2('F511T33', 'sha1', xml1, '');

  // 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();
  xmlToSign.getXmlSb(sbXml);

  gen.behaviors = 'IndentedSignature';

  // 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/signedXml.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.');
}