Tcl
Tcl
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 Tcl Downloads
load ./chilkat.dll
set success 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
set xml [new_CkXml]
# 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>
set success [CkXml_LoadXmlFile $xml "qa_data/xml_dsig/sii_cl/test_1.xml"]
if {$success == 0} then {
puts "Failed to load initial XML file."
delete_CkXml $xml
exit
}
# Get a reference to the "DD" element
# ddXml is a CkXml
set ddXml [CkXml_FindChild $xml "Documento|TED|DD"]
if {[CkXml_get_LastMethodSuccess $xml] == 0} then {
puts "Failed to find DD element"
delete_CkXml $xml
exit
}
# 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),
set sbFlattened [new_CkStringBuilder]
CkXml_put_EmitCompact $ddXml 1
CkXml_put_EmitXmlDecl $ddXml 0
CkXml_GetXmlSb $ddXml $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.
set privKey [new_CkPrivateKey]
set success [CkPrivateKey_LoadAnyFormatFile $privKey "qa_data/rsa/rsaPrivKey_pkcs8.pem" ""]
if {$success == 0} then {
puts [CkPrivateKey_lastErrorText $privKey]
delete_CkXml $xml
delete_CkStringBuilder $sbFlattened
delete_CkPrivateKey $privKey
exit
}
set rsa [new_CkRsa]
CkRsa_UsePrivateKey $rsa $privKey
CkRsa_put_EncodingMode $rsa "base64"
CkRsa_put_Charset $rsa "iso-8859-1"
set sig [CkRsa_signStringENC $rsa [CkStringBuilder_getAsString $sbFlattened] "sha1"]
# Add the FRMT signature element to the XML.
CkXml_UpdateChildContent $xml "Documento|TED|FRMT" $sig
CkXml_UpdateAttrAt $xml "Documento|TED|FRMT" 1 "algoritmo" "SHA1withRSA"
delete_CkXml $ddXml
# See what we have:
CkXml_put_EmitCompact $xml 0
CkXml_put_EmitXmlDecl $xml 1
puts [CkXml_getXml $xml]
delete_CkXml $xml
delete_CkStringBuilder $sbFlattened
delete_CkPrivateKey $privKey
delete_CkRsa $rsa