Lua Requires Chilkat v11.0.0+
Lua
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 Lua Downloads
local chilkat = require("chilkat")
-- 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
local xml = chilkat.Xml.new()
-- 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>
local success = xml:load_xml_file("qa_data/xml_dsig/sii_cl/test_1.xml")
if not success then
print("Failed to load initial XML file.")
return
end
-- Get a reference to the "DD" element
local ddXml = xml:find_child("Documento|TED|DD")
if not xml.last_method_success then
print("Failed to find DD element")
return
end
-- 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),
local sbFlattened = chilkat.StringBuilder.new()
ddXml.emit_compact = true
ddXml.emit_xml_decl = false
ddXml:get_xml_sb(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.
local privKey = chilkat.PrivateKey.new()
success = privKey:load_any_format_file("qa_data/rsa/rsaPrivKey_pkcs8.pem", "")
if not success then
print(privKey.last_error_text)
return
end
local rsa = chilkat.Rsa.new()
rsa:use_private_key(privKey)
rsa.encoding_mode = "base64"
rsa.charset = "iso-8859-1"
local sig = rsa:sign_string_enc(sbFlattened:get_as_string(), "sha1")
-- Add the FRMT signature element to the XML.
xml:update_child_content("Documento|TED|FRMT", sig)
xml:update_attr_at("Documento|TED|FRMT", true, "algoritmo", "SHA1withRSA")
-- See what we have:
xml.emit_compact = false
xml.emit_xml_decl = true
print(xml:get_xml())