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.
 
Ответы:
19.11.2007 16:48:19Юрий
Одуреть... Оказывается результат CryptDecodeObject(..., X509_CERT, ...) переворачивает изначальную сигнатуру! То есть первый байт становится последним и т.п. Сделал такую перестановку перед начальным кодированием сигнатуры (перед сохранением в сертификат) - и все стало отлично.

Пойду покапаюсь в стандартах - может так и нужно для RSA...
19.11.2007 17:22:36Юрий
Ничего про подобную перестановку в RFC 3280, 3279, 2313 не нашел.

Отписал в Microsoft.