6.9 KiB
Handshake
После успешной установки защищённого соединения, происходит обмен характеристиками обоих сторон, AKA "рукопожатие". Запрашивающий соединение отправляет пакет следующего формата:
[magic number: 8B][protocol version: 4B][crypto params: 6B][reconnection flags: 4B]
- Магическое число
- Тип:
uint64_t
- Магическое число протокола, по которому определяется совместимость цели с протоколом Stadium. См. раздел "Магическое число" для справки.
- Тип:
- Версия протокола
- Тип:
uint32_t
- Поддерживаемая запрашивающим версия протокола.
- Тип:
- Параметры криптографии
- Тип:
CryptoAlgo[3]
- Описывает используемые криптографические алгоритмы на уровне "клиент-сервер". Первый элемент это используемый алгоритм для хэша полезной нагрузки; второй это алгоритм ассиметричного шифрования; третий элемент это алгоритм симметричного шифра.
- Если равно нулю, то используются опции данной версии протокола по умолчанию (SHA256, RSA-2048, AES-192).
- Тип:
- Флаги переподключения
- Тип:
uint32_t
- Описывает параметры нового подключения:
0b00000000000000000000000000000000
: оставить текущее подключение0b00000000000000000000000000000001
: переподключиться к тому-же порту0b00000000000000000000000000000010
: запросить новый порт для подключения0b00000000000000000000000000000100
: использовать TCP0b00000000000000000000000000010000
: использовать TLS0b00001111111111111111111111101000
: резерв под расширение0b11110000000000000000000000000000
: резерв под под нужды сторонних реализаций
- Тип:
На что целевой сервер отвечает пакетом либо с согласием, либо ошибкой.
Пакет с согласием имеет следующий формат:
[magic number: 8B][0x00][reconnection port: 2B]
- Магическое число
- Тип:
uint64_t
- См. выше.
- Тип:
0x00
- Тип:
uint8_t
- Байт с фиксированным нулевым значением, свидетельствующий об успешном подключении и принятии целевым сервером обозначенных условий.
- Тип:
- Порт для переподключения
- Тип:
uint8_t
- К указанному порту целевой сервер предлагает подключиться запрашиваемому, если тот запросил его. Значение должно быть нулём, если порт не был запрошен.
- Тип:
Пакет с ошибкой имеет следующий формат:
[magic number: 8B][error code: 1B][error description: ~B, zero-terminated]
- Магическое число
- Тип:
uint64_t
- См. выше.
- Тип:
- Код ошибки
- Тип:
uint8_t
- Код, описывающий ошибку конкретнее.
- 0x01: магическое число ложно.
- 0x02: неподдерживаемая версия протокола.
- 0x03: невозможно выделить новый порт для подключения.
- 0x04: указанный транспортный протокол не поддерживается.
- 0x06: недопустимые параметры криптографии.
- 0x07: один из указанных криптографических алгоритмов отключён на сервере.
- Тип:
- Описание ошибки
- Тип:
uint8_t
- Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом.
- Тип:
Если цель не поддерживает указанную при рукопожатии версию протокола, запрашивающий может попробовать установить соединение снова, указав более низкую и поддерживаемую им версию протокола.
Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 50 мс до 500 мс, создать новое.
Магическое число
Магическим числом протокола является следующая последовательность байт:
HEX: 0x53 0x74 0x61 0x64 0x69 0x75 0x6d 0x50
DEC: 83 116 97 100 105 117 109 80
Что соответствует строке "StadiumP" в кодировке ASCII.