126 lines
8.5 KiB
Markdown
126 lines
8.5 KiB
Markdown
|
# Рукопожатие
|
|||
|
|
|||
|
<!--TODO: переделать-->
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## Протокольного уровня
|
|||
|
|
|||
|
После успешного подключения к целевому _узлу_ через избранный транспорт - происходит обмен параметрами обоих сторон, AKA "рукопожатие протокольного уровня". Инициирующий соединение _узел_ отправляет пакет следующего формата:
|
|||
|
|
|||
|
`[magic number: 8B][protocol version: 4B][crypto params: 8B][noise params: 1B][reconnection flags: 4B]`
|
|||
|
|
|||
|
|
|||
|
- Магическое число
|
|||
|
- _Тип:_ `uint64_t`
|
|||
|
- Магическое число протокола, по которому определяется совместимость цели с протоколом Stadium. См. раздел "Магическое число" для справки.
|
|||
|
|
|||
|
- Версия протокола
|
|||
|
- _Тип:_ `uint32_t`
|
|||
|
- Поддерживаемая запрашивающим версия протокола.
|
|||
|
|
|||
|
- Параметры криптографии
|
|||
|
- _Тип:_ `CryptoAlgo[4]`
|
|||
|
- Описывает используемые криптографические алгоритмы на уровне прямого подключения (т.е. "узел-узел"). Первый элемент выделен под хэш-функцию; второй для ассиметричной функции подписи; третий для ассиметричной функции шифрования; четвёртый для симметричной функции.
|
|||
|
- Если равно нулю, то используются опции данной версии протокола по умолчанию (SHA-384, RSA-3072, AES-256).
|
|||
|
|
|||
|
- Параметры генерации шума в соединении
|
|||
|
- _Тип:_ `uint8_t`
|
|||
|
- Описывает прочие параметры соединения:
|
|||
|
- `0b11100000`: выделено под настройки количества _шумовых пакетов_
|
|||
|
- `0b000`: отсутствие _шумовых пакетов_
|
|||
|
- `0b001`: количество задаётся по усмотрению целевого _узла_ <!--TODO: звучит странно-->
|
|||
|
- `0b010`: соотношение _шумовых пакетов_ к реальным - 1:8
|
|||
|
- `0b011`: соотношение - 1:4
|
|||
|
- `0b100`: 1:2
|
|||
|
- `0b101`: 1:1
|
|||
|
- `0b110`: 2:1
|
|||
|
- `0b111`: 4:1
|
|||
|
- `0b00011000`: выделено под настройки размера _шумовых пакетов_
|
|||
|
- `0b00`: по усмотрению целевого _узла_ <!--TODO: звучит странно-->
|
|||
|
- `0b01`: случайный размер, в пределах от минимального _пакета_ с нулевой полезной нагрузкой, до размера _пакета_ с полезной нагрузкой размерности, которую должен передать целевой _узел_ при одобрении рукопожатия
|
|||
|
- `0b10`: случайный размер, в пределах от минимального, до максимального / 2
|
|||
|
- `0b11`: случайный размер, на основе среднего размера передаваемого пакета +- 25% (но всегда меньше максимального)
|
|||
|
- `0b00000111`: выделено под настройки размера _шумовых данных_ в обычных _пакетах_
|
|||
|
- `0b000`: без шумовых данных
|
|||
|
- `0b001`: заполнение шумовыми данными до лимита полезной нагрузки
|
|||
|
- `0b010`: заполнение шумовыми данными в случайном количестве, от нуля, до лимита полезной нагрузки
|
|||
|
- Диапазон `0b011`-`0b111`: зарезервировано <!--TODO: ещё варианты сделать-->
|
|||
|
|
|||
|
- Флаги переподключения <!--TODO: сделать енам с перечислением доступных транспортов и их параметров-->
|
|||
|
- _Тип:_ `uint32_t`
|
|||
|
- Описывает параметры нового подключения:
|
|||
|
- `0b00000000000000000000000000000000`: оставить текущее подключение
|
|||
|
- `0b00000000000000000000000000000001`: запросить новый транспорт для подключения
|
|||
|
- `0b00000000000000000000000000000100`: использовать TCP
|
|||
|
- `0b00000000000000000000000000010000`: использовать TLS
|
|||
|
- `0b00001111111111111111111111101010`: резерв под расширение
|
|||
|
- `0b11110000000000000000000000000000`: резерв под под нужды сторонних реализаций
|
|||
|
|
|||
|
|
|||
|
На это целевой _узел_ отвечает пакетом либо с согласием, либо с ошибкой.
|
|||
|
|
|||
|
Пакет с согласием имеет следующий формат:
|
|||
|
|
|||
|
`[magic number: 8B][0x00][reconnection port: 2B][event payload max size: 2B]`
|
|||
|
|
|||
|
|
|||
|
- Магическое число
|
|||
|
- _Тип:_ `uint64_t`
|
|||
|
- См. выше.
|
|||
|
|
|||
|
- `0x00`
|
|||
|
- _Тип:_ `uint8_t`
|
|||
|
- Байт с фиксированным нулевым значением, свидетельствующий об успешном подключении и принятии целевым _узлом_ обозначенных условий.
|
|||
|
|
|||
|
- Порт для переподключения
|
|||
|
- _Тип:_ `uint16_t`
|
|||
|
- К указанному порту целевой _узел_ предлагает подключиться запрашиваемому, если тот запросил его. Значение должно быть нулём, если порт не был запрошен.
|
|||
|
|
|||
|
- Максимальный размер полезной нагрузки
|
|||
|
- _Тип:_ `uint16_t`
|
|||
|
- Всегда больше нуля. Запрашивающий должен соблюдать размерность полезной нагрузки в событии и она всегда должна быть равна или меньше этого значения.
|
|||
|
|
|||
|
|
|||
|
Пакет с ошибкой имеет следующий формат:
|
|||
|
|
|||
|
`[magic number: 8B][error code: 1B][error description: ~B, zero-terminated]`
|
|||
|
|
|||
|
|
|||
|
- Магическое число
|
|||
|
- _Тип:_ `uint64_t`
|
|||
|
- См. выше.
|
|||
|
|
|||
|
- Код ошибки
|
|||
|
- _Тип:_ `uint8_t`
|
|||
|
- Код, описывающий ошибку конкретнее.
|
|||
|
- `0x01`: магическое число ложно.
|
|||
|
- `0x02`: неподдерживаемая версия протокола.
|
|||
|
- `0x03`: невозможно выделить новый порт для подключения.
|
|||
|
- `0x04`: указанный транспортный протокол не поддерживается.
|
|||
|
- `0x05`: указанная конфигурация размерностей не поддерживается.
|
|||
|
- `0x06`: недопустимые (несуществующие) параметры криптографии.
|
|||
|
- `0x07`: один из указанных криптографических алгоритмов отключён на _узле_.
|
|||
|
|
|||
|
- Описание ошибки
|
|||
|
- _Тип:_ `uint8_t`
|
|||
|
- Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом.
|
|||
|
|
|||
|
|
|||
|
Если цель не поддерживает указанные при рукопожатии параметры, запрашивающий может попробовать установить соединение снова, с иными значениями.
|
|||
|
|
|||
|
Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от целевого _узла_ - то они обязаны разорвать текущее соединение, затем, спустя разумное случайное количество времени, создать новое.
|
|||
|
|
|||
|
|
|||
|
|
|||
|
## Магическое число
|
|||
|
|
|||
|
Магическим числом протокола является следующая последовательность байт:
|
|||
|
|
|||
|
```
|
|||
|
HEX: 0x53 0x74 0x61 0x64 0x69 0x75 0x6d 0x50
|
|||
|
DEC: 83 116 97 100 105 117 109 80
|
|||
|
```
|
|||
|
|
|||
|
Что соответствует строке "StadiumP" в кодировке ASCII.
|