Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(C#) 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.
// 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> Chilkat.XmlDSigGen gen = new Chilkat.XmlDSigGen(); gen.SigLocation = "EnvioDTE"; gen.SigLocationMod = 0; gen.SigNamespacePrefix = ""; gen.SigNamespaceUri = "http://www.w3.org/2000/09/xmldsig#"; gen.SignedInfoCanonAlg = "C14N"; gen.SignedInfoDigestMethod = "sha1"; // -------- Reference 1 -------- gen.AddSameDocRef("NDTECHILE","sha1","","",""); // Provide a certificate + private key. (PFX password is test123) Chilkat.Cert cert = new Chilkat.Cert(); bool success = cert.LoadPfxFile("qa_data/pfx/cert_test123.pfx","test123"); if (success != true) { Debug.WriteLine(cert.LastErrorText); return; } gen.SetX509Cert(cert,true); gen.KeyInfoType = "X509Data+KeyValue"; gen.X509Type = "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> Chilkat.Xml xml = new Chilkat.Xml(); xml.Tag = "EnvioDTE"; xml.AddAttribute("version","1.0"); xml.AddAttribute("xmlns","http://www.sii.cl/SiiDte"); xml.AddAttribute("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance"); xml.AddAttribute("xsi:schemaLocation","http://www.sii.cl/SiiDte EnvioDTE_v10.xsd"); xml.UpdateAttrAt("SetDTE",true,"ID","NDTECHILE"); xml.UpdateAttrAt("SetDTE|Caratula",true,"version","1.0"); xml.UpdateChildContent("SetDTE|Caratula|RutEmisor","..."); xml.UpdateChildContent("SetDTE|Caratula|RutEnvia","..."); xml.UpdateChildContent("SetDTE|Caratula|RutReceptor","..."); xml.UpdateChildContent("SetDTE|Caratula|FchResol","2014-08-22"); xml.UpdateChildContent("SetDTE|Caratula|NroResol","80"); xml.UpdateChildContent("SetDTE|Caratula|TmstFirmaEnv","2020-07-17T13:19:10"); xml.UpdateChildContent("SetDTE|Caratula|SubTotDTE|TpoDTE","34"); xml.UpdateChildContent("SetDTE|Caratula|SubTotDTE|NroDTE","1"); xml.UpdateChildContent("SetDTE|EXISTING_SIGNED_XML","HERE"); Chilkat.StringBuilder sbXml = new Chilkat.StringBuilder(); xml.GetXmlSb(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. Chilkat.StringBuilder sbExisting = new Chilkat.StringBuilder(); sbExisting.LoadFile("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). int numReplaced = sbExisting.Replace("<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>",""); sbExisting.Trim(); // Insert the existing signed XML into the new XML document to be signed. numReplaced = sbXml.Replace("<EXISTING_SIGNED_XML>HERE</EXISTING_SIGNED_XML>",sbExisting.GetAsString()); // 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. gen.Behaviors = "IndentedSignature,SignExistingSignatures"; // Sign the XML... success = gen.CreateXmlDSigSb(sbXml); if (success != true) { Debug.WriteLine(gen.LastErrorText); return; } // ----------------------------------------------- // Change the XML declarator to indicate iso-8859-1 (because we'll be saving using iso-8859-1) numReplaced = sbXml.Replace("encoding=\"utf-8\"?>","encoding=\"iso-8859-1\"?>"); // Save the signed XML to a file. success = sbXml.WriteFile("qa_data/xml_dsig/sii_cl/signed2.xml","iso-8859-1",false); Debug.WriteLine(sbXml.GetAsString()); |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.