| ||||
| ||||
Потребовалось сохранить отдельно подпись от имеющегося PKCS7 файла (подпись attached). Что делаю. Достаю саму подпись (CryptMsgGetParam(,CMSG_ENCRYPTED_DIGEST,,,), достаю оттуда же сертификат к этой подписи (CryptMsgGetParam(,CMSG_CERT_PARAM,,,) и само сообщение (CryptMsgGetParam(,CMSG_CONTENT_PARAM,,,). Все это сохраняю. Хочу затем проверить сохраненную подпись. Что делаю. CryptImportublicKeyInfo() из сохраненного сертификата CryptCreateHash( , CALG_GR3411, ,, ) CryptHashData() - загружаю сохраненное сообщение CryptVerigySignature() - проверяю сохраненную подпись. И вот тут получаю NTE_BAD_SIGNATURE, хотя делаю вроде как все по правилам. Подскажите, пожалуйста, где я неправ? | ||||
Ответы: | ||||
| ||||
По правилам проверить подпись будет правильнее в учетом формата PKCS#7. Нужно посмотреть на RFC (например, 2315). В них попроше описан формат и процесс создания/проверки ЭЦП. http://www.ietf.org/rfc/rfc2315.txt?number=2315 А еще для этих целей может пригодиться dumpasn1 http://www.cryptopro.ru/CryptoPro/test/dumpasn1.zip | ||||
| ||||
В общем-то, меня и это устроит в случае, если от "целого" pkcs#7 сообщения удастся оставить только часть с одной подписью. К сожалению, здесь никто не смог подсказать как. | ||||
| ||||
Так и не подсказали по причине того что что нужно сделать известно и описано в пиведенных стандартах, а осталось только упорно разбираться с возможностью реализации используя CryptoAPI. | ||||
| ||||
Т.е. формировать самому .p7s вручную, байт за байтом? Или что-то в CryptoAPI мне таки может помочь? | ||||
| ||||
В CryptoAPI может помочь функции низкого уровня. Их нужно изучить и понять, можно ли это сделать. Но сначала нужно посмотреть PKCS#7, чтобы понять как подпись формируется и как проверяется. В каком случае подписываются данные, а в каком добавляются атрибуты и т.д. А вот байт по байту не рекомендовал бы. | ||||