03.04.2004 16:15:02Добавление атрибутов при подписи сообщения Ответов: 3
Andrew Gorbunov
Добрый день. Вопрос в следующем:
Создается подпись сообщения (файла) при помощи CryptSignMessage() из CryptoAPI. Необходимо добавить в создаваемую подпись время создания подписи и имя файла. В MSDN сказано, что ссылки на данные атрибуты добавляются в поле rgAuthAttr структуры CRYPT_SIGN_MESSAGE_PARA (1й аргумент CryptSignMessage). При добавлении такой ссылки подпись не создается, хотя CryptSignMessage сообщения об ошибке не возвращает. При добавлении ссылки на этот же атрибут в поле CRYPT_SIGN_MESSAGE_PARA.rgUnauthAttr подпись создается, атрибут добавляется. Каким же образом можно добавить аутентификационные атрибуты? Пожалуйста, приведите пример исходного кода. Заранее спасибо.
 
Ответы:
05.04.2004 10:23:41kure
Файлы signtsf.c, signlo.c в примерах на странице
http://www.cryptopro.ru/CryptoPro/products/csp4.asp
05.04.2004 12:16:29Andrew Yu Gorbunov
Большое спасибо за ссылку. Проблема состояла в том, что при добавлении хотя бы одного аутентификационного атрибута к подписи автоматически добавляются такие атрибуты, как значение хеш-функции сообщения и тип содержимого сообщения. Возникает дополнительный вопрос - и в MSDN и в вашем коде алгоритм хеширования задается явно. А как его узнать, имея только сертификат? Из структуры CERT_CONTEXT можно получить только OID алгоритма подписи...
06.04.2004 12:20:29Kirill Sobolev
Узнать его нельзя. Можно подобрать :)
Суть в следующем - алгоритм подписи можно однозначно определить по алгоритму хеширования и алгоритму открытого ключа (кстати, алгортим подписи в сертификате - это алгортим подписи которой был подписан сам сертификат, а не подписи которую можно создать при помощи этого сертификата).
Действительно, алгоритм открытого ключа можно узнать из сертификата, а вот алгоритм хеширования задается (или подбирается подходящий из тех, которые реализуют криптопровайдеры, установленные в системе).
Проверка на совместмость (т.е. например с гостовым хешом и ключом RSA подпись не получится) алгоритма хеширования и алгоритма открытого ключа осуществляется функцией CryptFindOIDInfo c последним параметром CRYPT_OID_INFO_SIGN_KEY, перебор - CryptEnumOIDInfo.