exponenta event banner

Отсутствуют параметры для генерации ключа

Контекст, используемый для создания ключа, связан с параметрами 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++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_PKEY_NO_PARAMS
Воздействие: среднее
CWE ID: 310, 325, 372, 573
Представлен в R2018a