Пример создания подписанного сообщения с помощью низкоуровневых функций КриптоПро ЭЦП SDK
C++
CMSG_SIGNER_ENCODE_INFO signer = { sizeof(CMSG_SIGNER_ENCODE_INFO) };
signer.pCertInfo = pCertContext->pCertInfo;
signer.hCryptProv = hProv;
signer.dwKeySpec = dwKeySpec;
signer.HashAlgorithm.pszObjId = szOID_OIWSEC_sha1;
CMSG_SIGNED_ENCODE_INFO info = { sizeof(CMSG_SIGNED_ENCODE_INFO) };
info.cSigners = 1;
info.rgSigners = &signer;
CADES_ENCODE_INFO cadesInfo = { sizeof(cadesInfo) };
cadesInfo.pSignedEncodeInfo = &info;
HCRYPTMSG hMsg = CadesMsgOpenToEncode(
X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,0,&cadesInfo,0,0);
if(!hMsg)
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
std::cout << "CadesMsgOpenToEncode() failed" << std::endl;
return empty;
}
std::vector<BYTE> data(10,25);
if(!CryptMsgUpdate(hMsg,&data[0],(DWORD)data.size(),TRUE))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
CryptMsgClose(hMsg);
std::cout << "CryptMsgUpdate() failed" << std::endl;
return empty;
}
DWORD size = 0;
if(!CryptMsgGetParam(hMsg,CMSG_CONTENT_PARAM,0,0,&size))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
CryptMsgClose(hMsg);
std::cout << "CryptMsgGetParam() failed" << std::endl;
return empty;
}
std::vector<BYTE> message(size);
if(!CryptMsgGetParam(hMsg,CMSG_CONTENT_PARAM,0,&message[0],&size))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
CryptMsgClose(hMsg);
std::cout << "CryptMsgGetParam() failed" << std::endl;
return empty;
}
message.resize(size);
if(!CryptMsgClose(hMsg))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
std::cout << "CryptMsgGetParam() failed" << std::endl;
return empty;
}
hMsg = CryptMsgOpenToDecode(X509_ASN_ENCODING | PKCS_7_ASN_ENCODING,
0,0,0,0,0);
if(!hMsg)
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
std::cout << "CryptMsgOpenToDecode() failed" << std::endl;
return empty;
}
if(!CryptMsgUpdate(hMsg,&message[0],(DWORD)message.size(),TRUE))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
CryptMsgClose(hMsg);
std::cout << "CryptMsgUpdate() failed" << std::endl;
return empty;
}
if(!CadesMsgEnhanceSignature(hMsg,0,0))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
CryptMsgClose(hMsg);
std::cout << "CadesMsgEnhanceSignature() failed" << std::endl;
return empty;
}
size = 0;
if(!CryptMsgGetParam(hMsg,CMSG_ENCODED_MESSAGE,0,0,&size))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
CryptMsgClose(hMsg);
std::cout << "CryptMsgGetParam() failed" << std::endl;
return empty;
}
message.resize(size);
if(!CryptMsgGetParam(hMsg,CMSG_ENCODED_MESSAGE,0,&message[0],&size))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
CryptMsgClose(hMsg);
std::cout << "CryptMsgGetParam() failed" << std::endl;
return empty;
}
message.resize(size);
if(!CryptMsgClose(hMsg))
{
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
std::cout << "CryptMsgClose() failed" << std::endl;
return empty;
}
CryptReleaseContext(hProv,0);
CertFreeCertificateContext(pCertContext);
return message;