Swift
Swift
Create XAdES using Smart Card or USB Token
See more XAdES Examples
Demonstrates how to create an XAdES signed XML document using a certificate located on a smartcard or USB token.Chilkat Swift Downloads
func chilkatTest() {
var success: Bool = false
// Load the XML to be signed.
let xmlToSign = CkoXml()!
success = xmlToSign.loadFile(path: "qa_data/fattura_electronica/docToSign.xml")
if success == false {
print("\(xmlToSign.lastErrorText!)")
return
}
let gen = CkoXmlDSigGen()!
gen.sigLocation = "p:FatturaElettronica"
gen.sigId = "xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504"
gen.sigNamespacePrefix = "ds"
gen.sigNamespaceUri = "http://www.w3.org/2000/09/xmldsig#"
gen.sigValueId = "xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-sigvalue"
gen.signedInfoCanonAlg = "C14N"
gen.signedInfoDigestMethod = "sha256"
// Create an Object to be added to the Signature.
// Note: Chilkat will automatically populate the strings indicated by "TO BE GENERATED BY CHILKAT" with actual/correct values
// when the XML is signed.
let object1 = CkoXml()!
object1.tag = "xades:QualifyingProperties"
object1.addAttribute(name: "xmlns:xades", value: "http://uri.etsi.org/01903/v1.3.2#")
object1.addAttribute(name: "xmlns:xades141", value: "http://uri.etsi.org/01903/v1.4.1#")
object1.addAttribute(name: "Target", value: "#xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504")
object1.updateAttrAt(tagPath: "xades:SignedProperties", autoCreate: true, attrName: "Id", attrValue: "xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-signedprops")
object1.updateChildContent(tagPath: "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime", value: "TO BE GENERATED BY CHILKAT")
object1.updateAttrAt(tagPath: "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestMethod", autoCreate: true, attrName: "Algorithm", attrValue: "http://www.w3.org/2001/04/xmlenc#sha256")
object1.updateChildContent(tagPath: "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestValue", value: "TO BE GENERATED BY CHILKAT")
object1.updateChildContent(tagPath: "xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:IssuerSerialV2", value: "TO BE GENERATED BY CHILKAT")
gen.add(id: "", content: object1.getXml(), mimeType: "", encoding: "")
// -------- Reference 1 --------
gen.keyInfoId = "xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-keyinfo"
gen.addSameDocRef(id: "xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-keyinfo", digestMethod: "sha256", canonMethod: "", prefixList: "", refType: "")
// -------- Reference 2 --------
gen.addSameDocRef(id: "", digestMethod: "sha256", canonMethod: "", prefixList: "", refType: "")
gen.setRefIdAttr(uri_or_id: "", value: "xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-ref0")
// -------- Reference 3 --------
gen.addObjectRef(id: "xmldsig-6f4b994a-7191-4bb1-ab3c-17549515b504-signedprops", digestMethod: "sha256", canonMethod: "", prefixList: "", refType: "http://uri.etsi.org/01903#SignedProperties")
// ----------------------------------------------------------------
// Load a certificate that has been pre-installed on the Windows system
// This includes certificates on smartcards and USB tokens
let cert = CkoCert()!
// You may provide the PIN here..
cert.smartCardPin = "000000"
// Load the certificate on the smartcard currently in the reader (or on the USB token).
// Pass an empty string to allow Chilkat to automatically choose the CSP (Cryptographi Service Provider).
// See Load Certificate on Smartcard for information about explicitly selecting a particular CSP.
success = cert.load(fromSmartcard: "")
if success == false {
print("\(cert.lastErrorText!)")
return
}
gen.setX509Cert(cert: cert, usePrivateKey: true)
gen.keyInfoType = "X509Data"
gen.x509Type = "Certificate"
// Load XML to be signed...
let sbXml = CkoStringBuilder()!
xmlToSign.getSb(sb: sbXml)
gen.behaviors = "IndentedSignature,ForceAddEnvelopedSignatureTransform"
// Sign the XML...
success = gen.createXmlDSigSb(sbXml: sbXml)
if success == false {
print("\(gen.lastErrorText!)")
return
}
// Save the signed XMl to a file.
success = sbXml.writeFile(path: "qa_output/signedXml.xml", charset: "utf-8", emitBom: false)
print("\(sbXml.getAsString()!)")
// ----------------------------------------
// Verify the signature we just produced...
let verifier = CkoXmlDSig()!
success = verifier.loadSignatureSb(sbXmlSig: sbXml)
if success == false {
print("\(verifier.lastErrorText!)")
return
}
var verified: Bool = verifier.verifySignature(verifyReferenceDigests: true)
if verified != true {
print("\(verifier.lastErrorText!)")
return
}
print("This signature was successfully verified.")
}