Missing parameters for key generation

Контекст, используемый для генерации ключа, связан с параметрами NULL

Описание

Этот дефект возникает, когда вы выполняете шаг генерации ключа с контекстным объектом, не связывая предварительно объект с необходимыми параметрами.

Например, вы связываете EVP_PKEY_CTX контекстный объект с пустым EVP_PKEY params объекта перед генерацией ключа:

EVP_PKEY * params = EVP_PKEY_new();
...
EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new(params, NULL);
... 
EVP_PKEY_keygen(ctx, &pkey);

Риск

Без соответствующих параметров шаг генерации ключа не происходит. Избыточная операция часто указывает на ошибку кодирования.

Зафиксировать

Проверьте размещение шага генерации ключа. Если операция предназначена, убедитесь, что параметры установлены перед генерацией ключа.

Некоторые алгоритмы используют параметры по умолчанию. Например, если вы задаете алгоритм DSA при создании EVP_PKEY_CTX объект, используется длина ключа по умолчанию 1024 бита:

kctx = EVP_PKEY_CTX_new_id(EVP_PKEY_DSA, NULL);
Определения алгоритма во время создания контекста достаточно, чтобы избежать этого дефекта. Только если вы используете алгоритм Эллиптической Кривой (EC), необходимо также явным образом задать кривую перед генерацией ключа.

Однако параметры по умолчанию могут генерировать ключи, которые являются слишком слабыми для шифрования. Слабые параметры могут вызвать другой дефект. Чтобы изменить параметры по умолчанию, используйте функции, специфичные для алгоритма. Для образца, чтобы задать параметры, можно использовать следующие функции:

  • Диффи-Хеллман (DH): Используйте EVP_PKEY_CTX_set_dh_paramgen_prime_len и EVP_PKEY_CTX_set_dh_paramgen_generator.

  • Алгоритм цифровой подписи (DSA): используйте EVP_PKEY_CTX_set_dsa_paramgen_bits.

  • RSA: Используйте EVP_PKEY_CTX_set_rsa_padding, EVP_PKEY_CTX_set_rsa_pss_saltlen, EVP_PKEY_CTX_set_rsa_rsa_keygen_bits, и EVP_PKEY_CTX_set_rsa_keygen_pubexp.

  • Эллиптическая кривая (EC): Используйте EVP_PKEY_CTX_set_ec_paramgen_curve_nid и EVP_PKEY_CTX_set_ec_param_enc.

Примеры

расширить все

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  EVP_PKEY * params = EVP_PKEY_new();
  if (params == NULL) fatal_error();

  EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new(params, NULL);
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_keygen_init(ctx);
  if (ret <= 0) fatal_error();
  return EVP_PKEY_keygen(ctx, &pkey);
}

В этом примере объект контекста ctx связан с пустым объектом параметра params. Объект контекста не имеет необходимых параметров для генерации ключа.

Коррекция - задайте алгоритм во время создания контекста

Одна возможная коррекция состоит в том, чтобы задать алгоритм, такой как RSA, во время создания контекста. Для усиления шифрования используйте 2048 биты для длины ключа вместо 1024 бит по умолчанию.

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

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY *pkey){
  EVP_PKEY_CTX * ctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, NULL); 
  if (ctx == NULL) fatal_error();

  ret = EVP_PKEY_keygen_init(ctx);
  if (ret <= 0) fatal_error();
  
  ret = EVP_PKEY_CTX_set_rsa_keygen_bits(ctx, 2048); 
  if (ret <= 0) fatal_error();
  
  return EVP_PKEY_keygen(ctx, &pkey); 
}

Информация о результатах

Группа: Криптография
Язык: C | C++
По умолчанию: Off
Синтаксис командной строки : CRYPTO_PKEY_NO_PARAMS
Влияние: Средний
ИДЕНТИФИКАТОР CWE : 310, 325, 372, 573
Введенный в R2018a