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