Sample code for 30+ languages & platforms
Swift

SII XML Digital Signature

See more uncategorized Examples

Example for SII XML Digital Signature.

Chilkat Swift Downloads

Swift

func chilkatTest() {
    var success: Bool = false

    success = true

    // Load the XML to be signed.
    let xmlToSign = CkoXml()!
    success = xmlToSign.loadFile(path: "c:/aaworkarea/eduardo/sii_unsigned.xml")
    if success == false {
        print("\(xmlToSign.lastErrorText!)")
        return
    }

    // The sample XML to be signed looks like this:

    // <?xml version="1.0" encoding="ISO-8859-1"?>
    // <EnvioDTE 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" version="1.0">
    // <SetDTE ID="SetDocF0T33_20240425_170512">
    //  <Caratula version="1.0">
    //   <RutEmisor>99999999-4</RutEmisor>
    //   <RutEnvia>12345678-6</RutEnvia>
    //   <RutReceptor>888888000-K</RutReceptor>
    //   <FchResol>2014-08-22</FchResol>
    //   <NroResol>80</NroResol>
    //   <TmstFirmaEnv>2024-04-25T17:05:13</TmstFirmaEnv>
    //   <SubTotDTE>
    //    <TpoDTE>33</TpoDTE>
    //    <NroDTE>1</NroDTE>
    //   </SubTotDTE>
    //  </Caratula>
    // <DTE version="1.0">
    // <Documento ID="F555T55">
    // ...
    // </Documento>
    // </EnvioDTE>

    let gen = CkoXmlDSigGen()!

    gen.sigLocation = "EnvioDTE|SetDTE|DTE"
    gen.sigLocationMod = 0
    gen.sigNamespacePrefix = ""
    gen.sigNamespaceUri = "http://www.w3.org/2000/09/xmldsig#"
    gen.signedInfoCanonAlg = "C14N"
    gen.signedInfoDigestMethod = "sha1"

    // -------- Reference 1 --------
    let xml1 = CkoXml()!
    xml1.tag = "Transforms"
    xml1.updateAttrAt(tagPath: "Transform", autoCreate: true, attrName: "Algorithm", attrValue: "http://www.w3.org/TR/2001/REC-xml-c14n-20010315")

    gen.addSameDocRef2(id: "F511T33", digestMethod: "sha1", transforms: xml1, refType: "")

    // Provide a certificate + private key. (PFX password is test123)
    let cert = CkoCert()!
    success = cert.loadPfxFile(path: "qa_data/pfx/cert_test123.pfx", password: "test123")
    if success != true {
        print("\(cert.lastErrorText!)")
        return
    }

    gen.setX509Cert(cert: cert, usePrivateKey: true)

    gen.keyInfoType = "X509Data+KeyValue"
    gen.x509Type = "Certificate"

    // Load XML to be signed...
    let sbXml = CkoStringBuilder()!
    xmlToSign.getSb(sb: sbXml)

    gen.behaviors = "IndentedSignature"

    // Sign the XML...
    success = gen.createXmlDSigSb(sbXml: sbXml)
    if success != true {
        print("\(gen.lastErrorText!)")
        return
    }

    // -----------------------------------------------

    // Save the signed XML to a file.
    success = sbXml.writeFile(path: "c:/temp/qa_output/signedXml.xml", charset: "utf-8", emitBom: false)

    print("\(sbXml.getAsString()!)")

    // ----------------------------------------
    // Verify the signatures we just produced...
    let verifier = CkoXmlDSig()!
    success = verifier.loadSignatureSb(sbXmlSig: sbXml)
    if success != true {
        print("\(verifier.lastErrorText!)")
        return
    }

    var numSigs: Int = verifier.numSignatures.intValue
    var verifyIdx: Int = 0
    while verifyIdx < numSigs {
        verifier.selector = verifyIdx
        var verified: Bool = verifier.verifySignature(verifyReferenceDigests: true)
        if verified != true {
            print("\(verifier.lastErrorText!)")
            return
        }

        verifyIdx = verifyIdx + 1
    }

    print("All signatures were successfully verified.")

}