Статус: Участник
Группы: Участники
Зарегистрирован: 13.05.2011(UTC) Сообщений: 14 Откуда: Россия
|
Возникла проблем с формирование CMS сообщения. При вызове метода CryptSignMessage, возникает ошибка: Код:Cannot find the certificate and private key for decryption.
Вот собственно как вызываю: Код: //--------------------------------------------------------------------
// Получение дескриптора контекста криптографического провайдера.
//--------------------------------------------------------------------
if (!CryptAcquireContext(
&hProv,
(LPCSTR)pbContainerName,
"Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider",
PROV_GOST_2001_DH,
CRYPT_MACHINE_KEYSET))
{
char *msg = getErorrMessage("CryptAcquireContext() failed");
throwCryptoException(env, msg);
Error = true;
goto Error;
}
printf("\nOK1");
//--------------------------------------------------------------------
// Получение пользовательского ключа (по двум типам ключей)
//--------------------------------------------------------------------
DWORD keyType = AT_SIGNATURE;
if (!CryptGetUserKey(hProv, keyType, &hKey)) {
keyType = AT_KEYEXCHANGE;
if (!CryptGetUserKey(hProv, keyType, &hKey)) {
char *msg = getErorrMessage("CryptGetUserKey() failed. Tried both key types.");
throwCryptoException(env, msg);
Error = true;
goto Error;
}
}
printf("\ngetting key");
//--------------------------------------------------------------------
// Определение размера пользовательского сертификата.
//--------------------------------------------------------------------
if (!CryptGetKeyParam (hKey, KP_CERTIFICATE, NULL,&dwUserCertLength, 0)) {
char *msg = getErorrMessage("GetKeyParam() failed(first).");
throwCryptoException(env, msg);
Error = true;
goto Error;
}
printf("\nCertLength");
//--------------------------------------------------------------------
// Распределение памяти под буфер пользовательского сертификата.
//--------------------------------------------------------------------
if (!(pbUserCert = (BYTE *)VirtualAlloc(NULL,dwUserCertLength,MEM_COMMIT,PAGE_READWRITE))){
char *msg = getErorrMessage("VirtualAlloc() for UserCert failed.");
throwCryptoException(env, msg);
Error = true;
goto Error;
}
printf("\nUserCertAlloc");
//--------------------------------------------------------------------
// Получение пользовательского сертификата.
//--------------------------------------------------------------------
if (!CryptGetKeyParam(hKey, KP_CERTIFICATE, pbUserCert,&dwUserCertLength, 0)) {
char *msg = getErorrMessage("CryptGetKeyParam() failed(second).");
throwCryptoException(env, msg);
Error = true;
goto Error;
}
printf("\nUserCertGet");
//--------------------------------------------------------------------
// Формирование контекста сертификата.
//--------------------------------------------------------------------
if (!(pUserCert = CertCreateCertificateContext(X509_ASN_ENCODING, pbUserCert, dwUserCertLength))) {
char *msg = getErorrMessage("CertCreateCertificateContext() failed.");
throwCryptoException(env, msg);
Error = true;
goto Error;
}
printf("\nUserCertContext");
//--------------------------------------------------------------------
// Инициализация структуры для подписи.
//--------------------------------------------------------------------
SigParams.cbSize = sizeof(CRYPT_SIGN_MESSAGE_PARA);
SigParams.dwMsgEncodingType = X509_ASN_ENCODING;
SigParams.pSigningCert = pUserCert;
SigParams.HashAlgorithm.pszObjId = pUserCert->pCertInfo->SignatureAlgorithm.pszObjId;
SigParams.HashAlgorithm.Parameters.cbData = 0;//pUserCert->pCertInfo->SignatureAlgorithm.Parameters.cbData;
SigParams.HashAlgorithm.Parameters.pbData = NULL;
SigParams.cMsgCert = 1;
SigParams.rgpMsgCert = &pUserCert;
SigParams.cAuthAttr = 0;
SigParams.dwInnerContentType = 0;
SigParams.cMsgCrl = 0;
SigParams.cUnauthAttr = 0;
SigParams.dwFlags = 0;
SigParams.pvHashAuxInfo = NULL;
SigParams.rgAuthAttr = NULL;
printf("\nSigParamsInit");
//--------------------------------------------------------------------
// Определение размера буфера для CMS сообщения.
//--------------------------------------------------------------------
//pbBuffer - данные для подписыванеия
const BYTE* MessageArray[] = {pbBuffer};
DWORD_PTR MessageSizeArray[1];
MessageSizeArray[0] = dwBufferLen;
DWORD cbSignedMessageBlob;
if(!CryptSignMessage(
&SigParams,
FALSE,
1,
MessageArray,
MessageSizeArray,
NULL,
&cbSignedMessageBlob))
{
char *msg = getErorrMessage("CryptSignMessage() failed(first).");
throwCryptoException(env, msg);
Error = true;
goto Error;
}
else
printf(TEXT("%d bytes needed for the encoded BLOB.\n"), cbSignedMessageBlob);
Подскажите, что делаю не так?
|