|  | 
Chilkat  HOME  Android™  AutoIt  C  C#  C++  Chilkat2-Python  CkPython  Classic ASP  DataFlex  Delphi DLL  Go  Java  Node.js  Objective-C  PHP Extension  Perl  PowerBuilder  PowerShell  PureBasic  Ruby  SQL Server  Swift  Tcl  Unicode C  Unicode C++  VB.NET  VBScript  Visual Basic 6.0  Visual FoxPro  Xojo Plugin
| (Tcl) Apply 2nd Signature to sii.cl Factura Electrónica (Chile Servicio de Impuestos Internos)Demonstrates how to apply the 2nd signature an XML invoice according to Chilean Internal Revenue Service regulations. 
 load ./chilkat.dll # This example assumes the Chilkat API to have been previously unlocked. # See Global Unlock Sample for sample code. # In this example: Create sii.cl Factura Electr�nica (Chile Servicio de Impuestos Internos) # We signed XML structured like this: # <?xml version="1.0" encoding="iso-8859-1"?> # <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> # <Documento ID="F11T22"> # ... # </Documento> # </DTE> # To get a signature like this: # <?xml version="1.0" encoding="iso-8859-1"?> # <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> # <Documento ID="F11T22"> # ... # </Documento> # <Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> # .. # </Signature> # </DTE> # Now we wish to wrap the result of the 1st example in the following and sign again: # <?xml version="1.0" encoding="iso-8859-1"?> # <EnvioDTE version="1.0" xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE_v10.xsd"> # <SetDTE ID="NDTECHILE"> # <Caratula version="1.0"> # <RutEmisor>...</RutEmisor> # <RutEnvia>...</RutEnvia> # <RutReceptor>...</RutReceptor> # <FchResol>2014-08-22</FchResol> # <NroResol>80</NroResol> # <TmstFirmaEnv>2020-07-17T13:19:10</TmstFirmaEnv> # <SubTotDTE> # <TpoDTE>34</TpoDTE> # <NroDTE>1</NroDTE> # </SubTotDTE> # </Caratula> # <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> # <Documento ID="F11T22">...</Documento> # <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">..</Signature> # </DTE> # </SetDTE> # </EnvioDTE> # The result will be this: # <?xml version="1.0" encoding="iso-8859-1"?> # <EnvioDTE version="1.0" xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE_v10.xsd"> # <SetDTE ID="NDTECHILE"> # <Caratula version="1.0"> # <RutEmisor>...</RutEmisor> # <RutEnvia>...</RutEnvia> # <RutReceptor>...</RutReceptor> # <FchResol>2014-08-22</FchResol> # <NroResol>80</NroResol> # <TmstFirmaEnv>2020-07-17T13:19:10</TmstFirmaEnv> # <SubTotDTE> # <TpoDTE>34</TpoDTE> # <NroDTE>1</NroDTE> # </SubTotDTE> # </Caratula> # <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> # <Documento ID="F11T22">...</Documento> # <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">..</Signature> # </DTE> # </SetDTE> # <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">..</Signature> # </EnvioDTE> set gen [new_CkXmlDSigGen] CkXmlDSigGen_put_SigLocation $gen "EnvioDTE" CkXmlDSigGen_put_SigLocationMod $gen 0 CkXmlDSigGen_put_SigNamespacePrefix $gen "" CkXmlDSigGen_put_SigNamespaceUri $gen "http://www.w3.org/2000/09/xmldsig#" CkXmlDSigGen_put_SignedInfoCanonAlg $gen "C14N" CkXmlDSigGen_put_SignedInfoDigestMethod $gen "sha1" # -------- Reference 1 -------- CkXmlDSigGen_AddSameDocRef $gen "NDTECHILE" "sha1" "" "" "" # Provide a certificate + private key. (PFX password is test123) set cert [new_CkCert] set success [CkCert_LoadPfxFile $cert "qa_data/pfx/cert_test123.pfx" "test123"] if {$success != 1} then { puts [CkCert_lastErrorText $cert] delete_CkXmlDSigGen $gen delete_CkCert $cert exit } CkXmlDSigGen_SetX509Cert $gen $cert 1 CkXmlDSigGen_put_KeyInfoType $gen "X509Data+KeyValue" CkXmlDSigGen_put_X509Type $gen "Certificate" # Here's the part where we must be very careful not to disturb the existing signature. # We want to encapsulate the existing signed XML like this: # <?xml version="1.0" encoding="iso-8859-1"?> # <EnvioDTE version="1.0" xmlns="http://www.sii.cl/SiiDte" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sii.cl/SiiDte EnvioDTE_v10.xsd"> # <SetDTE ID="NDTECHILE"> # <Caratula version="1.0"> # <RutEmisor>...</RutEmisor> # <RutEnvia>...</RutEnvia> # <RutReceptor>...</RutReceptor> # <FchResol>2014-08-22</FchResol> # <NroResol>80</NroResol> # <TmstFirmaEnv>2020-07-17T13:19:10</TmstFirmaEnv> # <SubTotDTE> # <TpoDTE>34</TpoDTE> # <NroDTE>1</NroDTE> # </SubTotDTE> # </Caratula> # <EXISTING_SIGNED_XML>HERE</EXISTING_SIGNED_XML> # </SetDTE> # <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">..</Signature> # </EnvioDTE> set xml [new_CkXml] CkXml_put_Tag $xml "EnvioDTE" CkXml_AddAttribute $xml "version" "1.0" CkXml_AddAttribute $xml "xmlns" "http://www.sii.cl/SiiDte" CkXml_AddAttribute $xml "xmlns:xsi" "http://www.w3.org/2001/XMLSchema-instance" CkXml_AddAttribute $xml "xsi:schemaLocation" "http://www.sii.cl/SiiDte EnvioDTE_v10.xsd" CkXml_UpdateAttrAt $xml "SetDTE" 1 "ID" "NDTECHILE" CkXml_UpdateAttrAt $xml "SetDTE|Caratula" 1 "version" "1.0" CkXml_UpdateChildContent $xml "SetDTE|Caratula|RutEmisor" "..." CkXml_UpdateChildContent $xml "SetDTE|Caratula|RutEnvia" "..." CkXml_UpdateChildContent $xml "SetDTE|Caratula|RutReceptor" "..." CkXml_UpdateChildContent $xml "SetDTE|Caratula|FchResol" "2014-08-22" CkXml_UpdateChildContent $xml "SetDTE|Caratula|NroResol" "80" CkXml_UpdateChildContent $xml "SetDTE|Caratula|TmstFirmaEnv" "2020-07-17T13:19:10" CkXml_UpdateChildContent $xml "SetDTE|Caratula|SubTotDTE|TpoDTE" "34" CkXml_UpdateChildContent $xml "SetDTE|Caratula|SubTotDTE|NroDTE" "1" CkXml_UpdateChildContent $xml "SetDTE|EXISTING_SIGNED_XML" "HERE" set sbXml [new_CkStringBuilder] CkXml_GetXmlSb $xml $sbXml # Load our existing signed XML. # We cannot load it into a Chilkat XML object because we cannot allow anything to change, # not even indentation or whitespace. set sbExisting [new_CkStringBuilder] CkStringBuilder_LoadFile $sbExisting "qa_data/xml_dsig/sii_cl/signed1.xml" "iso-8859-1" # However, we must remove the XML declarator, and we can trim the whitespace at the very front and back (i.e. whitespace completely outside the document). set numReplaced [CkStringBuilder_Replace $sbExisting "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" ""] CkStringBuilder_Trim $sbExisting # Insert the existing signed XML into the new XML document to be signed. set numReplaced [CkStringBuilder_Replace $sbXml "<EXISTING_SIGNED_XML>HERE</EXISTING_SIGNED_XML>" [CkStringBuilder_getAsString $sbExisting]] # We now have the XML document ready for the 2nd signature to be applied... # Make sure we add the "SignExistingSignatures" behavior so that this signature includes the original signature in the digest. CkXmlDSigGen_put_Behaviors $gen "IndentedSignature,SignExistingSignatures" # Sign the XML... set success [CkXmlDSigGen_CreateXmlDSigSb $gen $sbXml] if {$success != 1} then { puts [CkXmlDSigGen_lastErrorText $gen] delete_CkXmlDSigGen $gen delete_CkCert $cert delete_CkXml $xml delete_CkStringBuilder $sbXml delete_CkStringBuilder $sbExisting exit } # ----------------------------------------------- # Change the XML declarator to indicate iso-8859-1 (because we'll be saving using iso-8859-1) set numReplaced [CkStringBuilder_Replace $sbXml "encoding=\"utf-8\"?>" "encoding=\"iso-8859-1\"?>"] # Save the signed XML to a file. set success [CkStringBuilder_WriteFile $sbXml "qa_data/xml_dsig/sii_cl/signed2.xml" "iso-8859-1" 0] puts [CkStringBuilder_getAsString $sbXml] delete_CkXmlDSigGen $gen delete_CkCert $cert delete_CkXml $xml delete_CkStringBuilder $sbXml delete_CkStringBuilder $sbExisting | ||||
© 2000-2025 Chilkat Software, Inc. All Rights Reserved.