Sample code for 30+ languages & platforms
Swift

Sign PDF using USB Token or Smartcard on iOS iPhone

Demonstrates how to sign a PDF using an HSM (USB token or smart card) connected to an iPhone.

Note: This example requires Chilkat v10.0.0 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.

    // When signing with a USB token or smartcard, the only coding difference is how the certificate
    // gets loaded.  To load the default certificate from the connected USB token or smartcard, just call
    // LoadFromSmartcard with an empty string argument.
    // 
    // This requires Chilkat v10.0.0 or later.
    // 
    // ------------------------------------------------------------------------------------------------------------------------------------------------------
    // Important: In your Xcode project, you'll need to add the "com.apple.token" entitlement.
    // Also, adding the com.apple.token in the "Project > Signing & Capabilities" will actually add $(AppIdentifierPrefix)com.apple.token, which does not work. 
    // Edit the entitlements file directly and add only com.apple.token
    // If using a Yubikey, you'll only find the certificate if it is added in the Yubikey app as Public.
    // ------------------------------------------------------------------------------------------------------------------------------------------------------
    let cert = CkoCert()!
    success = cert.load(fromSmartcard: "")
    if success == false {
        print("\(cert.lastErrorText!)")
        return
    }

    let pdf = CkoPdf()!

    // Wherever the PDF file is located..
    // Modify to specify the actual path to the PDF.
    var pdfFilePath: String? = "...."

    // Load a PDF to be signed.
    success = pdf.loadFile(filePath: pdfFilePath)
    if success == false {
        print("\(pdf.lastErrorText!)")
        return
    }

    // Options for signing are specified in JSON.
    let json = CkoJsonObject()!

    // Optionally create an LTV-enabled signature
    json.updateBool(jsonPath: "ltvOcsp", value: true)

    // Define the appearance of the signature.
    json.updateInt(jsonPath: "page", value: 1)
    json.updateString(jsonPath: "appearance.y", value: "top")
    json.updateString(jsonPath: "appearance.x", value: "left")
    json.updateString(jsonPath: "appearance.fontScale", value: "10.0")
    json.updateString(jsonPath: "appearance.text[0]", value: "Digitally signed by: cert_cn")
    json.updateString(jsonPath: "appearance.text[1]", value: "current_dt")
    json.updateString(jsonPath: "appearance.text[2]", value: "This is an LTV-enabled signature.")

    // Tell the pdf object to use the certificate (on the USB token) for signing
    success = pdf.setSigningCert(cert: cert)
    if success == false {
        print("\(pdf.lastErrorText!)")
        return
    }

    // Modify to specify the actual path to the output file (i.e. the signed PDF).
    var signedPdfOutputFilePath: String? = "...."
    success = pdf.sign(jsonOptions: json, outFilePath: signedPdfOutputFilePath)
    if success == false {
        print("\(pdf.lastErrorText!)")
        return
    }

    print("PDF successfully signed using USB token on iOS")

}