Missing final step after hashing update operation

Хеш является неполным или незащищенным

Описание

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

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

Риск

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

Фиксация

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

Примеры

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


#include <stdlib.h>
#include <openssl/evp.h>


void func(unsigned char* src, int len, EVP_PKEY* pkey)
{
    int ret;

    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);

    ret = EVP_DigestVerifyInit(&ctx, NULL, EVP_sha256(), NULL, pkey);
    if (ret != 1) handle_error();

    ret = EVP_DigestVerifyUpdate(&ctx, src, len);
    if (ret != 1) handle_error();

    EVP_MD_CTX_cleanup(&ctx);
}

В этом примере, контекст верификации ctx инициализируется и обновляется с данными. Контекст затем очищен, не будучи проверенным в последнем шаге. Как правило, вы создаете контекст верификации, чтобы подтвердить ранее сообщение со знаком. Без последнего шага не может быть подтверждена подпись на сообщении.

Коррекция — выполняет последний шаг перед очисткой контекста

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


#include <stdlib.h>
#include <openssl/evp.h>

unsigned char out_buf[EVP_MAX_MD_SIZE];
unsigned int out_len;

void handle_error()
{
    exit(-1);
}


void func(unsigned char* src, int len, EVP_PKEY* pkey)
{
    int ret;

    EVP_MD_CTX ctx;
    EVP_MD_CTX_init(&ctx);

    ret = EVP_DigestVerifyInit(&ctx, NULL, EVP_sha256(), NULL, pkey);
    if (ret != 1) handle_error();

    ret = EVP_DigestVerifyUpdate(&ctx, src, len);
    if (ret != 1) handle_error();

    ret = EVP_DigestVerifyFinal(&ctx, out_buf, out_len);
    if (ret != 1) handle_error();

    EVP_MD_CTX_cleanup(&ctx);
} 

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

Группа: криптография
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: CRYPTO_MD_NO_FINAL
Удар: Средняя
ID CWE: 573
Введенный в R2020a