Java Requires Chilkat v11.0.0+
Chilkat2 Java
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 Java Downloads
import com.chilkatsoft.chilkat2.ChilkatException;
import com.chilkatsoft.chilkat2.PrivateKey;
import com.chilkatsoft.chilkat2.Rsa;
import com.chilkatsoft.chilkat2.StringBuilder;
import com.chilkatsoft.chilkat2.Xml;
public class ChilkatExample {
public static void main(String[] args) {
// 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 xml = new Xml();
// 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");
} catch (ChilkatException e) {
System.out.println("Failed to load initial XML file.");
return;
}
// Get a reference to the "DA" element
Xml daXml = xml.findChild("Documento|TED|DD|CAF|DA");
if (daXml == null) {
System.out.println("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),
StringBuilder sbFlattened = new StringBuilder();
daXml.setEmitCompact(true);
daXml.setEmitXmlDecl(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.
PrivateKey privKey = new PrivateKey();
try {
privKey.loadAnyFormatFile("qa_data/rsa/rsaPrivKey_pkcs8.pem", "");
} catch (ChilkatException e) {
System.out.println(e.getLastErrorText());
return;
}
Rsa rsa = new Rsa();
rsa.usePrivateKey(privKey);
rsa.setEncodingMode("base64");
rsa.setCharset("iso-8859-1");
String 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.close();
// See what we have:
xml.setEmitCompact(false);
xml.setEmitXmlDecl(true);
System.out.println(xml.getXml());
xml.saveXml("qa_data/xml_dsig/sii_cl/test_1.xml");
}
}