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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Владимир  
#1 Оставлено : 29 февраля 2008 г. 17:01:21(UTC)
Владимир

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

Группы: Участники
Зарегистрирован: 29.02.2008(UTC)
Сообщений: 2
Откуда: Москва

Приветствую.

Есть задача - с помощью CSP реализовать часть хэндшейка по ГОСТовому TLS.
А именно, мне надо получить зашифрованный пре-мастер секрет на своем закрытом ключе и открытом ключе сервера.

Сначала я пытался сделать как описано здесь:
http://www.cryptopro.ru/...pro/forum/view.asp?q=489

Но, судя по всему, этот вариант мне не подходит - сервер не может расшифровать ключ.(говорит MAC плохой)

Попытался вместо генерации CALG_G28147 сгенерить CALG_TLS1_MASTER.
Но в этом случае, при вызове функции CryptExprtKey возвращается ошибка NTE_BAD_KEY.

Попытался перед экспортом с помощью CryptSetKeyParam установить KP_CLIENT_RANDOM и KP_SERVER_RANDOM (на сколько я понимаю они используются при создании зашифрованного пре-мастер секрета). Результат тот же.

Никакой документации по этому вопросу найти не удалось.

Может подскажете, что делаю не так?

Wanna join the discussion?! Login to your Форум КриптоПро forum account. Новые регистрации запрещены.

Offline Григорий Чудов  
#2 Оставлено : 29 февраля 2008 г. 20:50:04(UTC)
Григорий Чудов

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

Группы: Участники
Зарегистрирован: 27.02.2008(UTC)
Сообщений: 4
Мужчина

Реализовать с помощью CSP часть хэндшейка TLS - это задача чуть более сложная чем просто экспорт сессионного ключа. Вы на верном пути, но путь этот долог :) Готовая реализация TLS входит в комплект CSP, поэтому если вас устраивает она - рекомендуется воспользоваться интерфейсом SSPI. Вся необходимая документация для этого имеется. Если же вы хотите чего-то экзотического, то боюсь готовой подробной документации по использованию CSP для реализации TLS не существует - хотя каждый отдельный вызов CSP, использующийся для этого, документирован.

На конкретные вопросы ответы таковы: Во первых, приведённый по ссылке алгоритм обмена не полон. Необходимо еще согласовать UKM, параметры алгоритма ключа и алгоритм обмена. Где-то в документации это должно было быть описано полностью.
Вкратце в этой цепочке не хватает следующих вызовов (помеченых восклицательным знаком):

CPGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey);
CPGenKey(hProv, CALG_TLS1_MASTER, CRYPT_EXPORTABLE, &hSessionKey);
CPImportKey(hProv, pbRecipentPublicKey, cbRecipentPublicKey, hUserKey, 0, &hExchKey);
/* ! */ CPSetKeyParam (hProv, hExchKey, KP_ALGID, (LPBYTE)&ke_alg, 0 ); /* ALG_ID ke_alg = CALG_SIMPLE_EXPORT; - Алгоритм simple key wrap */
/* ! */ CPSetKeyParam (hProv,hExchKey, KP_SV, ukm, 0); /* Задаём UKM. */
CPExportKey(hProv, hSessionKey, hExchKey, SIMPLEBLOB, 0, pbSessionKeyForRecipient, &cbSessionKeyForRecipient);

В случае если параметры ключей сторон не совпадают, то используется эфемеральный ключ. Т.е. вместо CPGetUserKey(hProv, AT_KEYEXCHANGE, &hUserKey) мы должны сгенерировать эфемеральный ключ с параметрами, такими же как у получателя. Делается это так:
CPGenKey (hProv, pubKeyAlgId, CRYPT_EXPORTABLE | CRYPT_PREGEN, &hUserKey);
CPSetKeyParam (hProv, hUserKey, KP_DHOID, (LPBYTE) recipient_public_key_parameters.publicKeyParamSet, 0);
CPSetKeyParam (hProv, hUserKey, KP_HASHOID, (LPBYTE) recipient_public_key_parameters.digestParamSet, 0);
CPSetKeyParam (hProv,hUserKey, KP_X, NULL, 0);

Что касается ukm, то для TLS он вычисляется как первые 8 байт хэша от конкатенации client_random и server_random.

