Sample code for 30+ languages & platforms
PureBasic

S/MIME Decrypt using Certificate and Private Key in Apple Keychain

See more Apple Keychain Examples

Decrypts S/MIME using a certificate with private key found in the Apple Keychain.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkMime.pb"
IncludeFile "CkCert.pb"

Procedure ChilkatExample()

    success.i = 0

    cert.i = CkCert::ckCreate()
    If cert.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Load the certificate to be used for decryption by the Subject Common Name
    ; On MacOS and iOS, Chilkat will search the Keychain(s) for the matching certificate.
    ; Note: The private key must be present to decrypt.
    success = CkCert::ckLoadByCommonName(cert,"My Cert")
    If success = 0
        Debug CkCert::ckLastErrorText(cert)
        CkCert::ckDispose(cert)
        ProcedureReturn
    EndIf

    Debug "Cert has private key: " + Str(CkCert::ckHasPrivateKey(cert))

    ; Load the MIME to be decrypted.
    ; We encrypted using this example:  S/MIME Encrypt using Certificate in Apple Keychain
    mime.i = CkMime::ckCreate()
    If mime.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkMime::ckLoadMimeFile(mime,"./encrypted.mime")
    If success = 0
        Debug CkMime::ckLastErrorText(mime)
        CkCert::ckDispose(cert)
        CkMime::ckDispose(mime)
        ProcedureReturn
    EndIf

    Debug CkMime::ckGetMime(mime)
    Debug "----"

    ; Here's the encrypted MIME:

    ; Subject: test
    ; SomeHeader: 123
    ; Content-Type: application/x-pkcs7-mime; name="smime.p7m"; smime-type="enveloped-data"
    ; Content-Disposition: attachment; filename="smime.p7m"
    ; Content-Transfer-Encoding: base64
    ; 
    ; MIICSwYJKoZIhvcNAQcDoIICPDCCAjgCAQAxggGzMIIBrwIBADCBljCBgTELMAkGA1UEBhMCSVQx
    ; EDAOBgNVBAgMB0JlcmdhbW8xGTAXBgNVBAcMEFBvbnRlIFNhbiBQaWV0cm8xFzAVBgNVBAoMDkFj
    ; dGFsaXMgUy5wLkEuMSwwKgYDVQQDDCNBY3RhbGlzIENsaWVudCBBdXRoZW50aWNhdGlvbiBDQSBH
    ; MwIQPCWvkSv8oQ7xRmEHJ6TzEDANBgkqhkiG9w0BAQEFAASCAQB3VZvHRE5EWxug7Sckpcz1ucDZ
    ; YiTKiqmyPt75MhzNRQLtKFx/jWwlemUwnPMzeu6yutCkZ74Bdn7MBsfDqV3bUz43wAu+fRBteGvF
    ; mTc00MfY8L7o8dkpj4AqAOCj4hKQzbSE99GvSzyXcPE2Gm5NrOPtKxqfFqbBRTCb4fBZP84LaL+x
    ; rnYfrM4qXTppixyN8iFYCd4maEbMu/GA5o+j0BkDDnx42pILDoAGV/ERyx55Y3Nc2Mhm/cITBMNn
    ; g7uS9KPrlYizNaqVu09Hi9jg4gdZaRiTjUqg05tSOk/YqIQxTgfscwSPY92/ewpI6e1EHtLt8Q33
    ; gWCbERptSntUMHwGCSqGSIb3DQEHATAdBglghkgBZQMEAQIEENm1AxeXlEMx7p6McjHIj5CAUEQj
    ; 0GuJ5LnTqiqIjOiwmwNidl1N1TRluxX5vAQvwBuYE6bQK4+i04yn2Av3cucW4kvxgP2Nmni+XgQt
    ; aPPKlasaVceEeZ15IYjw77/m3YYn

    ; -------------------------------------
    ; Decrypt the MIME.
    success = CkMime::ckDecryptUsingCert(mime,cert)
    If success = 0
        Debug CkMime::ckLastErrorText(mime)
        CkCert::ckDispose(cert)
        CkMime::ckDispose(mime)
        ProcedureReturn
    EndIf

    ; -------------------------------------
    ; Note: A password dialog may be shown, possibly twice, when accessing the private key.
    ; See the following blog post explaining how to suppress the dialog:
    ; Suppress Password Dialog when Accessing Private Key in Apple Keychain

    ; Show the unencrypted MIME
    Debug CkMime::ckGetMime(mime)

    ; Here's the decrypted MIME

    ; Subject: test
    ; SomeHeader: 123
    ; Content-Type: text/plain
    ; 
    ; This is the body.


    CkCert::ckDispose(cert)
    CkMime::ckDispose(mime)


    ProcedureReturn
EndProcedure