Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Владимир_1775  
#1 Оставлено : 30 сентября 2019 г. 18:10:30(UTC)
Владимир_1775

Статус: Новичок

Группы: Участники
Зарегистрирован: 30.09.2019(UTC)
Сообщений: 1
Российская Федерация

Всем добрый день!
Подскажите как правильно получить GostR3410-KeyTransport.
Есть код который работает с ViPNet CSP но не работает с КриптоПро 4.0/5.0. Что я делаю не так?

Код:

     // theirCert - сертификат принимающей стороны
	 
     const DWORD ivSize = 8;
     const DWORD maxPaddingSize = 8;

     //Генерация случайного симметричного ключа, шифрование данных и экспорт ключа в формате Key Transport Blob на открытом ключе из сертификата
     PCCERT_CONTEXT certContext = getContext( theirCert );
     CERT_PUBLIC_KEY_INFO* pPublicKeyInfo = &certContext->pCertInfo->SubjectPublicKeyInfo;

     // найдем криптопровайдер, поддерживающий алгоритм открытого ключа, в случае КриптоПро получаем 80
     HCRYPTPROV prov = getProviderForAlgo(pPublicKeyInfo->Algorithm.pszObjId);

     HCRYPTKEY hKey;
     if( !::CryptGenKey( prov, CPCSP_ENCRYPT_ID, CRYPT_EXPORTABLE, &hKey ) )
     {
          throw std::exception( "CryptGenKey failed" );
     }
	 
     auto keyType = getKeyType( theirCert );
     auto pbData = reinterpret_cast< BYTE* >( 
			KeyType::Gost2001 == keyType 
				? szOID_CPCSP_ENCR_DEF_PARAM 
				: szOID_CSP2012_ENCRYPT_PARAM );
     if( !::CryptSetKeyParam( hKey, KP_CIPHEROID, pbData, 0 ) )
     {
          throw std::exception( "CryptSetKeyParam(KP_CIPHEROID) failed" );
     }

     DWORD mode = CRYPT_MODE_CBC;
     if( !::CryptSetKeyParam( hKey, KP_MODE, reinterpret_cast< BYTE* >( &mode ), 0 ) )
     {
          throw std::exception( "CryptSetKeyParam(KP_MODE) failed" );
     }

     uint8_t encryptedDataIv[ ivSize ];
  	 uint8_t encryptedDataPadding[ maxPaddingSize ];
	 
     ::CryptGenRandom( prov, ivSize, encryptedDataIv );
     if( !::CryptSetKeyParam( hKey, KP_IV, encryptedDataIv, 0 ) )
     {
          throw std::exception( "CryptSetKeyParam(KP_IV) failed" );
     }
	 
     // экспортируем ключ

     //Ключ экспортированный в формате Key Transport Blob
     std::vector<uint8_t> exportedKey;
	 
	 // инициализация
	 hExportKeyFunSet_ = ::CryptInitOIDFunctionSet( CMSG_OID_EXPORT_ENCRYPT_KEY_FUNC, 0 );
     if( !hExportKeyFunSet_ )
     {
          throw std::exception( "CryptInitOIDFunctionSet[1]" );
     }
	 
	 // получение функции
	 if( !::CryptGetOIDFunctionAddress( hExportKeyFunSet_, X509_ASN_ENCODING
		, pPublicKeyInfo->Algorithm.pszObjId, 0, ( void** ) &fnExportKey_, &hFunAddr_ExportKey_ ) )
	 {
		  throw std::exception( "CryptGetOIDFunctionAddress[1]");			  
	 }

     DWORD cbDataSize = 0;
     if( !fnExportKey_( prov, hKey, pPublicKeyInfo, NULL, &cbDataSize ) )
     {
          throw std::exception( "EXPORT_ENCRYPT_KEY[1]" );
     }
     exportedKey.resize( cbDataSize );
	 
     if( !fnExportKey_( prov, hKey, pPublicKeyInfo, &exportedKey[ 0 ], &cbDataSize ) )
     {
          std::stringstream ss;
          ss << "EXPORT_ENCRYPT_KEY[2] failed: error = 0x" << std::hex << GetLastError();
          throw std::exception( ss.str().c_str() );
     }

     exportedKey.resize( cbDataSize );

Отредактировано пользователем 30 сентября 2019 г. 18:11:01(UTC)  | Причина: Не указана

Offline two_oceans  
#2 Оставлено : 1 октября 2019 г. 4:56:15(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 396 раз в 366 постах
Может быть пригодится для сравнения:
https://www.cryptopro.ru...ts&m=90725#post90725
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.