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

Tcl

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