Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 396 раз в 366 постах
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close