This function takes as an argument Base64 encoded PKCS#12 certificate string which is then decoded and passed to SecPKCS12Import function. After update to iOS 11 the SecPKCS12Import, yields different results. The securityError returns 0 on both OS versions.
The certificate:
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Password: "eet"
let securityError: OSStatus = SecPKCS12Import(decodedData!, options, &items)Returns list of 0 items. Whereas on iOS 10 I get 1 item in the array.
func certificateFromCertificate(certP12: String, psswd: String) -> SecCertificate {
let decodedData = NSData(base64Encoded: certP12, options:NSData.Base64DecodingOptions(rawValue: 0))
let keytmp : NSString = kSecImportExportPassphrase as NSString
let options : NSDictionary = [keytmp : psswd]
var certificateRef: SecCertificate? = nil
var items : CFArray?
let securityError: OSStatus = SecPKCS12Import(decodedData!, options, &items)
let theArray: CFArray = items!
if securityError == noErr && CFArrayGetCount(theArray) > 0 {
let newArray = theArray as [AnyObject] as NSArray
let dictionary = newArray.object(at: 0)
let secIdentity = (dictionary as AnyObject)[kSecImportItemIdentity as String] as! SecIdentity
let securityError = SecIdentityCopyCertificate(secIdentity , &certificateRef)
if securityError != noErr {
certificateRef = nil
}
}
certificate = certificateRef
return certificateRef!
}The is a post on https://forums.developer.apple.com/thread/82373 saying that SecPKCS12Import implemented automatic conversion from Base64. This would mean I should decode plain certificate prior passing it to the function. Can this be the issue?
Development environment:
Programming language: Swift 3
Debug device: Apple iPad mini Retina Wi-Fi 32GB ME280SL/A
Development device: iMAC mini Xcode version 9.0 9A235