从AnyObject转换错误?到SecKeyRef?在斯威夫特

时间:2016-08-01 19:47:03

标签: objective-c swift rsa public-key-encryption seckeyref

作为基于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 ....

1 个答案:

答案 0 :(得分:1)

编译错误似乎对我来说是个错误。 (当所有CF类型作为AnyObject的类型数据库导入时,这曾经是有效的诊断。)

但在你的情况下我会这样做:

let key = peerKeyRef as! SecKeyRef?

您100%确定查询返回SecKeyRefnil,不是吗?