stadium-proto/Handshakes.md

8.5 KiB
Raw Blame History

Рукопожатие

Протокольного уровня

После успешного подключения к целевому узлу через избранный транспорт - происходит обмен параметрами обоих сторон, 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: количество задаётся по усмотрению целевого узла
        • 0b010: соотношение шумовых пакетов к реальным - 1:8
        • 0b011: соотношение - 1:4
        • 0b100: 1:2
        • 0b101: 1:1
        • 0b110: 2:1
        • 0b111: 4:1
      • 0b00011000: выделено под настройки размера шумовых пакетов
        • 0b00: по усмотрению целевого узла
        • 0b01: случайный размер, в пределах от минимального пакета с нулевой полезной нагрузкой, до размера пакета с полезной нагрузкой размерности, которую должен передать целевой узел при одобрении рукопожатия
        • 0b10: случайный размер, в пределах от минимального, до максимального / 2
        • 0b11: случайный размер, на основе среднего размера передаваемого пакета +- 25% (но всегда меньше максимального)
      • 0b00000111: выделено под настройки размера шумовых данных в обычных пакетах
        • 0b000: без шумовых данных
        • 0b001: заполнение шумовыми данными до лимита полезной нагрузки
        • 0b010: заполнение шумовыми данными в случайном количестве, от нуля, до лимита полезной нагрузки
        • Диапазон 0b011-0b111: зарезервировано
  • Флаги переподключения

    • Тип: 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.