| ||||
| ||||
Пытаюсь сделать подписывание данных и вот что то не получается ... Возникает ошибка при CryptSignMessage (8009200b)... Использую сертификат сгенирированный на http://www.cryptopro.ru/certsrv, пробывал с сертификатом с Типом Криптопровайдера (CSP): Microsoft Base Cryptographic provaider v1.0 ... всЁ отлично работает ... не знаю в чЁм проблема. Вот мой код: #define MY_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) // Наименование персонального хранилища #define CERT_STORE_NAME L"MY" // Наименование сертификата, установленного в это хранилище #define SIGNER_NAME L"SEA_CP" void MySignCert(TMemoryStream* SText , String* S) { // Сообщение, которое мы подписываем //////////////////////////////////////////////////// BYTE* pbMessage = (BYTE *)malloc(SText->Size); SText->Position=0; SText->ReadBuffer(pbMessage, SText->Size); pbMessage[SText->Size]=’\0’; /////(-: DWORD cbMessage =SText->Size+1; delete SText; /////////////////////////////////////////////////////////////// // Открываем хранилище сертификатов HCERTSTORE hStoreHandle; if ( !( hStoreHandle = CertOpenStore( CERT_STORE_PROV_SYSTEM, 0, NULL, CERT_SYSTEM_STORE_CURRENT_USER, //CERT_SYSTEM_STORE_LOCAL_MACHINE, CERT_STORE_NAME))) { MyHandleError("Нельзя открыть хранилище"); } // Получаем указатель на наш сертификат PCCERT_CONTEXT pSignerCert; if(pSignerCert = CertFindCertificateInStore( hStoreHandle, MY_TYPE, 0, CERT_FIND_SUBJECT_STR, SIGNER_NAME, NULL)) { } else { MyHandleError( "Сертификат не найден."); } // Переменные для указателя и длины подписи BYTE *pbSignedMessageBlob; DWORD cbSignedMessageBlob; // Создаем и заполняем структуру для создания цифроовой подписи CRYPT_SIGN_MESSAGE_PARA SigParams; SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA); SigParams.dwMsgEncodingType = MY_TYPE; SigParams.pSigningCert = pSignerCert; SigParams.HashAlgorithm.pszObjId =szOID_RSA_MD5; SigParams.HashAlgorithm.Parameters.cbData = NULL; SigParams.cMsgCert = 0; SigParams.rgpMsgCert = NULL; SigParams.cAuthAttr = 0; SigParams.dwInnerContentType = 0; SigParams.cMsgCrl = 0; SigParams.cUnauthAttr = 0; SigParams.dwFlags = 0; SigParams.pvHashAuxInfo = NULL; SigParams.rgAuthAttr = NULL; const BYTE* MessageArray[] = {pbMessage}; DWORD MessageSizeArray[1]; MessageSizeArray[0] = cbMessage; // Получаем длину буфера подписи if(CryptSignMessage( &SigParams, // указатель на SigParams TRUE, // подпись создается отдельно 1, // число сообщений MessageArray, // сообщение MessageSizeArray, // длина сообщения NULL, // буфер для подписи &cbSignedMessageBlob)) // размер буфера { } else { MyHandleError("Ошибка CryptSignMessage."); } // выделяем память под подпись if(!(pbSignedMessageBlob = new BYTE[cbSignedMessageBlob])) { MyHandleError("Ошибка выделения памяти pbSignedMessageBlob"); } // формируем подпись if(CryptSignMessage( &SigParams, // указатель на SigParams TRUE, // подпись создается отдельно 1, // число сообщений MessageArray, // сообщение MessageSizeArray, // длина сообщения pbSignedMessageBlob, // буфер для подписи &cbSignedMessageBlob)) // размер буфера { //// а сдесь выведим подпись в out *S = print_signature(cbSignedMessageBlob, pbSignedMessageBlob); } else { MyHandleError("Ошибка CryptSignMessage"); } if (pbSignedMessageBlob) delete pbSignedMessageBlob; if(pSignerCert) CertFreeCertificateContext(pSignerCert); if(CertCloseStore(hStoreHandle, CERT_CLOSE_STORE_CHECK_FLAG)) { } else { MyHandleError("Ошибка CertCloseStore"); } } | ||||
Ответы: | ||||
| ||||
Вы указываете алгоритм хеширования, не поддерживаемый нашим криптопровайдером. Обратитесь к руководству для разработчика "КриптоПро CSP" | ||||