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
Влияние: Средний
ИДЕНТИФИКАТОР CWE: 573
Введенный в R2020a