| 
	Статус: Активный участник
 Группы: Участники
 Зарегистрирован: 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)
 | Причина: Не указана |