From c6b88359f974e843513eded6c75f6bac4e310a14 Mon Sep 17 00:00:00 2001 From: shr3dd3r Date: Tue, 3 Oct 2023 03:10:20 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=B0=D1=81=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=A5?= =?UTF-8?q?=D0=A8,=20=D0=BA=D1=80=D0=B8=D0=BF=D1=82=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=84=D0=B8=D0=B8=20=D0=B8=20=D0=BF=D1=80.=20=D0=BC?= =?UTF-8?q?=D0=B5=D0=BB=D0=BE=D1=87=D1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DATA TYPES.md | 12 ++++++------ HANDSHAKE.md | 23 ++++++++++++++--------- KLDR RESERVED KEYS.md | 8 ++++---- OVERVIEW.md | 6 ++---- SESSIONS.md | 2 +- reserved/METHOD FORMAT EXAMPLE.md | 2 +- 6 files changed, 28 insertions(+), 25 deletions(-) diff --git a/DATA TYPES.md b/DATA TYPES.md index 8c9995a..abd7542 100644 --- a/DATA TYPES.md +++ b/DATA TYPES.md @@ -69,10 +69,10 @@ enum CryptoAlgoType: uint8_t { Структура, определяющая криптографический алгоритм и размерность. Для шифров это размер ключа, а для хэшей - размер выходных данных (если применимо). Для хэш-функций и симметричных шифров размер ключа вычисляется по формуле `Size << 4`, а для ассиметричных по формуле `Size << 8`. Размерность опускается для контрольных сумм и не-криптографических функций. ```C++ -typedef struct { +struct CryptoAlgo { CryptoAlgoType Type; uint8_t Size; -} CryptoAlgo; +}; ``` #### ServerDescriptor @@ -80,10 +80,10 @@ typedef struct { Дескриптор сервера, представляющий из себя хэш открытого ключа серверной подписи и использующийся алгоритм. Длинна хэша может варьироваться, но всегда не более 512 бит. ```C++ -typedef struct { +struct ServerDescriptor { char[64] Hash; CryptoAlgo Type; -} ServerDescriptor; +}; ``` #### LocID @@ -100,10 +100,10 @@ typedef uint64_t LocID; Идентификатор глобального объекта. ```C++ -typedef struct { +struct GlobID { uint64_t Object; ServerDescriptor Server; -} GlobID; +}; ``` #### Power diff --git a/HANDSHAKE.md b/HANDSHAKE.md index ea2bd09..e6d4d94 100644 --- a/HANDSHAKE.md +++ b/HANDSHAKE.md @@ -1,9 +1,11 @@ # Handshake -После успешной установки защищённого соединения, происходит обмен характеристиками обоих сторон, AKA "рукопожатие". Запрашивающий соединение отправляет пакет следующего формата: +## Protocol-level handshake + +После успешной установки соединения происходит обмен характеристиками обоих сторон, AKA "рукопожатие протокольного уровня". Запрашивающий соединение отправляет пакет следующего формата: -`[magic number: 8B][protocol version: 4B][crypto params: 6B][reconnection flags: 4B]` +`[magic number: 8B][protocol version: 4B][crypto params: 8B][reconnection flags: 4B]` - Магическое число - _Тип:_ `uint64_t` @@ -31,8 +33,8 @@ - `0b11`: размер данных это `uint64_t` - Маска `0b00000011`: резерв--> - Параметры криптографии - - _Тип:_ `CryptoAlgo[3]` - - Описывает используемые криптографические алгоритмы на уровне "клиент-сервер". Первый элемент это используемый алгоритм для хэша полезной нагрузки; второй это алгоритм ассиметричного шифрования; третий элемент это алгоритм симметричного шифра. + - _Тип:_ `CryptoAlgo[4]` + - Описывает используемые криптографические алгоритмы на уровне прямого подключения (т.е. "сервер-сервер" или "сервер-клиент"). Первый элемент выделен под хэш-функцию; второй для ассиметричной функции подписи; третий для ассиметричной функции шифрования; четвёртый для симметричной функции. - Если равно нулю, то используются опции данной версии протокола по умолчанию (SHA256, RSA-2048, AES-192). - Флаги переподключения - _Тип:_ `uint32_t` @@ -49,7 +51,7 @@ Пакет с согласием имеет следующий формат: -`[magic number: 8B][0x00][reconnection port: 2B]` +`[magic number: 8B][0x00][reconnection port: 2B][event payload max size: 2B]` - Магическое число - _Тип:_ `uint64_t` @@ -58,8 +60,11 @@ - _Тип:_ `uint8_t` - Байт с фиксированным нулевым значением, свидетельствующий об успешном подключении и принятии целевым сервером обозначенных условий. - Порт для переподключения - - _Тип:_ `uint8_t` + - _Тип:_ `uint16_t` - К указанному порту целевой сервер предлагает подключиться запрашиваемому, если тот запросил его. Значение должно быть нулём, если порт не был запрошен. +- Максимальный размер полезной нагрузки + - _Тип:_ `uint16_t` + - Всегда больше нуля. Запрашивающий должен соблюдать размерность полезной нагрузки в событии и она всегда должна быть равна или меньше этого значения. Пакет с ошибкой имеет следующий формат: @@ -75,16 +80,16 @@ - 0x02: неподдерживаемая версия протокола. - 0x03: невозможно выделить новый порт для подключения. - 0x04: указанный транспортный протокол не поддерживается. - + - 0x05: указанная конфигурация размерностей не поддерживается. - 0x06: недопустимые параметры криптографии. - 0x07: один из указанных криптографических алгоритмов отключён на сервере. - Описание ошибки - _Тип:_ `uint8_t` - Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом. -Если цель не поддерживает указанную при рукопожатии версию протокола, запрашивающий может попробовать установить соединение снова, указав более низкую и поддерживаемую им версию протокола. +Если цель не поддерживает указанные при рукопожатии параметры, запрашивающий может попробовать установить соединение снова, с иными значениями. -Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 50 мс до 500 мс, создать новое. +Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 10 мс до 500 мс, создать новое. ## Магическое число diff --git a/KLDR RESERVED KEYS.md b/KLDR RESERVED KEYS.md index 6eda736..0f14876 100644 --- a/KLDR RESERVED KEYS.md +++ b/KLDR RESERVED KEYS.md @@ -1,7 +1,7 @@ # Список зарезервированных ключей ячеек -Перечисленные здесь значения являются либо совсем базовыми, либо предназначены для использования сервером. Все данные транзитных пакетов (т.е. тех, которые предназначены для кого-то кроме подключённого напрямую серверу), для которых критична подлинность, должны передаваться в ячейке `Data` и быть подписанными с помощью ячейки `SignedDataHash`. +Перечисленные здесь значения являются либо совсем базовыми, либо предназначены для использования сервером. Все данные транзитных пакетов (т.е. тех, которые предназначены для кого-то кроме сервера подключённого напрямую), для которых критична подлинность, должны передаваться в ячейке `Data` и быть подписанными с помощью ячейки `SignedDataHash`. @@ -34,7 +34,7 @@ - Path - _Значение:_ `0x07` - _Тип:_ `char[]` - - Название загружаемого/запрашиваемого файла или URL. + - Путь к запрашиваемому/загружаемому ресурсу. - Power - _Значение:_ `0x08` - _Тип:_ `Power` @@ -50,8 +50,8 @@ - CryptoAlgos - _Значение:_ `0x11` - - _Тип:_ `CryptoAlgo[3]` - - Используемые криптографические алгоритмы. Первый элемент выделен под хэш-функцию; второй элемент для ассиметричной функции; третий элемент для симметричной функции. + - _Тип:_ `CryptoAlgo[4]` + - Используемые криптографические алгоритмы. Предназначено для использования конечной целью, а не промежуточным узлом (сервером). Первый элемент выделен под хэш-функцию; второй для ассиметричной функции подписи; третий для ассиметричной функции шифрования; четвёртый для симметричной функции. - CryptoKeyID - _Значение:_ `0x12` - _Тип:_ `uint32_t` diff --git a/OVERVIEW.md b/OVERVIEW.md index 73360a6..f350fcc 100644 --- a/OVERVIEW.md +++ b/OVERVIEW.md @@ -66,7 +66,7 @@ Stadium это протокол для безопасной коммуникац `[category][subcategory][event id: 2B][payload hash: ~B][payload: >0B]` -Размер пакета не нормирован и ответственность за его менеджмент остаётся на транспортном уровне. +Размер пакета не нормирован и ответственность за его менеджмент остаётся на транспортном уровне. Размер полезной нагрузки определяется сервером, к которому происходит подключение, на этапе рукопожатия. P.S.: _эталонная реализация Stadium будет использовать общий универсальный интерфейс, который, в свою очередь, заворачивать все данные в релевантный протокол транспортного уровня._ @@ -74,8 +74,6 @@ P.S.: _эталонная реализация Stadium будет использ Некоторые категории событий зарезервированы под нужды базового протокола или просто для событий определённого рода. Второе носит рекомендательный характер; вы также можете использовать иные диапазоны для тех-же целей. Ниже приведены диапазоны зарезервированных значений. - - Зарезервировано для нужд протокола и запрещено к использованию в частных реализациях (см. также файлы в директории `reserved/` для конкретных примеров): - Категория `0x01` @@ -92,7 +90,7 @@ P.S.: _эталонная реализация Stadium будет использ ### Зарезервированные ключи ячеек -У данных в формате KLDR также существуют зарезервированные ключи: +У данных в формате KLDR также существуют зарезервированные ключи: - `0x00` - Запрещено к использованию. diff --git a/SESSIONS.md b/SESSIONS.md index 48e53fa..75390da 100644 --- a/SESSIONS.md +++ b/SESSIONS.md @@ -10,7 +10,7 @@ До выполнения аутентификации, сервер может, но не обязан, подписывать каждый свой пакет. Клиент не должен подписывать свои пакеты и должен устанавливать хэш полезной нагрузки в нулевое значение. -Сервер не должен проверять подпись пакетов клиента. Клиент должен проверять подпись только в случае наличия у него открытого ключа сервера. +Сервер должен не проверять подпись пакетов клиента. Клиент должен проверять подпись только в случае наличия у него открытого ключа сервера. ### Регистрация diff --git a/reserved/METHOD FORMAT EXAMPLE.md b/reserved/METHOD FORMAT EXAMPLE.md index ff88ac6..eeb6f49 100644 --- a/reserved/METHOD FORMAT EXAMPLE.md +++ b/reserved/METHOD FORMAT EXAMPLE.md @@ -2,7 +2,7 @@ **Значение типа: 0xBA98** -**Требует аутентификацию: нет** +**Требует аутентификации: нет** ## Client2Server