параметры ios SecKeyCopyKeyExchangeResult с общей информацией

Я пытаюсь использовать функцию SecKeyCopyKeyExchangeResult для получения общего секрета из моего локального закрытого ключа и полученного открытого ключа сервера. Общий ключ сгенерирован успешно, и я могу расшифровать входящее сообщение с помощью шифрования AES. Не так давно разработчики серверов решили добавить KDF в процесс генерации ключей. Я начал исследовать, как я могу сделать это на стороне iOS, и обнаружил, что есть специальный параметр static let sharedInfo: SecKeyKeyExchangeParameter Сказать, что документация плохая, это ничего не сказать... Единственное, что я нашел, это это описание в заголовке

@constant kSecKeyKeyExchangeParameterSharedInfo Содержит CFDataRef с дополнительной общей информацией для KDF (функция получения ключа).

Если кто-то работал с этим, пожалуйста, помогите. Сервер использует эти параметры для создания KDF на scala.

private def concatWithKdf(secretKey: SecretKey) = {
    val bytes = new Array[Byte](SECRET_KEY_LENGTH)
    val digest = new SHA256Digest();
    val kdf1BytesGenerator = new KDF1BytesGenerator(digest)
    kdf1BytesGenerator.init(new KDFParameters(secretKey.getEncoded, null))
    kdf1BytesGenerator.generateBytes(bytes, 0, bytes.length)
    new SecretKeySpec(bytes, secretKey.getAlgorithm)
}

Код на стороне iOS

var keyExchangeError: Unmanaged<CFError>?
let dict = [SecKeyKeyExchangeParameter.requestedSize.rawValue : 32,
        SecKeyKeyExchangeParameter.sharedInfo.rawValue : ???]
    let secret = SecKeyCopyKeyExchangeResult(privateOwn,
            SecKeyAlgorithm.ecdhKeyExchangeStandard,
            publicTheir,
            dict as CFDictionary,
            &keyExchangeError)

person Sergey Brazhnik    schedule 08.09.2020    source источник
comment
У меня возникли проблемы с созданием общего ключа. До части KDF еще не добрался. Можете ли вы поделиться своим фрагментом для получения общего ключа? Для справки: генерация общего ключа работает нормально, если я сам создаю обе пары ключей, но если я импортирую открытый ключ сервера, генерация общего секрета завершается ошибкой.   -  person Faraz Hassan    schedule 16.06.2021


Ответы (1)


Вы совершенно правы, друг мой, документация вокруг Security Framework ужасна.

Действительно, CryptoKit — это попытка Apple модернизировать здесь вещи в стиле libsodium, предоставляя простые интерфейсы для тщательно отобранных примитивов. , такие как эллиптическая кривая Диффи-Хеллмана над безопасными кривыми.

Поэтому я сочувствую и предлагаю просто использовать libsodium, когда вам нужна криптография на iOS/macOS.

В любом случае, чтобы ответить на ваш вопрос, я нашел упоминание в библиотеке SecKit, которое соответствует тому, что вы, кажется, используете в Scala, после процесса Диффи-Хеллмана вы запускаете ключевой материал через SHA256 на стороне сервера, поэтому iOS должен соответствовать это ХБКДФ.

 @constant kSecKeyAlgorithmECDHKeyExchangeCofactorX963SHA256
    Compute shared secret using ECDH cofactor algorithm, suitable only for kSecAttrKeyTypeECSECPrimeRandom keys
    and apply ANSI X9.63 KDF with SHA256 as hashing function.  Requires kSecKeyKeyExchangeParameterRequestedSize and allows
    kSecKeyKeyExchangeParameterSharedInfo parameters to be used.

поэтому я думаю, вам просто нужно изменить это:

var keyExchangeError: Unmanaged<CFError>?
let dict = [SecKeyKeyExchangeParameter.requestedSize.rawValue : 32,
        SecKeyKeyExchangeParameter.sharedInfo.rawValue : ???]
    let secret = SecKeyCopyKeyExchangeResult(privateOwn,
            SecKeyAlgorithm.ecdhKeyExchangeStandard,
            publicTheir,
            dict as CFDictionary,
            &keyExchangeError)

к этому:

var keyExchangeError: Unmanaged<CFError>?
let dict = [SecKeyKeyExchangeParameter.requestedSize.rawValue : 32,
        SecKeyKeyExchangeParameter.sharedInfo.rawValue : ???]
    let secret = SecKeyCopyKeyExchangeResult(privateOwn,
            SecKeyAlgorithm.ecdhKeyExchangeStandardX963SHA256,
            publicTheir,
            dict as CFDictionary,
            &keyExchangeError)

Я не проверял вышеизложенное, так как я работаю на компьютере с Linux, но, надеюсь, это поможет, он должен добавить KDF на основе SHA256 в процесс ECDH. Но да, какой беспорядок с API. Я просто не могу с этим работать.

person Woodstock    schedule 08.09.2020
comment
Да, я тоже попробовал эту константу и получил ключ, который отличается от сервера. Буду исследовать интернет дальше - person Sergey Brazhnik; 08.09.2020