03.12.2003 15:02:55ошибка при CryptSignMessage Ответов: 1
SEA
Пытаюсь сделать подписывание данных и вот что то не получается ... Возникает ошибка при 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");
}

}
 
Ответы:
04.12.2003 12:42:46Седов Роман
Вы указываете алгоритм хеширования, не поддерживаемый нашим криптопровайдером.
Обратитесь к руководству для разработчика "КриптоПро CSP"