19.11.2007 13:26:23 | Кто нибудь сталкивался с такой проблемой (X509_CERT и CERT_SIGNED_CONTENT_INFO)? | | Ответов: 2 |
|
Юрий | | |
|
Кодирую сертификат почти "вручную" (CryptEncodeObject). Подпись также строю сам (CryptHashData + CryptSignHash). В DumpASN1 все отлично (0 errors, 0 warnings). Но при открывании полученого сертификата в MS Windows получаю "Неправильная сигнатура сертификата". Проверил вручную: в полученом файле сертификата действительно содержится та подпись, которую я получил в программе (конечно предварительно кодированая DER). Верифицировал подпись с помощью CryptVerifySignature: все отлично, подпись верифицируется.
Начал копать. Оказывается что после вызова CryptDecodeObject(..., X509_CERT, ...) в массиве CERT_SIGNED_CONTENT_INFO.Signature.pbData данные отличаются от тех, что хранятся в файле сертификата! То есть массив CERT_SIGNED_CONTENT_INFO.ToBeSigned.pbData получается идентичным моему, но вот подпись каким-то непостижимым образом меняется.
Криптопровайдер PROV_RSA_FULL, хеширование CALG_SHA1, шифрование на ключе AT_SIGNATURE. |
|
Ответы:
|
|
Одуреть... Оказывается результат CryptDecodeObject(..., X509_CERT, ...) переворачивает изначальную сигнатуру! То есть первый байт становится последним и т.п. Сделал такую перестановку перед начальным кодированием сигнатуры (перед сохранением в сертификат) - и все стало отлично.
Пойду покапаюсь в стандартах - может так и нужно для RSA... |
|
|
Ничего про подобную перестановку в RFC 3280, 3279, 2313 не нашел.
Отписал в Microsoft. |
|