SecKeyCopyKeyExchangeResult is not working in iOS 13.0

427 Views Asked by At

SecKeyCopyKeyExchangeResult call throwing the next error regardless what parameter supplied. It's working fine with iOS 13.0.

kSecKeyKeyExchangeParameterRequestedSize is missing

My code:

// Parameter value set here
let params = [SecKeyKeyExchangeParameter.requestedSize: 32, SecKeyKeyExchangeParameter.sharedInfo:Data()] as [SecKeyKeyExchangeParameter : Any]

// Function call:
let sharedSecret = try? generateSharedSecret(issuerPublicKey: issuerPublicKey!, parameters: params as [SecKeyKeyExchangeParameter : Any])

// Function
func generateSharedSecret(issuerPublicKey: SecKey, devicePrivateKey: SecKey, parameters:[SecKeyKeyExchangeParameter: Any] = [:]) throws -> Data? {
    var error: Unmanaged<CFError>?
    guard let shared = SecKeyCopyKeyExchangeResult(devicePrivateKey, .ecdhKeyExchangeCofactorX963SHA384, issuerPublicKey, parameters as CFDictionary, &error) else {
        throw error!.takeRetainedValue() as Error
    }

    return shared as Data
}

Parameter data:

▿ 2 elements
  ▿ 0 : 2 elements
    ▿ key : SecKeyKeyExchangeParameter
      - rawValue : requestedSize
    - value : 32
  ▿ 1 : 2 elements
    ▿ key : SecKeyKeyExchangeParameter
      - rawValue : sharedInfo
    ▿ value : 0 bytes
      - count : 0
      ▿ pointer : 0x000000016db58ac0
        - pointerValue : 6135581376
      - bytes : 0 elements

Error:

▿ Optional<Unmanaged<CFErrorRef>>
  ▿ some : Unmanaged<CFErrorRef>
    - _value : Error Domain=NSOSStatusErrorDomain Code=-50 "kSecKeyKeyExchangeParameterRequestedSize is missing" UserInfo={NSDescription=kSecKeyKeyExchangeParameterRequestedSize is missing}
1

There are 1 best solutions below

0
On

Change SecKeyKeyExchangeParameter.requestedSize to SecKeyKeyExchangeParameter.requestedSize.rawValue.