Статус: Активный участник
Группы: Участники
Зарегистрирован: 12.07.2021(UTC) Сообщений: 39 Сказал(а) «Спасибо»: 10 раз
|
Автор: Андрей * Здравствуйте.
Покажите на тестовых примерах, приложите файлы\подписи. какой код вообще, может кто-то заметит ошибку.
p.s. ошибка в 17 строке. Вот код (в споилере), убрал всякие проверки, так как очень слиьно код раздувает, читать долго и нудно. В коде все отрабатывает и не падает.
// Открытие хранилища сертификатов HCERTSTORE hStoreHandle = CertOpenSystemStore(0, _TEXT("MY"));
// Ищем сертификат в хранилище по серийному номеру PCCERT_CONTEXT context = FindCertificate(hStoreHandle, opt.crt_serial);
int mustFree; DWORD dwKeySpec = 0; HCRYPTPROV hProv;
// Получаем ссылку на закрытый ключ сертификата и дестриптор криптопровайдера CryptAcquireCertificatePrivateKey(context, 0, 0, &hProv, &dwKeySpec, &mustFree);
const auto encodingType = X509_ASN_ENCODING | PKCS_7_ASN_ENCODING; HCRYPTMSG hMsg = CryptMsgOpenToDecode(encodingType, (opt.detached ? CMSG_DETACHED_FLAG : 0), 0, 0, 0, 0);
// Формируем данные для подписания vector<unsigned char> data; ReadFileToVector(/* IN SIGN FILE */, data);
// Добавляем подпись в сообщение CryptMsgUpdate(hMsg, &data[0], (unsigned long)data.size(), TRUE);
// Задаем параметры CMSG_SIGNER_ENCODE_INFO signer = { sizeof(CMSG_SIGNER_ENCODE_INFO) }; signer.pCertInfo = context->pCertInfo; // Сертификат подписчика //cout << context->pCertInfo->Subject << '\n';
signer.hCryptProv = hProv; // Дескриптор криптопровайдера signer.dwKeySpec = dwKeySpec; signer.HashAlgorithm.pszObjId = (LPSTR)GetHashOid(context);
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;
// Add the cosigner to the message. CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_SIGNER, &signer);
CERT_BLOB CosignCertBlob; CosignCertBlob.cbData = context->cbCertEncoded; CosignCertBlob.pbData = context->pbCertEncoded;
CryptMsgControl(hMsg, 0, CMSG_CTRL_ADD_CERT, &CosignCertBlob);
DWORD cbCosignedMessageBlob = 0; std::vector<unsigned char> pbCosignedMessageBlob; // Get the size of the cosigned BLOB. CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, NULL, &cbCosignedMessageBlob);
// Get the cosigned message BLOB. CryptMsgGetParam(hMsg, CMSG_ENCODED_MESSAGE, 0, &(pbCosignedMessageBlob[0]), &cbCosignedMessageBlob);
// save pbCosignedMessageBlob to file // FREE RESOURCES
Отредактировано пользователем 14 октября 2021 г. 12:23:10(UTC)
| Причина: Не указана
|