Sample code for 30+ languages & platforms
Dart Requires Chilkat v11.0.0+

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 Dart Downloads

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

void main() {
  // 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

  final xml = CkXml();

  // 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>

  try {
    xml.loadXmlFile('qa_data/xml_dsig/sii_cl/test_0.xml');
  } on ChilkatException {
    print('Failed to load initial XML file.');
    return;
  }

  // Get a reference to the "DA" element
  final CkXml daXml;
  try {
    daXml = xml.findChild('Documento|TED|DD|CAF|DA');
  } on ChilkatException {
    print('Failed to find DA element');
    return;
  }

  //  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), 
  final sbFlattened = CkStringBuilder();
  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.

  final privKey = CkPrivateKey();
  try {
    privKey.loadAnyFormatFile('qa_data/rsa/rsaPrivKey_pkcs8.pem', '');
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  final rsa = CkRsa();
  rsa.usePrivateKey(privKey);

  rsa.encodingMode = 'base64';
  rsa.charset = 'iso-8859-1';
  final 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');

  // See what we have:
  xml.emitCompact = false;
  xml.emitXmlDecl = true;
  print(xml.getXml());

  xml.saveXml('qa_data/xml_dsig/sii_cl/test_1.xml');
}