exponenta event banner

Неправильно инициализирован контекст для криптографической операции

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

Описание

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

Например, инициализируется контекст для шифрования.

ret = EVP_PKEY_encrypt_init(ctx);
Однако контекст используется для расшифровки без повторной инициализации контекста.
ret = EVP_PKEY_decrypt(ctx, out, &out_len, in, in_len);

Средство проверки обнаруживает, был ли объект контекста, используемый в этих функциях, инициализирован с помощью соответствующих функций инициализации: EVP_PKEY_paramgen, EVP_PKEY_keygen, EVP_PKEY_encrypt, EVP_PKEY_verify, EVP_PKEY_verify_recover,EVP_PKEY_decrypt, EVP_PKEY_sign, EVP_PKEY_derive, иEVP_PKEY_derive_set_peer.

Риск

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

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

После настройки контекста для определенного семейства операций используйте контекст только для этого семейства операций. Например, используйте эти пары функций для инициализации и использования EVP_PKEY_CTX объект контекста.

  • Для шифрования с помощью EVP_PKEY_encrypt, инициализировать контекст с помощью EVP_PKEY_encrypt_init.

  • Для проверки подписи с EVP_PKEY_verify, инициализировать контекст с помощью EVP_PKEY_verify_init.

  • Для генерации ключей с помощью EVP_PKEY_keygen, инициализировать контекст с помощью EVP_PKEY_keygen_init.

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

Примеры

развернуть все

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf10;
size_t out_len10;
int func(unsigned char *src, size_t len, EVP_PKEY_CTX *ctx){
  if (ctx == NULL) fatal_error(); 

  ret = EVP_PKEY_decrypt_init(ctx); 
  if (ret <= 0) fatal_error();
  return EVP_PKEY_encrypt(ctx, out_buf10, &out_len10, src, len);
}

В этом примере контекст инициализируется для дешифрования, но используется для шифрования.

Исправление - Использование одного семейства операций

Одной из возможных корректировок является инициализация объекта для шифрования.

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf10;
size_t out_len10;
int func(unsigned char *src, size_t len, EVP_PKEY_CTX *ctx){
  if (ctx == NULL) fatal_error(); 

  ret = EVP_PKEY_encrypt_init(ctx); 
  if (ret <= 0) fatal_error();
  return EVP_PKEY_encrypt(ctx, out_buf10, &out_len10, src, len);
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_PKEY_INCORRECT_INIT
Воздействие: среднее
CWE ID: 310, 325, 372, 573, 664
Представлен в R2018a