Sample code for 30+ languages & platforms
Java 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 Java Downloads

Chilkat2 Java
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");
    }
}