Для того, чтобы создаваемые с помощью CryptoAPI сообщения могли быть впоследствии дополнены до форматов усовершенствованной ЭЦП (CAdES-T, CAdES-X Long Type 1 и других), они должны как минимум соответствовать базовому формату усовершенствованной ЭЦП (CAdES BES).
Формат электронной подписи CAdES BES требует наличия в подписанном сообщении подписанного атрибута, идентифицирующего сертификат подписывающего:
Поскольку после создания подписи нельзя добавлять или изменять подписанные атрибуты, КриптоПро CSP при создании подписанного сообщения с использованием алгоритма ГОСТ Р 34.10/34.11 добавляет к нему подписанный атрибут SigningCertificateV2.
Также в сообщение добавляется отметка о времени создания подписи в виде подписанного атрибута signingTime (время в атрибуте указывается по часам локального компьютера).
Добавление атрибутов SigningCertificateV2 и signingTime затрагивает работу следующих функций: CryptMsgOpenToEncode, CryptMsgControl, CryptMsgCalculateEncodedLength и CryptSignMessage.
Атрибуты SigningCertificateV2 и signingTime не будут добавлены в подписанное сообщение, если выполняется хотя бы одно из следующих условий:
В функцию CryptSignMessage сертификат ключа электронной подписи передаётся в качестве аргумента, в то время как при использовании функций CryptMsgOpenToEncode, CryptMsgCalculateEncodedLength, CryptMsgControl производится его поиск в следующих местах:
Для поиска сертификата используется имя издателя и серийный номер, заданный в качестве идентификатора подписывающего при вызове функции. Если в качестве идентификатора подписывающего указан идентификатор ключа, поиск сертификата не ведётся и атрибуты в сообщение не добавляются.
Существуют следующие способы отключить добавление атрибутов SigningCertificateV2 и signingTime в подписанное сообщение:
Параметр dwFlags для функций CryptMsgOpenToEncode, CryptMsgCalculateEncodedLength, CryptMsgControl может содержать дополнительные флаги, определённые в файле WinCryptEx.h:
Флаг | Описание |
---|---|
CPCMSG_CADES_DISABLE | Отключает добавление атрибутов. Данный флаг не может быть указан одновременно с CPCMSG_CADES_STRICT. |
CPCMSG_CADES_STRICT | Если не удалось добавить атрибуты, функция вернёт ошибку. Данный флаг не может быть указан одновременно с CPCMSG_CADES_DISABLE. |
CPCMSG_CADES_DISABLE_CERT_SEARCH | Отключает поиск сертификата подписывающего в хранилищах "Личные" ("My") текущего пользователя и локального компьютера. |
Параметр dwFlags для функции CryptSignMessage может содержать дополнительные флаги, определённые в файле WinCryptEx.h:
Флаг | Описание |
---|---|
CPCRYPT_MESSAGE_CADES_DISABLE | Отключает добавление атрибутов. Данный флаг не может быть указан одновременно с CPCRYPT_MESSAGE_CADES_STRICT. |
CPCRYPT_MESSAGE_CADES_STRICT | Если не удалось добавить атрибуты, функция вернёт ошибку. Данный флаг не может быть указан одновременно с CPCRYPT_MESSAGE_CADES_DISABLE. |
Добавление атрибутов на всём компьютере регулируется параметром реестра AddEsAttribute. Если данный параметр отсутствует, то добавление дополнительных атрибутов будет производиться. Для того, чтобы отключить добавление атрибутов, нужно добавить параметр AddEsAttribute типа DWORD и значением 0 в ветку реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Crypto Pro\Cryptography\CurrentVersion\Parameters".