Sample code for 30+ languages & platforms
Tcl Requires Chilkat v11.0.0+

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

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 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