KeyChainに格納したかったわけである。
間違えてる気がすごくするんだが、これ以外でうまくいかなかったので、一応晒しておく。
まず、PKCS12のデコード(certP12Base64にPKCS12、passwordにPrivateKeyのPassword。エラー処理は抜いてる)。
var rawItems: CFArray?
let importPasswordOption: NSDictionary = [kSecImportExportPassphrase as NSString: password]
let status = SecPKCS12Import(
NSData(base64Encoded: certP12Base64, options: Data.Base64DecodingOptions(rawValue: 0))!,
importPasswordOption,
&rawItems)
if(status != errSecSuccess) {
// error
}
んで、SecIdentityを取り出す。
let items = rawItems! as! Array<Dictionary<String, Any>>
let firstItem = items[0]
let identity = firstItem[kSecImportItemIdentity as String] as! SecIdentity
これをKeyChainに突っ込みたいのだが、
let addquery = [
// kSecClass : kSecClassIdentity,
kSecValueRef : identity,
kSecAttrLabel : label
] as CFDictionary
var resultRef : AnyObject?
let status = SecItemAdd(addquery, &resultRef)
if status != errSecSuccess {
// error
}
"kSecClassIdentity"を指定したら、保存できなかった。
取得するときは
let getquery = [
kSecClass : kSecClassIdentity,
kSecAttrLabel : label,
kSecReturnRef : kCFBooleanTrue as Any
] as CFDictionary
var resultRef: CFTypeRef?
let status = SecItemCopyMatching(getquery as CFDictionary, &resultRef);
if status != errSecSuccess {
// error
}
let identity = resultRef as! SecIdentity?
で、差し替えの時は、あらかじめ同じLabelの"Key"を削除する。
let delQuery = [
kSecClass : kSecClassKey,
kSecAttrLabel : label
] as CFDictionary
SecItemDelete(delQuery)
……納得がいかないんだが。