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

SII Chile - FRMT Signature Computation and Add to XML

See more XML Digital Signatures Examples

Compute the FRMT signature and add to the XML. This is the RSA signature of the SHA-1 digest of the "flattened" DD element.

Chilkat Xbase++ Downloads

Xbase++
LOCAL nSuccess
LOCAL oXml
LOCAL oDdXml
LOCAL oSbFlattened
LOCAL oPrivKey
LOCAL oRsa
LOCAL cSig

nSuccess := 0

//  This example assumes the Chilkat API to have been previously unlocked.
//  See Global Unlock Sample for sample code.

//  Also see:  Compute the FRMA Signature and Add to XML

oXml := CreateObject("Chilkat.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>
//                      <FRMA algoritmo="SHA1withRSA">...</FRMA>
//                  </CAF>
//                  ...
//              </DD>
//              ... The FRMT will be added here in another example ...
//          </TED>
//    </Documento>
//  </DTE>

nSuccess := oXml:LoadXmlFile("qa_data/xml_dsig/sii_cl/test_1.xml")
IF (nSuccess == 0)
    ? "Failed to load initial XML file."
    oXml:destroy()
    RETURN
ENDIF

//  Get a reference to the "DD" element
oDdXml := oXml:FindChild("Documento|TED|DD")
IF (oXml:LastMethodSuccess == 0)
    ? "Failed to find DD element"
    oXml:destroy()
    RETURN
ENDIF

//   We need to get the "flattened" DD 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), 
oSbFlattened := CreateObject("Chilkat.StringBuilder")
oDdXml:EmitCompact := 1
oDdXml:EmitXmlDecl := 0
oDdXml:GetXmlSb(oSbFlattened)

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

oPrivKey := CreateObject("Chilkat.PrivateKey")
nSuccess := oPrivKey:LoadAnyFormatFile("qa_data/rsa/rsaPrivKey_pkcs8.pem", "")
IF (nSuccess == 0)
    ? oPrivKey:LastErrorText
    oXml:destroy()
    oSbFlattened:destroy()
    oPrivKey:destroy()
    RETURN
ENDIF

oRsa := CreateObject("Chilkat.Rsa")
oRsa:UsePrivateKey(oPrivKey)

oRsa:EncodingMode := "base64"
oRsa:Charset := "iso-8859-1"
cSig := oRsa:SignStringENC(oSbFlattened:GetAsString(), "sha1")

//  Add the FRMT signature element to the XML.
oXml:UpdateChildContent("Documento|TED|FRMT", cSig)
oXml:UpdateAttrAt("Documento|TED|FRMT", 1, "algoritmo", "SHA1withRSA")

oDdXml:destroy()

//  See what we have:
oXml:EmitCompact := 0
oXml:EmitXmlDecl := 1
? oXml:GetXml()

oXml:destroy()
oSbFlattened:destroy()
oPrivKey:destroy()
oRsa:destroy()