exponenta event banner

Отсутствуют данные для операции шифрования, дешифрования или подписи

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