Xbase++
Xbase++
Create sii.cl Factura Electrónica (Chile Servicio de Impuestos Internos)
See more XAdES Examples
Demonstrates how to sign an XML invoice according to Chilean Internal Revenue Service regulations.Chilkat Xbase++ Downloads
LOCAL nSuccess
LOCAL oGen
LOCAL oCert
LOCAL oSbXml
LOCAL oVerifier
LOCAL nNumSigs
LOCAL nVerifyIdx
LOCAL nVerified
nSuccess := 0
// 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>
nSuccess := 1
oGen := CreateObject("Chilkat.XmlDSigGen")
oGen:SigLocation := "DTE"
oGen:SigLocationMod := 0
oGen:SigNamespacePrefix := ""
oGen:SigNamespaceUri := "http://www.w3.org/2000/09/xmldsig#"
oGen:SignedInfoCanonAlg := "C14N"
oGen:SignedInfoDigestMethod := "sha1"
// -------- Reference 1 --------
oGen:AddSameDocRef("F13T34", "sha1", "", "", "")
// Provide a certificate + private key. (PFX password is test123)
oCert := CreateObject("Chilkat.Cert")
nSuccess := oCert:LoadPfxFile("qa_data/pfx/cert_test123.pfx", "test123")
IF (nSuccess != 1)
? oCert:LastErrorText
oGen:destroy()
oCert:destroy()
RETURN
ENDIF
oGen:SetX509Cert(oCert, 1)
oGen:KeyInfoType := "X509Data+KeyValue"
oGen:X509Type := "Certificate"
// Load XML to be signed...
oSbXml := CreateObject("Chilkat.StringBuilder")
nSuccess := oSbXml:LoadFile("qa_data/xml_dsig/sii_cl/xmlToSign.xml", "iso-8859-1")
IF (nSuccess == 0)
? "Failed to load XML file."
oGen:destroy()
oCert:destroy()
oSbXml:destroy()
RETURN
ENDIF
oGen:Behaviors := "IndentedSignature"
// Sign the XML...
nSuccess := oGen:CreateXmlDSigSb(oSbXml)
IF (nSuccess != 1)
? oGen:LastErrorText
oGen:destroy()
oCert:destroy()
oSbXml:destroy()
RETURN
ENDIF
// -----------------------------------------------
// Save the signed XML to a file.
nSuccess := oSbXml:WriteFile("qa_data/xml_dsig/sii_cl/signed1.xml", "iso-8859-1", 0)
? oSbXml:GetAsString()
// ----------------------------------------
// Verify the signatures we just produced...
oVerifier := CreateObject("Chilkat.XmlDSig")
nSuccess := oVerifier:LoadSignatureSb(oSbXml)
IF (nSuccess != 1)
? oVerifier:LastErrorText
oGen:destroy()
oCert:destroy()
oSbXml:destroy()
oVerifier:destroy()
RETURN
ENDIF
nNumSigs := oVerifier:NumSignatures
nVerifyIdx := 0
DO WHILE nVerifyIdx < nNumSigs
oVerifier:Selector := nVerifyIdx
nVerified := oVerifier:VerifySignature(1)
IF (nVerified != 1)
? oVerifier:LastErrorText
oGen:destroy()
oCert:destroy()
oSbXml:destroy()
oVerifier:destroy()
RETURN
ENDIF
nVerifyIdx := nVerifyIdx + 1
ENDDO
? "All signatures were successfully verified."
oGen:destroy()
oCert:destroy()
oSbXml:destroy()
oVerifier:destroy()