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 объект, длина ключа по умолчанию 1 024 битов используется:

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, во время создания контекста. Для усиленного шифрования используйте 2 048 битов для длины ключа вместо значения по умолчанию 1 024 бита.

#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
Удар: носитель
ID CWE: 310, 325, 372, 573
Введенный в R2018a