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 подпись создается, атрибут добавляется. Каким же образом можно добавить аутентификационные атрибуты? Пожалуйста, приведите пример исходного кода. Заранее спасибо. |
|
Ответы:
|
|
Файлы signtsf.c, signlo.c в примерах на странице
http://www.cryptopro.ru/CryptoPro/products/csp4.asp |
|
05.04.2004 12:16:29 | Andrew Yu Gorbunov |
|
Большое спасибо за ссылку. Проблема состояла в том, что при добавлении хотя бы одного аутентификационного атрибута к подписи автоматически добавляются такие атрибуты, как значение хеш-функции сообщения и тип содержимого сообщения. Возникает дополнительный вопрос - и в MSDN и в вашем коде алгоритм хеширования задается явно. А как его узнать, имея только сертификат? Из структуры CERT_CONTEXT можно получить только OID алгоритма подписи... |
|
06.04.2004 12:20:29 | Kirill Sobolev |
|
Узнать его нельзя. Можно подобрать :)
Суть в следующем - алгоритм подписи можно однозначно определить по алгоритму хеширования и алгоритму открытого ключа (кстати, алгортим подписи в сертификате - это алгортим подписи которой был подписан сам сертификат, а не подписи которую можно создать при помощи этого сертификата).
Действительно, алгоритм открытого ключа можно узнать из сертификата, а вот алгоритм хеширования задается (или подбирается подходящий из тех, которые реализуют криптопровайдеры, установленные в системе).
Проверка на совместмость (т.е. например с гостовым хешом и ключом RSA подпись не получится) алгоритма хеширования и алгоритма открытого ключа осуществляется функцией CryptFindOIDInfo c последним параметром CRYPT_OID_INFO_SIGN_KEY, перебор - CryptEnumOIDInfo. |
|