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