Sample code for 30+ languages & platforms
Visual FoxPro

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 Visual FoxPro Downloads

Visual FoxPro
LOCAL lnSuccess
LOCAL loXml
LOCAL loDdXml
LOCAL loSbFlattened
LOCAL loPrivKey
LOCAL loRsa
LOCAL lcSig

lnSuccess = 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

loXml = 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>

lnSuccess = loXml.LoadXmlFile("qa_data/xml_dsig/sii_cl/test_1.xml")
IF (lnSuccess = 0) THEN
    ? "Failed to load initial XML file."
    RELEASE loXml
    CANCEL
ENDIF

* Get a reference to the "DD" element
loDdXml = loXml.FindChild("Documento|TED|DD")
IF (loXml.LastMethodSuccess = 0) THEN
    ? "Failed to find DD element"
    RELEASE loXml
    CANCEL
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), 
loSbFlattened = CreateObject('Chilkat.StringBuilder')
loDdXml.EmitCompact = 1
loDdXml.EmitXmlDecl = 0
loDdXml.GetXmlSb(loSbFlattened)

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

loPrivKey = CreateObject('Chilkat.PrivateKey')
lnSuccess = loPrivKey.LoadAnyFormatFile("qa_data/rsa/rsaPrivKey_pkcs8.pem","")
IF (lnSuccess = 0) THEN
    ? loPrivKey.LastErrorText
    RELEASE loXml
    RELEASE loSbFlattened
    RELEASE loPrivKey
    CANCEL
ENDIF

loRsa = CreateObject('Chilkat.Rsa')
loRsa.UsePrivateKey(loPrivKey)

loRsa.EncodingMode = "base64"
loRsa.Charset = "iso-8859-1"
lcSig = loRsa.SignStringENC(loSbFlattened.GetAsString(),"sha1")

* Add the FRMT signature element to the XML.
loXml.UpdateChildContent("Documento|TED|FRMT",lcSig)
loXml.UpdateAttrAt("Documento|TED|FRMT",1,"algoritmo","SHA1withRSA")

RELEASE loDdXml

* See what we have:
loXml.EmitCompact = 0
loXml.EmitXmlDecl = 1
? loXml.GetXml()

RELEASE loXml
RELEASE loSbFlattened
RELEASE loPrivKey
RELEASE loRsa