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