exponenta event banner

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

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

Описание

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

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

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

Риск

С данными 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
Влияние: носитель
ID CWE: 310, 325, 372, 573

Введенный в R2018a