SecKeyCopyKeyExchangeResult не работает в качестве nodejs ecdh в iOS 13 - PullRequest
1 голос
/ 02 октября 2019

У меня есть приложение, в котором я генерирую общий секрет между iOS / android / nodejs, используя ECDH по кривой secp521r1. Чтобы убедиться, что это работает, я написал тест, который использует данные, сгенерированные с помощью nodejs, и работал до iOS 13.

Исходный код теста был:

let publicKey = "BABBvZ56c4bj1Zo73LIt/bBVa3jvGTA1fceoOG/M9TeXHx5ffCggRteEVS+bwrgQWPOwJPHhevNenaVn32ZnhztS0QFBqKGZTF1pKNSvuj+PDKQ625TauNroq+LQdeS+Pn6GVHL0iW5pp84NZ06L97VZ9HYm+g2lMnlUFV8hco2CmwBqHQ=="
let privateKey = "AXn994UN59QCEqmCmXmmNZ3hVZPlMwzTIeBupJGG4CqDWfWLuCTui7qiBfQtCFcQ1ks4NNB/tHEZUJ+bB97+pkJ3"
let otherBase64 = "BAAzWyzdh2e+ZNUCFt4oDADURb8+m9WA7gbWtTo57ZP3U23VuvMnRHf+12GpTSV8A5pt+vZfaR2cT02P+LPRc/kGzgAT2IYIgDz/cKbzMi520ZLa0GYk1xzCuNqFhdBZmrB5w0ymsPLdJzIG1QZ3xu7OufEipm5D41abphLLnbH+OyTX6w=="
let expectedShared = "AQkTOOHPcvlXufR2dm1FHaIJRlTgmxTJMI+h0kJ+nMVNopIP+opSqUNmflsgnJzT8JTodd/eehaaq5vvYdDVciIQ"

// iOS secKey is reconstructed by concatenating public and private key
let otherDataKey = Data.init(base64Encoded: otherBase64)!
var concatenatedKey = Data.init(base64Encoded: publicKey)!
concatenatedKey.append(Data.init(base64Encoded: privateKey)!)

// generate private key
var attributes: [String:Any] =
  [
    kSecAttrKeyClass as String: kSecAttrKeyClassPrivate,
    kSecAttrKeySizeInBits as String:      521,
    kSecAttrKeyType as String: kSecAttrKeyTypeECSECPrimeRandom,
]
var error: Unmanaged<CFError>?
guard let secKey = SecKeyCreateWithData(concatenatedKey as CFData, attributes as CFDictionary, &error) else {
  XCTAssertTrue(false)
  return
}

// generate other public key
attributes[kSecAttrKeyClass as String] = kSecAttrKeyClassPublic
guard let otherKey = SecKeyCreateWithData(otherDataKey as CFData, attributes as CFDictionary, nil) else {
  XCTAssertTrue(false)
  return
}

// generate shared secret
let exchangeOptions: [String: Any] = [:]
guard let shared = SecKeyCopyKeyExchangeResult(secKey, SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256, otherKey, exchangeOptions as CFDictionary, &error) else {
  XCTAssertTrue(false)
  return
}

// generate shared secret
XCTAssertEqual((shared as Data).base64EncodedString(), expectedShared);

С iOS 13 я былвынужден изменить содержимое моего словаря exchangeOptions, как обсуждалось здесь ( функция SecKeyCopyKeyExchangeResult () возвращает ошибку, «отсутствует kSecKeyKeyExchangeParameterRequestedSize» * )

let exchangeOptions: [String: Any] = [SecKeyKeyExchangeParameter.requestedSize.rawValue as String: 66]

Проблема в том, что с этой опциейрезультат SecKeyCopyKeyExchangeResult больше не совпадает с nodejs (что также справедливо для iOS 12)

1 Ответ

1 голос
/ 02 октября 2019

Я наконец-то нашел решение ... В iOS <= 12, оставляя параметры обмена пустыми, при попытке использовать алгоритм ecdhKeyExchangeStandardX963SHA256 откатился к SecKeyAlgorithm.ecdhKeyExchangeCofactor. </p>

Поэтому исправление для воспроизведения предыдущего поведенияизменить SecKeyCopyKeyExchangeResult с

// generate shared secret
let exchangeOptions: [String: Any] = [:]
guard let shared = SecKeyCopyKeyExchangeResult(secKey, SecKeyAlgorithm.ecdhKeyExchangeCofactor, otherKey, exchangeOptions as CFDictionary, &error) else {
  XCTAssertTrue(false)
  return
}

Это работает по крайней мере для iOS 10 до 13

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...