Tcl
Tcl
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 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 FRMT 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>
# ... The FRMA will be added here ...
# </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_0.xml"]
if {$success == 0} then {
puts "Failed to load initial XML file."
delete_CkXml $xml
exit
}
# Get a reference to the "DA" element
# daXml is a CkXml
set daXml [CkXml_FindChild $xml "Documento|TED|DD|CAF|DA"]
if {[CkXml_get_LastMethodSuccess $xml] == 0} then {
puts "Failed to find DA element"
delete_CkXml $xml
exit
}
# 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),
set sbFlattened [new_CkStringBuilder]
CkXml_put_EmitCompact $daXml 1
CkXml_put_EmitXmlDecl $daXml 0
CkXml_GetXmlSb $daXml $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 FRMA signature element to the XML.
CkXml_UpdateChildContent $xml "Documento|TED|DD|CAF|FRMA" $sig
CkXml_UpdateAttrAt $xml "Documento|TED|DD|CAF|FRMA" 1 "algoritmo" "SHA1withRSA"
delete_CkXml $daXml
# See what we have:
CkXml_put_EmitCompact $xml 0
CkXml_put_EmitXmlDecl $xml 1
puts [CkXml_getXml $xml]
CkXml_SaveXml $xml "qa_data/xml_dsig/sii_cl/test_1.xml"
delete_CkXml $xml
delete_CkStringBuilder $sbFlattened
delete_CkPrivateKey $privKey
delete_CkRsa $rsa