SecTransformExecute()使用EXEC_BAD_ACCESS使应用程序崩溃

时间:2015-12-26 23:10:24

标签: swift macos security-framework

我有一个私钥/公钥对,我正在尝试使用其中任何一个加密String。代码在OSX 10.11和Xcode 7.2上运行

func encryptMessageWithKey(message: String, keyType: KeyType,
    withCompletionBlock: (success: Bool, data: NSData?, error: AsymCryptoExceptions.Exceptions?)
    -> Void) {

        let uintData = [UInt8](message.utf8)
        let sourceData = CFDataCreate(kCFAllocatorDefault, uintData, uintData.count)
        let privKey = self.getPrivateKeyReference()!
        var errorRef: Unmanaged<CFError>?
        let encoder = SecEncryptTransformCreate(privKey, &errorRef)

        SecTransformSetAttribute(encoder,
            kSecPaddingKey,
            kSecPaddingPKCS1Key,
            &errorRef)

        SecTransformSetAttribute(encoder,
            kSecTransformInputAttributeName,
            sourceData,
            &errorRef)

        var encryptedData = SecTransformExecute(encoder, &errorRef)

        if (errorRef != nil) {
            let error = errorRef!.takeRetainedValue()
            print(error)
        }
}

以上情况严重失败,导致应用程序在运行时因EXEC_BAD_ACCESS而崩溃。没有错误,没有。

我的研究表明,可能存在与明确指定kSecPaddingPKCS1Key而非NULL相关的错误,默认情况下会将填充设置为PKCS1。但是,我无法将此值设置为NULL,因为Swift已将其替换为nil,并且无法在此位置使用。

1 个答案:

答案 0 :(得分:0)

即使这是一个非常古老的问题,我也会回答它,或许可以在某个时候拯救别人:)

我遇到SecTransformExecute出现EXC_BAD_ACCESS错误的问题。我注意到错误只会在我更改或清理项目并重建应用程序时发生,但不会在我运行相同的调试版本时发生。

最后,使用开发证书对应用程序进行签名是为我解决的问题,因为在应用程序无法使用密钥之前,由于Xcode提供了不同的自动签名身份。