exponenta event banner

Missing data for encryption, decryption or signing operation

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

Описание

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

Например, вы непреднамеренно задаете значение NULL для in или нулевое значение для in_len в этой операции дешифрования:

ret = EVP_PKEY_decrypt(ctx, out, &out_len, in, in_len);
Или вы задаете значение NULL для md или sig, или нулевое значение для md_len или sig_len в этой операции верификации:
ret = EVP_PKEY_verify(ctx, md, mdlen, sig, siglen);

Риск

С данными NULL или нулевой длиной операция не выполняется. Избыточная операция часто указывает на ошибку кодирования.

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

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

Примеры

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

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY_CTX * ctx){
  if (ctx == NULL) fatal_error(); 
  unsigned char* sig = (unsigned char*) "0123456789";
  unsigned char* md = (unsigned char*) "0123456789";

  ret = EVP_PKEY_verify_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256());
  if (ret <= 0) fatal_error();
  return EVP_PKEY_verify(ctx, sig, 0, md, 0); 
}

В этом примере длины данных (третий и пятый аргументы к EVP_PKEY_verify) равны нулю. Операция завершается неуспешно.

Коррекция - используйте ненулевую длину данных

Одной из возможных коррекций является использование ненулевой длины для подписи и данных, которые считаются подписанными.

#include <openssl/evp.h>

#define fatal_error() exit(-1)

int ret;
int func(EVP_PKEY_CTX * ctx){
  if (ctx == NULL) fatal_error(); 
  unsigned char* sig = (unsigned char*) "0123456789";
  unsigned char* md = (unsigned char*) "0123456789";

  ret = EVP_PKEY_verify_init(ctx);
  if (ret <= 0) fatal_error();
  ret = EVP_PKEY_CTX_set_signature_md(ctx, EVP_sha256());
  if (ret <= 0) fatal_error();
  return EVP_PKEY_verify(ctx, sig, 10, md, 10); 
}

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

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