Использование только 1 EVP_PKEY при генерации ключей EC с использованием OpenSSL 1.1 - PullRequest
0 голосов
/ 09 июля 2019

Во всех примерах, которые я видел, для генерации ключа с использованием эллиптической кривой через OpenSSL с использованием функций высокого уровня EVP необходимы две переменные EVP_PKEY_CTX и EVP_PKEY (всего 4):

  1. Одна пара ключ / контекст для генерации параметра
  2. Одна пара ключ / контекст для самого фактического ключа (инициализируется параметрами).

Можно ли объединить это до одной пары ключ / контекст для обоих? Насколько я понимаю, из примеров, которые я видел, логика выглядит так:

  1. Создайте EVP_PKEY_CONTEXT, используя любой желаемый идентификатор алгоритма кривой.
  2. Инициализировать контекст с помощью EVP_PKEY_paramgen_init().
  3. Вызывайте любые функции установки параметров, которые вы хотите в контексте параметров (например, EVP_PKEY_CTX_set_ec_paramgen_curve_nid).
  4. Создайте / завершите параметры с помощью EVP_PKEY_paramgen, что даст вам EVP_PKEY.
  5. Создайте EVP_PKEY_CTX для фактического ключа, инициализированного параметром EVP_PKEY из предыдущего шага.
  6. Инициируйте ключ с помощью EVP_PKEY_keygen_init().
  7. Генерация / финализация ключа с помощью EVP_PKEY_keygen().

Есть ли способ упростить этот процесс? Например, могу ли я просто инициировать ключ, вызвать функции paramgen для клавиши, а затем вызвать EVP_PKEY_keygen()? Это похоже на то, как это работает с генерацией ключей RSA из моего опыта (вы действительно делаете только последние 2 шага выше, с шагом 3 в середине).

Документация утверждает это, что, по-видимому, указывает на то, что вторая пара контекст / ключ не нужна:

После вызова алгоритма EVP_PKEY_keygen_init () или EVP_PKEY_paramgen_init () могут быть выполнены специальные операции управления для установки любых подходящих параметров для операции.

Функции EVP_PKEY_keygen () и EVP_PKEY_paramgen () могут вызываться более одного раза в одном и том же контексте, если несколько операций выполняются с использованием одних и тех же параметров.

Может быть, я неправильно понимаю, но похоже, что он говорит, что вы можете вызывать функции установки параметров после вызова EVP_PKEY_keygen_init() вместо использования функций paramgen.

1 Ответ

1 голос
/ 12 июля 2019

Отдельная стадия генерации параметров действительно предназначена для таких алгоритмов, как Диффи-Хеллман, где это необходимо. Для EC вы почти всегда используете «стандартные» наборы параметров (то есть хорошо известные кривые). Поэтому OpenSSL позволяет вам быстро это сделать и генерировать ключи только в том случае, если вы уже знаете, какие параметры вы хотите использовать. В случае макроса EVP_PKEY_CTX_set_ec_paramgen_curve_nid() он явно задокументирован для использования в параметрах генерации параметра или генерации ключа:

https://www.openssl.org/docs/man1.1.1/man3/EVP_PKEY_CTX_set_ec_paramgen_curve_nid.html

EVP_PKEY_CTX_set_ec_paramgen_curve_nid () устанавливает кривую EC для параметра EC генерация в B. Для генерации параметра EC этот макрос должен или ошибка возникает из-за отсутствия кривой по умолчанию. Эта функция также может быть вызвана для явной установки кривой, когда генерация ключа EC.

Поэтому код для генерации ключа с использованием кривой P-256 (NID_X9_62_prime256v1) может выглядеть следующим образом:

#include <openssl/evp.h>
#include <openssl/ec.h>

int main(void) {
    EVP_PKEY_CTX *ctx;
    EVP_PKEY *pkey = NULL;
    int ret = 1;

    ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_EC, NULL);
    if (ctx == NULL)
        goto err;
    if (EVP_PKEY_keygen_init(ctx) <= 0)
        goto err;
    if (EVP_PKEY_CTX_set_ec_paramgen_curve_nid(ctx, NID_X9_62_prime256v1) <= 0)
        goto err;

    /* Generate key */
    if (EVP_PKEY_keygen(ctx, &pkey) <= 0)
        goto err;

    printf("Success!\n");

    ret = 0;
 err:
    EVP_PKEY_CTX_free(ctx);
    return ret;
}

Для этого требуется только один EVP_PKEY и один EVP_PKEY_CTX.

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