Что касается KP_CLIENT_RANDOM и KP_SERVER_RANDOM, то как описано в документации, они используются при преобразовании premaster_secret в master_secret, т.е. после описанного выше экспорта ключа.

CPSetKeyParam (hProv, hSessionKey, KP_CLIENT_RANDOM, client_random, 0);
CPSetKeyParam (hProv, hSessionKey, KP_SERVER_RANDOM, server_random, 0);
CPSetKeyParam (hProv, hSessionKey, KP_PREHASH, NULL, 0);

Когда дело дойдёт до выработки сессионных ключей из master_secret, обратите внимание на алгоритм хеша CALG_TLS1_MASTER_HASH. Именно с помощью него осуществляются данные операции. Вкратце, в master_secret повторно устанавливаются KP_CLIENT_RANDOM и KP_SERVER_RANDOM, потом производится CPCreateHash (hProv, CALG_TLS1_MASTER_HASH, hSessionKey, 0, &hMasterHash), потом из него получаются 2 пары ключей (шифрования/контроля целостности для чтения/записи), каждая примерно следующей последовательностью вызовов:
DWORD Flags = (мы сервер && ключ чтения) || (мы клиент && ключ записи) ? 0 : CRYPT_SERVER;
CPDeriveKey (hProv, CALG_TLS1_ENC_KEY, hMasterHash, Flags, &hKey);
CPSetKeyParam (hProv, hKey, KP_CIPHEROID, (LPBYTE)OID_CipherVerbaO, 0);
CPSetKeyParam (hProv, hKey, KP_MODE, (LPBYTE)&cipherMode, 0);
CPDeriveKey (hProv, CALG_TLS1_MAC_KEY, hMasterHash, Flags, &hHMACKey);
CPSetKeyParam (hProv, hHMACKey, KP_CIPHEROID, (LPBYTE)OID_CipherVerbaO, 0);
CPCreateHash (hProv, CALG_G28147_IMIT, hHMACKey, 0, &hHMACHash);
Offline Владимир  
#3 Оставлено : 4 марта 2008 г. 23:08:25(UTC)
Владимир

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

Группы: Участники
Зарегистрирован: 29.02.2008(UTC)
Сообщений: 2
Откуда: Москва

Спасибо! Все получилось!

Я думал об использовании SSPI, но мне показалось что он слишком высокоуровневый для моей задачи.
К тому же я с ним никогда не работал, а с CSP у меня небольшой опыт работы уже есть.
Offline sushev_a_a  
#4 Оставлено : 14 февраля 2017 г. 14:19:08(UTC)
sushev_a_a

Статус: Участник

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

Сказал(а) «Спасибо»: 7 раз
добрый день.
разбираюсь с TLS. получилось создать ключи и выполнить шифрование, как описано в этой ветке.
но появилось несколько вопросов.

насколько сейчас актуален описанный здесь способ? а то ветке 9 лет)
реальная реализация TLS в криптопро работает таким же образом? для TLS_GOSTR341112_256_WITH_28147_CNT_IMIT

как при данном способе получить вектор инициализации IV? просто как первые 8 байт UKM?

и ещё. в списке алгоритмов есть CALG_TLS1PRF_2012_256. он ведь тоже позволяет создать ключи из общего секрета.
в каких случаях тогда используется CALG_TLS1PRF_2012_256 и в каких CALG_TLS1_MASTER_HASH_2012_256?
Offline sushev_a_a  
#5 Оставлено : 16 февраля 2017 г. 11:04:33(UTC)
sushev_a_a

Статус: Участник

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

Сказал(а) «Спасибо»: 7 раз
up
Offline Станислав Смышляев  
#6 Оставлено : 17 февраля 2017 г. 9:36:11(UTC)
Станислав Смышляев

Статус: Сотрудник

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

Сказал(а) «Спасибо»: 1 раз
Поблагодарили: 81 раз в 62 постах
Добрый день!

Порядок работы описан в документе, утвержденном ТК 26: http://tc26.ru/methods/r...on/%D0%A2%D0%9A26TLS.pdf

Если по нему будет что-то неясно, спрашивайте здесь, ответим.
С уважением,
Станислав Смышляев, к.ф.-м.н.,
Заместитель генерального директора ООО "КРИПТО-ПРО"
Техническую поддержку оказываем здесь.
Наша база знаний.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.