Недостающие параметры для генерации ключей

Контекст, используемый для генерации ключей, сопоставлен с параметрами 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