作为基于Swift的PKI实现的一部分,我将SecKeyWrapper.m移植到Swift
除了Swift实现中的一个部分之外,Keychain访问方法的两个(Objective-C和Swift)都正常工作。
我以base64格式从对等方接收公钥。它被转换为NSData,然后使用:
保存在Keychain中statusCode = SecItemAdd(queryDictionary, &persistentPeer)
在密钥链中成功保存对等公钥后,我需要将其作为SecKeyRef。
queryDictionary[kSecReturnPersistentRef] = true
var peerKeyRef: AnyObject?
statusCode = SecItemCopyMatching(queryDictionary, &peerKeyRef)
问题是SecItemCopyMatching返回AnyObject类型的对象?而不能被转换为SecKeyRef(或SecKey,这是别名)
let key = peerKeyRef as? SecKeyRef // Compile error.
我找到的工作是将peerKeyRef转换为NSObject?然后使用Objective-C桥接到SecKey,如下所示:
let keyObject = peerKeyRef as? NSObject
keyRef = Utility.getSecKeyRefFromAnyObject(keyObject).takeRetainedValue()
这样做的Objetive-C代码如下:
+(SecKeyRef) getSecKeyRefFromNSObject:(id)theObject {
return (__bridge SecKeyRef)theObject;
}
使用此变通方法向SecKey进行投射可以正常工作(没有警告或错误),并具有预期结果。
你认为Swift代码中缺少什么来构建AnyObject?到SecKeyRef?
我正在使用Xcode 7.3.1和Swift 2.2
Rgds ....
答案 0 :(得分:1)
编译错误似乎对我来说是个错误。
(当所有CF类型作为AnyObject
的类型数据库导入时,这曾经是有效的诊断。)
但在你的情况下我会这样做:
let key = peerKeyRef as! SecKeyRef?
您100%确定查询返回SecKeyRef
或nil
,不是吗?