|  | 
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
| (Unicode C) Create sii.cl Factura Electrónica (Chile Servicio de Impuestos Internos)Demonstrates how to sign an XML invoice according to Chilean Internal Revenue Service regulations. 
 #include <C_CkXmlDSigGenW.h> #include <C_CkCertW.h> #include <C_CkStringBuilderW.h> #include <C_CkXmlDSigW.h> void ChilkatSample(void) { BOOL success; HCkXmlDSigGenW gen; HCkCertW cert; HCkStringBuilderW sbXml; HCkXmlDSigW verifier; int numSigs; int verifyIdx; BOOL verified; // This example assumes the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // See: Apply 2nd Signature to sii.cl Factura Electr�nica (Chile Servicio de Impuestos Internos) // for an example showing how to apply a 2nd signature. // We want to sign XML that looks like the following: // <?xml version="1.0" encoding="iso-8859-1"?> // <DTE version="1.0" xmlns="http://www.sii.cl/SiiDte"> // <Documento ID="F13T34"> // <Encabezado> // <IdDoc> // <TipoDTE>34</TipoDTE> // <Folio>13</Folio> // <FchEmis>2020-07-17</FchEmis> // <FmaPago>1</FmaPago> // <FchVenc>2020-07-17</FchVenc> // </IdDoc> // <Emisor> // <RUTEmisor>...</RUTEmisor> // <RznSoc>...</RznSoc> // <GiroEmis>...</GiroEmis> // <Acteco>...</Acteco> // <DirOrigen>...</DirOrigen> // <CmnaOrigen>...</CmnaOrigen> // <CiudadOrigen>...</CiudadOrigen> // </Emisor> // <Receptor> // <RUTRecep>...</RUTRecep> // <RznSocRecep>...</RznSocRecep> // <GiroRecep>...</GiroRecep> // <Contacto/> // <DirRecep>...</DirRecep> // <CmnaRecep>...</CmnaRecep> // <CiudadRecep>...</CiudadRecep> // </Receptor> // <Totales> // <MntExe>14999</MntExe> // <MntTotal>14999</MntTotal> // </Totales> // </Encabezado> // <Detalle> // <NroLinDet>1</NroLinDet> // <CdgItem> // <TpoCodigo>INT</TpoCodigo> // <VlrCodigo>1</VlrCodigo> // </CdgItem> // <NmbItem>Atenci�n profesional mes de Junio 2020</NmbItem> // <QtyItem>1</QtyItem> // <UnmdItem>UNI</UnmdItem> // <PrcItem>14999</PrcItem> // <MontoItem>14999</MontoItem> // </Detalle> // <TED version="1.0"> // <DD> // <RE>99972220-K</RE> // <TD>34</TD> // <F>13</F> // <FE>2020-07-17</FE> // <RR>99942999-2</RR> // <RSR>...</RSR> // <MNT>14999</MNT> // <IT1>Atencion profesional mes de Junio 2020</IT1> // <CAF version="1.0"> // <DA> // <RE>99972220-K</RE> // <RS>...</RS> // <TD>34</TD> // <RNG> // <D>3</D> // <H>12</H> // </RNG> // <FA>2019-10-10</FA> // <RSAPK> // <M>2zHVYpcVNQRvS2yFuqdrh...TEQZx/m0t9HVTgWKZvlc6LSQ==</M> // <E>Aw==</E> // </RSAPK> // <IDK>300</IDK> // </DA> // <FRMA algoritmo="SHA1withRSA">LaVkjISGu...sBtsQL1jR9lw==</FRMA> // </CAF> // <TSTED>2020-07-17T13:19:10</TSTED> // </DD> // <FRMT algoritmo="SHA1withRSA">LxZr6zmXRZIfTz7...IXS6sp4vfz2fIsA==</FRMT> // </TED> // <TmstFirma>2020-07-17T13:19:10</TmstFirma> // </Documento> // </DTE> success = TRUE; gen = CkXmlDSigGenW_Create(); CkXmlDSigGenW_putSigLocation(gen,L"DTE"); CkXmlDSigGenW_putSigLocationMod(gen,0); CkXmlDSigGenW_putSigNamespacePrefix(gen,L""); CkXmlDSigGenW_putSigNamespaceUri(gen,L"http://www.w3.org/2000/09/xmldsig#"); CkXmlDSigGenW_putSignedInfoCanonAlg(gen,L"C14N"); CkXmlDSigGenW_putSignedInfoDigestMethod(gen,L"sha1"); // -------- Reference 1 -------- CkXmlDSigGenW_AddSameDocRef(gen,L"F13T34",L"sha1",L"",L"",L""); // Provide a certificate + private key. (PFX password is test123) cert = CkCertW_Create(); success = CkCertW_LoadPfxFile(cert,L"qa_data/pfx/cert_test123.pfx",L"test123"); if (success != TRUE) { wprintf(L"%s\n",CkCertW_lastErrorText(cert)); CkXmlDSigGenW_Dispose(gen); CkCertW_Dispose(cert); return; } CkXmlDSigGenW_SetX509Cert(gen,cert,TRUE); CkXmlDSigGenW_putKeyInfoType(gen,L"X509Data+KeyValue"); CkXmlDSigGenW_putX509Type(gen,L"Certificate"); // Load XML to be signed... sbXml = CkStringBuilderW_Create(); success = CkStringBuilderW_LoadFile(sbXml,L"qa_data/xml_dsig/sii_cl/xmlToSign.xml",L"iso-8859-1"); if (success == FALSE) { wprintf(L"Failed to load XML file.\n"); CkXmlDSigGenW_Dispose(gen); CkCertW_Dispose(cert); CkStringBuilderW_Dispose(sbXml); return; } CkXmlDSigGenW_putBehaviors(gen,L"IndentedSignature"); // Sign the XML... success = CkXmlDSigGenW_CreateXmlDSigSb(gen,sbXml); if (success != TRUE) { wprintf(L"%s\n",CkXmlDSigGenW_lastErrorText(gen)); CkXmlDSigGenW_Dispose(gen); CkCertW_Dispose(cert); CkStringBuilderW_Dispose(sbXml); return; } // ----------------------------------------------- // Save the signed XML to a file. success = CkStringBuilderW_WriteFile(sbXml,L"qa_data/xml_dsig/sii_cl/signed1.xml",L"iso-8859-1",FALSE); wprintf(L"%s\n",CkStringBuilderW_getAsString(sbXml)); // ---------------------------------------- // Verify the signatures we just produced... verifier = CkXmlDSigW_Create(); success = CkXmlDSigW_LoadSignatureSb(verifier,sbXml); if (success != TRUE) { wprintf(L"%s\n",CkXmlDSigW_lastErrorText(verifier)); CkXmlDSigGenW_Dispose(gen); CkCertW_Dispose(cert); CkStringBuilderW_Dispose(sbXml); CkXmlDSigW_Dispose(verifier); return; } numSigs = CkXmlDSigW_getNumSignatures(verifier); verifyIdx = 0; while (verifyIdx < numSigs) { CkXmlDSigW_putSelector(verifier,verifyIdx); verified = CkXmlDSigW_VerifySignature(verifier,TRUE); if (verified != TRUE) { wprintf(L"%s\n",CkXmlDSigW_lastErrorText(verifier)); CkXmlDSigGenW_Dispose(gen); CkCertW_Dispose(cert); CkStringBuilderW_Dispose(sbXml); CkXmlDSigW_Dispose(verifier); return; } verifyIdx = verifyIdx + 1; } wprintf(L"All signatures were successfully verified.\n"); CkXmlDSigGenW_Dispose(gen); CkCertW_Dispose(cert); CkStringBuilderW_Dispose(sbXml); CkXmlDSigW_Dispose(verifier); } | ||||||
© 2000-2025 Chilkat Software, Inc. All Rights Reserved.