exponenta event banner

Несовместимое заполнение для работы алгоритма RSA

Операция криптографии не поддерживается набором типов заполнения в контексте

Описание

Этот дефект возникает при выполнении операции алгоритма RSA для объекта контекста, несовместимого с дополнением, ранее связанным с объектом.

Например, вы связываете схему заполнения OAEP с объектом контекста, но позже используете контекст для проверки подписи, операцию, которую схема заполнения не поддерживает.

ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
...
ret = EVP_PKEY_verify(ctx, out, out_len, in, in_len);

Риск

Схемы заполнения удаляют детерминизм из алгоритма RSA и защищают операции RSA от определенных видов атак.

При использовании неправильной схемы заполнения операция RSA может завершиться ошибкой или привести к непредвиденному шифротексту.

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

Перед выполнением операции RSA свяжите объект контекста со схемой заполнения, совместимой с операцией.

  • Шифрование: Используйте схему заполнения OAEP.

    Например, используйте EVP_PKEY_CTX_set_rsa_padding функция с аргументом RSA_PKCS1_OAEP_PADDING или RSA_padding_add_PKCS1_OAEP функция.

    ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
    
    Также можно использовать схемы PKCS # 1v1.5 или SSLv23. Имейте в виду, что эти схемы считаются небезопасными.

    Затем можно использовать такие функции, как EVP_PKEY_encrypt / EVP_PKEY_decrypt или RSA_public_encrypt / RSA_private_decrypt по контексту.

  • Подпись: Используйте схему заполнения RSA-PSS.

    Например, используйте EVP_PKEY_CTX_set_rsa_padding функция с аргументом RSA_PKCS1_PSS_PADDING.

    ret = EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING);
    Также можно использовать схемы ANSI X9.31, PKCS # 1v1.5 или SSLv23. Имейте в виду, что эти схемы считаются небезопасными.

    Затем можно использовать такие функции, как EVP_PKEY_sign-EVP_PKEY_verify пара или RSA_private_encrypt-RSA_public_decrypt пара в контексте.

При выполнении двух видов операций с одним и тем же контекстом после первой операции сбросьте схему заполнения в контексте перед второй операцией.

Примеры

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

#include <stddef.h>
#include <openssl/rsa.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *out_buf;

int func(unsigned char *src, size_t len, RSA* rsa){
  if (rsa == NULL) fatal_error();
  return RSA_private_encrypt(len, src, out_buf, rsa, RSA_PKCS1_OAEP_PADDING);
}

В этом примере функция RSA_private_encrypt выполняет операцию подписи с использованием схемы заполнения OAEP, которая поддерживает только операции шифрования.

Исправление - использовать схему заполнения, поддерживающую сигнатуру

Одной из возможных корректировок является использование схемы заполнения RSA-PSS. Исправленный пример использует функцию RSA_padding_add_PKCS1_PSS чтобы связать схему заполнения с контекстом.

#include <stddef.h>
#include <openssl/evp.h>
#include <openssl/rsa.h>

#define fatal_error() exit(-1)

int ret;
unsigned char *msg_pad;
unsigned char *out_buf;

int func(unsigned char *src, size_t len, RSA* rsa){
  if (rsa == NULL) fatal_error(); 

  ret = RSA_padding_add_PKCS1_PSS(rsa, msg_pad, src, EVP_sha256(), -2); 
  if (ret <= 0) fatal_error();

  return RSA_private_encrypt(len, msg_pad, out_buf, rsa, RSA_NO_PADDING); 
}

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

Группа: Криптография
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: CRYPTO_RSA_BAD_PADDING
Воздействие: среднее
CWE ID: 310, 372, 573, 664
Представлен в R2018a