03.12.2006 12:45:37Проверка PKCS7 на Solaris. Ответов: 9
Антон Чикин
Используем CryptoPro CSP 2 под Solaris. Нужно проверить подпись в формате PKCS7. Функций CryptSignMessage на Solaris нет. Выполняю следующие действия:
1. Разбираю PKCS7.
2. Вытаскиваю аттрибут ContentInfo->content
3. Вытаскиваю аттрибут SignerInfo->encryptedDigest
4. Атрибут SignerInfo->authenticatedAttributes отсутствует. Это (по стандарту pkcs7) свидетельствует о том, что в формировании хэша участвует только content.
5. Проверяю подпись по алгоритму: СPCreateHash, СPHashData, CPVerifySignature. Подпись не сходится.
6. Функция CryptVerifyMessage на Win32 утверждает, что подпись сходится.

Вопрос, в чем могут заключаттся подводные камни, проявляющиеся в том, что CryptHashMessage = CryptHashData, а CryptSignMessage != CryptHashData+CryptSignData.

P.S. Осуществлял проверки крипто-провайдера RSA под Win32. Ситуация та же.

Если вам не трудно, объясните пожалуйста как, по вашему мнению реализована функция CryptSignMessage (без формирования pkcs7) и как она выражается чепез CryptHashData, CryptSignHash.
 
Ответы:
03.12.2006 12:53:46Антон Чикин
CryptHashMessage == СryptHashData

Тут я имею ввиду, что значения хеша в pkcs7 совпадает со значением хеша получаемым через СryptHashData+CryptGetHashParam.

CryptSignMessage != CryptHashData + CryptSignHash
Тут я имею в виду, что при подпись полученную через CryptSignMessage и развернутую из pkcs7 нельзя проверить через функции более низкого уровня: CryptHashData+CryptVerifySignature
04.12.2006 11:06:10Василий
Вопрос - а чья реализация функций Crypt* на Solaris?
В составе "КриптоПро CSP 2.0 для Solaris" их нет...
04.12.2006 11:27:27Антон Чикин
Извините, я опечатался. Конечно я использую функции CP... : CPHashData, CPSignHash и прочее.
Суть вопроса остается прежней
CPHashData, CPSignHash/CPVerifySignature на Solaris совместимы с CryptHashData, CryptSignHash/CryptVerifySignature на Win32.

Но почему то подпись полученная с помощью CryptSignMessage на Win32 не удается проверить с помощью функций более низкого уровня (CryptVerifySignature на Win32 или CPVerifySignature на Solaris)
04.12.2006 12:45:06Василий
> Но почему то подпись полученная с помощью CryptSignMessage на Win32 не удается проверить с помощью функций более низкого уровня (CryptVerifySignature на Win32...

Тут нужно точно знать, что именно подписывает CryptSignMessage, и в каком формате записывает подпись.

Лучше, конечно, использовать функции одинакового уровня, например, CryptSignHash и CryptVerifySignature. Если Вы получите положительный результат: ЭЦП, созданная на Win с помощью CryptSignHash проверится на Solaris с помощью CPVerifySignature - можно будет разбираться с более высокоуровневой функцией CryptSignMessage.
04.12.2006 12:59:30Антон Чикин
С этим я уже разобрался. Все Solaris-функции абсолютно совместимы с аналогичными Win32. Проблема в том, что подпись, содержащаяся в PKCS7, созданным с помощью CryptSignMessage не сходится с данными, хранящимися в том же PKCS7 при проверке низкоуровневыми функциями. Хотя высокоуровневая функция CryptVerifyMessage полностью подтверждает подпись. Вопрос формата маловерятен (хотя возможен). Скорее всего хэш для PKCS7 вычисляется как-то иначе (хотя стандарт PKCS7 утверждает, что хэш должен вычисляться именно от данных и не от чего иного, если отсутвтуют атрибуты в SignerInfo).
В чем подвох, я не понимаю
04.12.2006 13:10:10Василий
Хеш - он и в Африке хеш. Но, можно его вычислять от готового буфера данных, а можно данные преобразовать. И результат (ЭЦП) можно положить как есть, а можно закодировать. MSDN пишет так: "The CryptSignMessage function creates a hash of the specified content, signs the hash, and then encodes both the original message content and the signed hash."
04.12.2006 13:12:47Kirill Sobolev
Может в этом подвох
http://www.cryptopro.ru/cryptopro/forum/view.asp?q=2958
04.12.2006 14:39:19Чикин Антон
Благодарю вас! Действительно, как я не заметил, что подпись в PKCS7 записана как OCTET STRING, а не BIT STRING, используемая в низкоуровневых функциях
05.11.2007 14:08:44John
Hi! Nice site! I wish you well!