Visual FoxPro
Visual FoxPro
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 Visual FoxPro Downloads
LOCAL lnSuccess
LOCAL loXml
LOCAL loDaXml
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 FRMT 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>
* ... The FRMA will be added here ...
* </CAF>
* ...
* </DD>
* ... The FRMT will be added here in another example ...
* </TED>
* </Documento>
* </DTE>
lnSuccess = loXml.LoadXmlFile("qa_data/xml_dsig/sii_cl/test_0.xml")
IF (lnSuccess = 0) THEN
? "Failed to load initial XML file."
RELEASE loXml
CANCEL
ENDIF
* Get a reference to the "DA" element
loDaXml = loXml.FindChild("Documento|TED|DD|CAF|DA")
IF (loXml.LastMethodSuccess = 0) THEN
? "Failed to find DA element"
RELEASE loXml
CANCEL
ENDIF
* 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),
loSbFlattened = CreateObject('Chilkat.StringBuilder')
loDaXml.EmitCompact = 1
loDaXml.EmitXmlDecl = 0
loDaXml.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 FRMA signature element to the XML.
loXml.UpdateChildContent("Documento|TED|DD|CAF|FRMA",lcSig)
loXml.UpdateAttrAt("Documento|TED|DD|CAF|FRMA",1,"algoritmo","SHA1withRSA")
RELEASE loDaXml
* See what we have:
loXml.EmitCompact = 0
loXml.EmitXmlDecl = 1
? loXml.GetXml()
loXml.SaveXml("qa_data/xml_dsig/sii_cl/test_1.xml")
RELEASE loXml
RELEASE loSbFlattened
RELEASE loPrivKey
RELEASE loRsa