4.6 KiB
Рукопожатие
На рукопожатие возложена задача создать между клиентом и сервером новый поток или восстановить существующий (из десинхронизированного состояния в рабочее), на взаимно согласованных условиях. Это включает в себя определение готовности коммуникации по протоколу, согласование версии протокола в пределах сессии (если создаётся новая), а также согласование различных параметров потока. Рукопожатие может быть "открытое", то есть в котором тело пакета представлено в нешифрованном виде и которое ведёт к созданию нешифрованного потока, и "шифрованное", в котором тело пакета зашифровано, подписано, и которое ведёт к созданию шифрованного потока. При выполнении этой процедуры используются данные в уникальном формате, несоответствующие формальному определению пакета. Формат данных использующийся в рукопожатии представлен ниже.
Существуют следующие типы рукопожатия:
- Первый тип: создаёт новую сессию
- Второй тип: создаёт новый поток в рамках существующей сессии
- Третий тип: восстанавливает существующий поток из десинхронизированного состояния в рабочее
Рукопожатие любого типа выполняется ровно в два действия:
- Клиент запрашивает рукопожатие с избранными параметрами
- Сервер отвечает клиенту либо своей частью параметров, либо ошибкой
Пакет рукопожатия состоит из заголовка и тела. В заголовок входят магическое число протокола и флаг шифрования. Тело представляет из себя данные сериализованные в формат KLV.
Флаг шифрования является восьмибитным целым числом и может принимать одно из двух значений:
0x00
- шифрования нет.0x80
- шифрование включено.
Формат пакета рукопожатия следующий:
B: byte(s)
|----------------------|
| Magic number: 8B |
|----------------------|
| Encryption flag: 1B |
|----------------------|
| Handshake body: >=1B |
|----------------------|
Базовые параметры
Базовые параметры, использующиеся в рукопожатии:
- Параметры шума в потоке
- Версия протокола
- Секрет потока
- Максимальный размер полезной нагрузки пакета
- Код ошибки сервера
- Детальное описание ошибки
Криптографические параметры
Тоже самое, что и базовые параметры, только связанные с криптографией.
- Алгоритм хэширования пакета
- Алгоритм шифрования события
- KDF для генерации ключей шифрования для пакетов
- Значение для инициализации KDF ключей пакетов
- Константа для использования KDF ключей пакетов
- Алгоритм подписи сервера
- Публичный ключ подписи сервера
- Алгоритм подписи клиента
- Публичный ключ подписи клиента
- KDF для генерации Server StreamId
- Значение для инициализации KDF SSId
- Константа для KDF SSId
- KDF для генерации Client StreamId
- Значение для инициализации KDF CSId
- Константа для KDF CSId