Sample code for 30+ languages & platforms
Lua 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 Lua Downloads

Lua
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())