| ||||
| ||||
Пытаюсь проверить подпись под сообщением в формате PKCS#7, но вылетает ошибка "Неправильная подпись". Вот код проверки подписи: if (kl) hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, 0, hCryptProv, NULL, NULL); if (kl && !hMsg) { WriteLog((char *)(const char *)DecodeError()); kl = false; } if (kl && !CryptMsgUpdate(hMsg, pbMessage, cbMessage, TRUE)) { WriteLog((char *)(const char *)DecodeError()); kl = false; } if (kl && !CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_INFO_PARAM, 0, NULL, &cbSignerCertInfo)) { WriteLog((char *)(const char *)DecodeError()); kl = false; } if (kl && !(pbSignerCertInfo = (PCERT_INFO)malloc(cbSignerCertInfo))) { WriteLog("Не могу выделить память под информацию о подписчике."); kl = false; } if (kl && !CryptMsgGetParam(hMsg, CMSG_SIGNER_CERT_INFO_PARAM, 0, pbSignerCertInfo, &cbSignerCertInfo)) { WriteLog((char *)(const char *)DecodeError()); kl = false; } if (kl && !CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, NULL, &cbBuffer)) { WriteLog((char *)(const char *)DecodeError()); kl = false; } if(kl && !(pbBuffer = (BYTE*)malloc(cbBuffer))) { WriteLog("Не могу выделить память под выходные данные."); kl = false; } if (kl && !CryptMsgGetParam(hMsg, CMSG_CONTENT_PARAM, 0, pbBuffer, &cbBuffer)) { WriteLog((char *)(const char *)DecodeError()); kl = false; } if (kl) { kl = false; if (hSystemStore = CertOpenStore(CERT_STORE_PROV_MSG, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, hCryptProv, 0, hMsg)) if (otprCert = CertGetSubjectCertificateFromStore(hSystemStore, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, pbSignerCertInfo)) { pbSignerCertInfo = otprCert->pCertInfo; kl = true; } } if (kl && !CryptMsgControl(hMsg, 0, CMSG_CTRL_VERIFY_SIGNATURE, pbSignerCertInfo)) { WriteLog((char *)(const char *)DecodeError()); kl = false; } Эта ошибка вылетает при вызове функции CryptMsgControl. В чем может быть проблема? | ||||
Ответы: | ||||
| ||||
Код вроде верный, может действительно неправильная подпись? | ||||
| ||||
Использую аналогичный код, и он работает на cryptopro 3.0 и не работает на cryptopro 2.0 . Хотя и сертификаты тоже разные. Может быть в них дело? | ||||
| ||||
Что значит сертификаты разные? У 2.0 и 3.0 отличий в плане проверки подписи нет, поддерживается и 94 и 2001 ГОСТ. | ||||