SecKeyCopyKeyExchangeResult()函数返回错误,“缺少kSecKeyKeyExchangeParameterRequestedSize". [英] SecKeyCopyKeyExchangeResult() function return an error, "kSecKeyKeyExchangeParameterRequestedSize is missing"

查看:341
本文介绍了SecKeyCopyKeyExchangeResult()函数返回错误,“缺少kSecKeyKeyExchangeParameterRequestedSize".的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Xcode11 Beta作为IDE和Swift.

I'm using Xcode11 Beta as IDE and Swift.

下面是我的代码,我的代码可以在Xcode10.3上很好地工作,但是不能在Xcode11上工作. 当我调用函数SecKeyCopyKeyExchangeResult()时,堆栈总是返回错误,缺少kSecKeyKeyExchangeParameterRequestedSize",但在Xcode10.3上可以. 我检查了Apple Developer Portal,没有任何线索.

Below is my code, my code can work well on Xcode10.3, but it can't work on Xcode11. When I call the function SecKeyCopyKeyExchangeResult(), the stack always return an error, "kSecKeyKeyExchangeParameterRequestedSize is missing", but it's okay on Xcode10.3. I checked Apple Developer portal, haven't any clue on it.

`
func main(){

`
func main() {

    testECDH()
}

private func testECDH(){
    generateKeyPair()
    let alicePublicKey = getPublicKey()
    let alicePrivateKey = getPrivateKey()
    print(alicePublicKey)
    print(alicePrivateKey)

    generateKeyPair()
    let bobPublicKey = getPublicKey()
    let bobPrivateKey = getPrivateKey()
    print(bobPublicKey)
    print(bobPrivateKey)

    let alice_bob_ecdhsecret = ecdhSecretCalculation(publicKey: alicePublicKey, privateKey: bobPrivateKey)!
    let bob_alice_ecdhsecret = ecdhSecretCalculation(publicKey: bobPublicKey, privateKey: alicePrivateKey)!

    os_log("alice_bob_ecdhsecret = %@", alice_bob_ecdhsecret)
    os_log("bob_alice_ecdhsecret = %@", bob_alice_ecdhsecret)
}

private func generateKeyPair(){
    let attributes: [String: Any] = [kSecAttrKeySizeInBits as String: 256,
                                     kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
                                     kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false],
                                     kSecPublicKeyAttrs as String:[kSecAttrIsPermanent as String: false]]

    var error: Unmanaged<CFError>?

    privateKey = SecKeyCreateRandomKey(attributes as CFDictionary, &error)!

    if privateKey != nil {
        publicKey = SecKeyCopyPublicKey(privateKey!)
    }


}

private func getPrivateKey()->SecKey{
    return privateKey!
}

private func getPublicKey()->SecKey{
    return publicKey!
}

private func ecdhSecretCalculation(publicKey: SecKey, privateKey: SecKey) -> NSData?
{
    var error: Unmanaged<CFError>?

    let keyPairAttr:[String : Any] = [kSecAttrKeySizeInBits as String: 256,
                                      kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
                                      kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false],
                                      kSecPublicKeyAttrs as String:[kSecAttrIsPermanent as String: false]]
    let algorithm:SecKeyAlgorithm = SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256//ecdhKeyExchangeStandardX963SHA256

    let shared:CFData? = SecKeyCopyKeyExchangeResult(privateKey, algorithm, publicKey, keyPairAttr as! CFDictionary, &error)

    return shared
}`

推荐答案

我只是通过下面的代码片段来解决此问题

I just solve this issue by below code snippet

let keyPairAttr:[String : Any] = [kSecAttrKeySizeInBits as String: 256,

                                      SecKeyKeyExchangeParameter.requestedSize.rawValue as String: 32,
                                      kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
                                      kSecPrivateKeyAttrs as String: [kSecAttrIsPermanent as String: false],
                                      kSecPublicKeyAttrs as String:[kSecAttrIsPermanent as String: false]]
    let algorithm:SecKeyAlgorithm = SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256//ecdhKeyExchangeStandardX963SHA256

    let shared:CFData? = SecKeyCopyKeyExchangeResult(privateKey, algorithm, publicKey, keyPairAttr as! CFDictionary, &error)

请注意,以下是我为解决此问题而添加的代码:

Please noticed that below is the code I added to solve this issue:

SecKeyKeyExchangeParameter.requestedSize.rawValue as String: 32,

这篇关于SecKeyCopyKeyExchangeResult()函数返回错误,“缺少kSecKeyKeyExchangeParameterRequestedSize".的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