Sample code for 30+ languages & platforms
Swift

Add EncapsulatedTimestamp to Already-Signed XML

See more XML Digital Signatures Examples

Demonstrates how to add an EncapsulatedTimestamp to an existing XML signature.

Note: This example requires Chilkat v9.5.0.90 or greater.

Chilkat Swift Downloads

Swift

func chilkatTest() {
    var success: Bool = false

    // This example requires the Chilkat API to have been previously unlocked.
    // See Global Unlock Sample for sample code.

    // Note: We cannot load the already-signed XML into a Chilkat XML object because it would re-format the XML when re-emitted.
    // (i.e. indentation and whitespace could change, and it would invalidate the existing signature.)
    // We must use a StringBuilder.
    let sbXml = CkoStringBuilder()!
    success = sbXml.loadFile(path: "qa_data/xml_dsig_valid_samples/encapsulatedTimestamp_not_yet_added.xml", charset: "utf-8")
    if success == false {
        print("Failed to load the XML file.")
        return
    }

    let dsig = CkoXmlDSig()!
    success = dsig.loadSignatureSb(sbXmlSig: sbXml)
    if success == false {
        print("\(dsig.lastErrorText!)")
        return
    }

    if dsig.hasEncapsulatedTimeStamp() == true {
        print("This signed XML already has an EncapsulatedTimeStamp")
        return
    }

    // Specify the timestamping authority URL
    let json = CkoJsonObject()!
    json.updateString(jsonPath: "timestampToken.tsaUrl", value: "http://timestamp.digicert.com")
    json.updateBool(jsonPath: "timestampToken.requestTsaCert", value: true)

    // Call AddEncapsulatedTimeStamp to add the EncapsulatedTimeStamp to the signature.
    // Note: If the signed XML contains multiple signatures, the signature modified is the one 
    // indicated by the dsig.Selector property.
    let sbOut = CkoStringBuilder()!
    success = dsig.addEncapsulatedTimeStamp(json: json, sbOut: sbOut)
    if success == false {
        print("\(dsig.lastErrorText!)")
        return
    }

    sbOut.writeFile(path: "qa_output/addedEncapsulatedTimeStamp.xml", charset: "utf-8", emitBom: false)

    // The EncapsulatedTimeStamp can be validated when validating the signature by adding the VerifyEncapsulatedTimeStamp
    // keyword to UncommonOptions.  See here:

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

    // Add "VerifyEncapsulatedTimeStamp" to the UncommonOptions to also verify any EncapsulatedTimeStamps
    verifier.uncommonOptions = "VerifyEncapsulatedTimeStamp"

    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.")

}