objective-c - 从 AnyObject 转换时出错?到 SecKeyRef?在 swift

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

作为基于 Swift 的 PKI 实现的一部分,我将 SecKeyWrapper.m 移植到了 Swift

Keychain 访问方法(Objective-C 和 Swift)都工作正常,除了 Swift 实现中的一部分。

我从对端收到 base64 格式的公钥。它被转换为 NSData,然后使用以下方法保存在钥匙串(keychain)中:

statusCode = SecItemAdd(queryDictionary, &persistentPeer)

成功将对端公钥保存在钥匙串(keychain)中后,我需要将其作为 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 工作正常(没有警告或错误)并获得预期结果。

您认为在转换 AnyObject 的 Swift 代码中缺少什么?到 SecKeyRef?

我正在使用 Xcode 7.3.1 和 Swift 2.2

Rgds....

最佳答案

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

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

let key = peerKeyRef as! SecKeyRef?

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

关于objective-c - 从 AnyObject 转换时出错?到 SecKeyRef?在 swift ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38706955/

相关文章:

ios - 如何将数据从 ViewController 传递到标签栏 iOS 中的 ViewController?

c# - C# 中的 RSA 实现

objective-c - 通过委托(delegate)调用时无法识别协议(protocol)方法

ios - 如何在 IOS 中使用两个谓词过滤 UITableView

ios - 在 FOR 循环中创建和设置 UIButton 的标题会中断循环

python - 在 python 中打印 .pem key DER 形式

c++ - 从 RSA key 对变量中分离公钥和私钥

ios - 将一年中的某一天转换为日期

objective-c - 使用 CoreGraphics 方法发送自动重复键 (Mac OS X Snow Leopard)

swift - 登录成功后切换到另一个屏幕