09.04.2004 17:45:53Работа с S/MIME Ответов: 3
Алексей
Мне необходимо реализовать поддержку S/MIME в своей программе и я столкнулся с проблемой получения сертификата подписавшей стороны.

if ( !( hCertStore = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
L"MY")))
{
HandleError("The MY store could not be openned.");
}
DecryptPara.cbSize = sizeof(CRYPT_DECRYPT_MESSAGE_PARA);
DecryptPara.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
DecryptPara.cCertStore = 1;
DecryptPara.rghCertStore = &hCertStore;

VerifyPara.cbSize = sizeof(CRYPT_VERIFY_MESSAGE_PARA);
VerifyPara.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
VerifyPara.hCryptProv = 0;
VerifyPara.pfnGetSignerCertificate = NULL;
VerifyPara.pvGetArg = NULL;
pbDecrypted = NULL;
cbDecrypted = 0;
PCCERT_CONTEXT pSignerCert;
if(!(CryptDecryptAndVerifyMessageSignature(&DecryptPara, &VerifyPara, dwSignerIndex, pbSignedAndEncryptedBlob, cbSignedAndEncryptedBlob, NULL, &cbDecrypted, NULL, &pSignerCert)))
{
DWORD dwError = GetLastError();
HandleError("Failed decrypt and verify signature.");
}
..........

Функция CryptDecryptAndVerifyMessageSignature не отрабатывает и возвращает ошибку "ASN1 bad tag value met". Хотя если при тех же условиях вместо этой функции вызывать функцию CryptDecryptMessage, то сообщение нормально расшифровывается. Подскажите что я не правильно делаю или хотя бы какие-нибудь ссылки на практическую реализацию S/MIME с помощью CryptoAPI.
 
Ответы:
12.04.2004 9:40:07kure
Поищите на форуме фарзу S/MIME.
Есть ссылки.
А если ваш файл расшифровывается (DecryptMessage), а функция последовательного расшифрования и проверки подписи сообщает об ошибке ASN.1 может внутри и нет подписанных данных?
12.04.2004 14:14:23Алексей
Подписанные данные есть, т.к. после расшифрования видно что есть вложенный файл с расширением p7s. Да и в Outlook Express можно просмотреть сертификат для шифрования и сертификат для подписи.
16.04.2004 14:14:58Алексей
Спасибо за ответ kure. Пошел обходными путями и получилось. Я сделал примерно так. С помощью функции CryptMsgGetParam и параметра CMSG_SIGNER_CERT_ID_PARAM я получаю ID сертификата, потом с помощью функции CryptGetMessageCertificates открываю p7s файл как хранилище сертификатов и в нем с помощью CertFindCertificateInStore ищу сертификат по известному ID.