Статус: Активный участник
Группы: Участники
Зарегистрирован: 26.10.2011(UTC) Сообщений: 61
Сказал(а) «Спасибо»: 2 раз
|
Офф :Прошу прощения ) Сам не люблю подобное, но иногда туплю ) Подпись: Код:char *fileContent;
ifstream file("c:\\path\\numonly.txt", ios::in | ios::binary | ios::ate);
ifstream::pos_type size1 = file.tellg();
fileContent = new char[size1];
file.seekg(0, ios::beg);
file.read(fileContent, size1);
file.close();
fileContent[size1] = '\0';
BYTE* pbMessage = (BYTE *)fileContent;
DWORD cbMessage = (DWORD)strlen((char*) pbMessage) + 1;
HCERTSTORE hStoreHandle = 0;
if ( !( hStoreHandle = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
CERT_STORE_NAME //MY
)))
{
HandleError("Unable to open store MY.");
}
// Получаем указатель на наш сертификат
if(pSignerCert = CertFindCertificateInStore(
hStoreHandle,
MY_TYPE, //(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME, //Tom Soyer
NULL))
{
printf("Cert found.\n");
}
else
{
HandleError("Cert not found.");
}
BYTE *pbSignedMessageBlob;
DWORD cbSignedMessageBlob;
CRYPT_SIGN_MESSAGE_PARA SigParams;
ZeroMemory(&SigParams, sizeof(SigParams));
SigParams.cbSize = sizeof(SigParams);
SigParams.dwMsgEncodingType = MY_TYPE;
SigParams.pSigningCert = pSignerCert;
SigParams.HashAlgorithm.pszObjId = szOID_CPCSP_HASH_SIGN_EL_ALG;
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,
TRUE,
1,
MessageArray,
MessageSizeArray,
NULL,
&cbSignedMessageBlob))
{
printf("Sign size: %d.\n", cbSignedMessageBlob);
}
else
{
HandleError("CryptSignMessage Error.");
}
if(!(pbSignedMessageBlob = new BYTE[cbSignedMessageBlob + 1]))
{
HandleError("Error no memory.");
}
if(CryptSignMessage(
&SigParams,
TRUE,
1,
MessageArray,
MessageSizeArray,
pbSignedMessageBlob,
&cbSignedMessageBlob))
{
//pbSignedMessageBlob[cbSignedMessageBlob] = '\0';
/*ofstream file("c:\\path\\sign_pkcs7.txt", ios::out | ios::binary);
file << pbSignedMessageBlob;
file.close();*/
//pbSignedMessageBlob[cbSignedMessageBlob] = '\0';
FILE *file;
file = fopen("c:\\path\\sign_pkcs7.sig", "wb");
fwrite(pbSignedMessageBlob, sizeof(BYTE), cbSignedMessageBlob, file);
fclose(file);
}
else
{
HandleError("Error signing.");
}
Проверка: Код:PCCERT_CONTEXT pSignerCert = 0;
char *pkcsContent;
ifstream pkcsSign("c:\\path\\sign_pkcs7.sig", ios::in | ios::binary | ios::ate );
ifstream::pos_type size3 = pkcsSign.tellg();
pkcsContent = new char[size3];
pkcsSign.seekg(0, ios::beg);
pkcsSign.read(pkcsContent, size3);
pkcsSign.close();
pkcsContent[size3] = '\0';
cbArray = (DWORD)size3;
pbArray = new BYTE[size3];
pbArray = (BYTE *)pkcsContent;
if ( !( hStoreHandle = CertOpenStore(
CERT_STORE_PROV_SYSTEM,
0,
NULL,
CERT_SYSTEM_STORE_CURRENT_USER,
CERT_STORE_NAME //MY
)))
{
HandleError("Unable to open store MY.");
}
if(pSignerCert = CertFindCertificateInStore(
hStoreHandle,
MY_TYPE, //(PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
0,
CERT_FIND_SUBJECT_STR,
SIGNER_NAME, //Tom Soyer
NULL))
{
printf("Cert found.\n");
}
else
{
HandleError("Cert not found.");
}
CRYPT_VERIFY_MESSAGE_PARA VerifyParams;
ZeroMemory(&VerifyParams, sizeof(VerifyParams));
// Заполнение структуры для верификации
VerifyParams.cbSize = sizeof(VerifyParams);
VerifyParams.dwMsgAndCertEncodingType = MY_TYPE;
VerifyParams.hCryptProv = 0;
VerifyParams.pfnGetSignerCertificate = MyGetSignerCertificateCallback;
VerifyParams.pvGetArg = (void*)pSignerCert;
// верификация подписи
if(CryptVerifyDetachedMessageSignature(
&VerifyParams, // указатель на структуру VerifyParams
0, //
pbArray, // указатель на подпись
cbArray, // длина подписи
1, // число сообщений
MessageArray, // сообщение
MessageSizeArray, // длина сообщения
&pSignerCert)) // указатель на сертификат
{
printf("Verified successfully!.\n");
}
else
{
HandleError("Verification failed.");
}
Цитата:сертификат в ЭЦП ... Хм... Отредактировано пользователем 25 февраля 2012 г. 11:26:41(UTC)
| Причина: Не указана
|