bcrypto / bpki

A public key infrastructure profile
8 stars 0 forks source link

Тип конвертуемых данных в EnvelopedData #65

Closed agievich closed 3 years ago

agievich commented 3 years ago

В контейнере EnvelopedData тип конвертуемых данных должен принимать либо значение id-data, либо значение id-signedData:

Тип конвертуемых данных (компонент eContentType, вложенный в encryptedContentInfo) должен принимать одно из следующих значений: 1) id-signedData, если конвертуются подписанные данные; 2) id-data, если конвертуются неструктурированные данные: запрос на получение сертификата, сертификат, запрос на отзыв сертификата.

Данное правило несколько снижает издержки при обработке каскадов Signed-then-Enveloped. Подписанные данные можно не погружать в контейнер EncapsulatedContentInfo вместе с id-signedData, а зашифровывать напрямую. При этом сокращается объем зашифровываемых данных, что может быть полезно на практике.

К сожалению, на практике ситуация запутывается. Делое в том, что для работы с контейнерами в основном используется библиотека OpenSSL, и в этой библиотеке отсутствует налаженный доступ к полю EnvelopedData.encryptedContentInfo.contentInfo. Программисты ошибаются, думая что для установки типа конвертуемых данных следует использовать функцию CMS_set1_eContentType. Это не так. Функция изменяет поле eContentType в контейнере EncapsulatedContentInfo, опоясывающем EnvelopedData.

Предлагается изменить правило:

Тип конвертуемых данных (компонент eContentType, вложенный в encryptedContentInfo) должен принимать значение id-data. Перед конвертованием подписанных данных они должны быть вложены в контейнер EncapsulatedContentInfo (определен в СТБ 34.101.23), причем компонент eContentType этого контейнера должен принимать значение id-signedData.

agievich commented 3 years ago

В некоторых стандартах в каскадах Signed-then-Enveloped компонент EnvelopedData.encryptedContentInfo.contentInfo все-таки принимает значение id-SignedData.

Примеры: RFC5272, RFC4556.

Тем не менее, назначение EnvelopedData.encryptedContentInfo.contentInfo = id-data представляется целесообразным. Аргументы:

  1. Больше единообразия.
  2. Проще обработка (не нужно проверять совпадение идентификаторов "внутри" вложенных данных и "снаружи").
  3. Больше конфиденциальности (даже идентификатор конвертованных данные не раскрывается).
  4. Ближе к OpenSSL.

Реализовано в #68.