Функция SecKeyCopyKeyExchangeResult () возвращает ошибку, «отсутствует kSecKeyKeyExchangeParameterRequestedSize» - PullRequest
0 голосов
/ 19 сентября 2019

Я использую Xcode11 Beta в качестве IDE и Swift.

Ниже мой код, мой код может хорошо работать на Xcode10.3, но он не может работать на Xcode11.Когда я вызываю функцию SecKeyCopyKeyExchangeResult (), стек всегда возвращает ошибку «kSecKeyKeyExchangeParameterRequestedSize отсутствует», но это нормально для Xcode10.3.Я проверил портал Apple Developer, понятия не имею.

`
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
}`

1 Ответ

0 голосов
/ 20 сентября 2019

Я просто решил эту проблему, используя приведенный ниже фрагмент кода

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)

Обратите внимание, что ниже приведен код, который я добавил для решения этой проблемы:

SecKeyKeyExchangeParameter.requestedSize.rawValue as String: 32,
...