Missing cipher data to process

Заключительный шаг шифрования или дешифрования выполняется без предыдущих шагов обновления

Описание

Этот дефект возникает, когда вы выполняете последний шаг шифрования или расшифровки блочного шифра неправильно.

Например, вы делаете одно из следующих:

  • Вы не выполняете шаги обновления для шифрования или расшифровки данных перед выполнением последнего шага.

    /* Initialization of cipher context */
    ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    ...
    /* Missing update step */
    ...
    /* Final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
  • Вы выполняете последовательные заключительные шаги без промежуточной инициализации и шагов обновления.

    /* Initialization of cipher context */
    ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    ...
    /* Update step(s) */
    ret = EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
    ...
    /* Final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
    ...
    /* Missing initialization and update */
    ...
    /* Second final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);
  • Необходимо выполнить очистку контекста шифра, а затем выполнить заключительный шаг.

    /* Initialization of cipher context */
    ret = EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    ...
    /* Update step(s) */
    ret = EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);
    ...
    /* Cleanup of cipher context */
    EVP_CIPHER_CTX_cleanup(ctx);
    ...
    /* Second final step */
    ret = EVP_EncryptFinal_ex(ctx, out_buf, &out_len);

Риск

Блочные шифры разбивают ваши данные на блоки фиксированного размера. Во время шифрования или расшифровки шаг обновления шифрует или расшифровывает ваши данные в блоках. Все оставшиеся данные шифруются или расшифровываются на заключительном этапе. Заключительный шаг добавляет заполнение к оставшимся данным так, чтобы оно занимало один блок, и затем шифрует или расшифровывает заполненные данные.

Если вы выполняете последний шаг перед выполнением шагов обновления или выполняете последний шаг, когда нет данных для обработки, поведение не определено. Вы также можете столкнуться с ошибками времени выполнения.

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

Выполните шифрование или расшифровку в следующей последовательности:

  • Инициализация контекста шифра

  • Шаги обновления

  • Заключительный шаг

  • Очистка контекста

Примеры

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


#include <openssl/evp.h>
#include <stdlib.h>
#define SIZE16 16

unsigned char *out_buf;
int out_len;
unsigned char key[SIZE16];
unsigned char iv[SIZE16];

void func(void) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);

    /* Initialization of cipher context */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    
    /* Missing update steps for encryption */
    
    /* Final encryption step */
    EVP_EncryptFinal_ex(ctx, out_buf, &out_len);           
}

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

Коррекция - Выполните шаги обновления для шифрования перед заключительным шагом

Выполните шаги обновления для шифрования перед заключительным шагом. В исправленном коде ниже, стандартная программа EVP_EncryptUpdate выполняет шаги обновления.


#include <openssl/evp.h>
#include <stdlib.h>
#define SIZE16 16

unsigned char *out_buf;
int out_len;
unsigned char key[SIZE16];
unsigned char iv[SIZE16];

void func(unsigned char *src, int len) {
    EVP_CIPHER_CTX *ctx = EVP_CIPHER_CTX_new();
    EVP_CIPHER_CTX_init(ctx);

    /* Initialization of cipher context */
    EVP_EncryptInit_ex(ctx, EVP_aes_128_cbc(), NULL, key, iv);
    
    /* Update steps for encryption */
    EVP_EncryptUpdate(ctx, out_buf, &out_len, src, len);   
    
    /* Final encryption step */
    EVP_EncryptFinal_ex(ctx, out_buf, &out_len);           
}

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

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