Правки касательно ХШ, криптографии и пр. мелочь

This commit is contained in:
Shr3dd3r 2023-10-03 03:10:20 +03:00
parent 29348a49d4
commit c6b88359f9
6 changed files with 28 additions and 25 deletions

View File

@ -69,10 +69,10 @@ enum CryptoAlgoType: uint8_t {
Структура, определяющая криптографический алгоритм и размерность. Для шифров это размер ключа, а для хэшей - размер выходных данных (если применимо). Для хэш-функций и симметричных шифров размер ключа вычисляется по формуле `Size << 4`, а для ассиметричных по формуле `Size << 8`. Размерность опускается для контрольных сумм и не-криптографических функций. Структура, определяющая криптографический алгоритм и размерность. Для шифров это размер ключа, а для хэшей - размер выходных данных (если применимо). Для хэш-функций и симметричных шифров размер ключа вычисляется по формуле `Size << 4`, а для ассиметричных по формуле `Size << 8`. Размерность опускается для контрольных сумм и не-криптографических функций.
```C++ ```C++
typedef struct { struct CryptoAlgo {
CryptoAlgoType Type; CryptoAlgoType Type;
uint8_t Size; uint8_t Size;
} CryptoAlgo; };
``` ```
#### ServerDescriptor #### ServerDescriptor
@ -80,10 +80,10 @@ typedef struct {
Дескриптор сервера, представляющий из себя хэш открытого ключа серверной подписи и использующийся алгоритм. Длинна хэша может варьироваться, но всегда не более 512 бит. Дескриптор сервера, представляющий из себя хэш открытого ключа серверной подписи и использующийся алгоритм. Длинна хэша может варьироваться, но всегда не более 512 бит.
```C++ ```C++
typedef struct { struct ServerDescriptor {
char[64] Hash; char[64] Hash;
CryptoAlgo Type; CryptoAlgo Type;
} ServerDescriptor; };
``` ```
#### LocID #### LocID
@ -100,10 +100,10 @@ typedef uint64_t LocID;
Идентификатор глобального объекта. Идентификатор глобального объекта.
```C++ ```C++
typedef struct { struct GlobID {
uint64_t Object; uint64_t Object;
ServerDescriptor Server; ServerDescriptor Server;
} GlobID; };
``` ```
#### Power #### Power

View File

@ -1,9 +1,11 @@
# Handshake # Handshake
После успешной установки защищённого соединения, происходит обмен характеристиками обоих сторон, AKA "рукопожатие". Запрашивающий соединение отправляет пакет следующего формата: ## Protocol-level handshake
После успешной установки соединения происходит обмен характеристиками обоих сторон, AKA "рукопожатие протокольного уровня". Запрашивающий соединение отправляет пакет следующего формата:
<!--`[magic number: 8B][protocol version: 4B][sizes: 1B][crypto params: 6B][reconnection flags: 4B]`--> <!--`[magic number: 8B][protocol version: 4B][sizes: 1B][crypto params: 6B][reconnection flags: 4B]`-->
`[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` - _Тип:_ `uint64_t`
@ -31,8 +33,8 @@
- `0b11`: размер данных это `uint64_t` - `0b11`: размер данных это `uint64_t`
- Маска `0b00000011`: резерв--> - Маска `0b00000011`: резерв-->
- Параметры криптографии - Параметры криптографии
- _Тип:_ `CryptoAlgo[3]` - _Тип:_ `CryptoAlgo[4]`
- Описывает используемые криптографические алгоритмы на уровне "клиент-сервер". Первый элемент это используемый алгоритм для хэша полезной нагрузки; второй это алгоритм ассиметричного шифрования; третий элемент это алгоритм симметричного шифра. - Описывает используемые криптографические алгоритмы на уровне прямого подключения (т.е. "сервер-сервер" или "сервер-клиент"). Первый элемент выделен под хэш-функцию; второй для ассиметричной функции подписи; третий для ассиметричной функции шифрования; четвёртый для симметричной функции.
- Если равно нулю, то используются опции данной версии протокола по умолчанию (SHA256, RSA-2048, AES-192). - Если равно нулю, то используются опции данной версии протокола по умолчанию (SHA256, RSA-2048, AES-192).
- Флаги переподключения - Флаги переподключения
- _Тип:_ `uint32_t` - _Тип:_ `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` - _Тип:_ `uint64_t`
@ -58,8 +60,11 @@
- _Тип:_ `uint8_t` - _Тип:_ `uint8_t`
- Байт с фиксированным нулевым значением, свидетельствующий об успешном подключении и принятии целевым сервером обозначенных условий. - Байт с фиксированным нулевым значением, свидетельствующий об успешном подключении и принятии целевым сервером обозначенных условий.
- Порт для переподключения - Порт для переподключения
- _Тип:_ `uint8_t` - _Тип:_ `uint16_t`
- К указанному порту целевой сервер предлагает подключиться запрашиваемому, если тот запросил его. Значение должно быть нулём, если порт не был запрошен. - К указанному порту целевой сервер предлагает подключиться запрашиваемому, если тот запросил его. Значение должно быть нулём, если порт не был запрошен.
- Максимальный размер полезной нагрузки
- _Тип:_ `uint16_t`
- Всегда больше нуля. Запрашивающий должен соблюдать размерность полезной нагрузки в событии и она всегда должна быть равна или меньше этого значения.
Пакет с ошибкой имеет следующий формат: Пакет с ошибкой имеет следующий формат:
@ -75,16 +80,16 @@
- 0x02: неподдерживаемая версия протокола. - 0x02: неподдерживаемая версия протокола.
- 0x03: невозможно выделить новый порт для подключения. - 0x03: невозможно выделить новый порт для подключения.
- 0x04: указанный транспортный протокол не поддерживается. - 0x04: указанный транспортный протокол не поддерживается.
<!--- 0x05: указанная конфигурация размерностей не поддерживается.--> - 0x05: указанная конфигурация размерностей не поддерживается.
- 0x06: недопустимые параметры криптографии. - 0x06: недопустимые параметры криптографии.
- 0x07: один из указанных криптографических алгоритмов отключён на сервере. - 0x07: один из указанных криптографических алгоритмов отключён на сервере.
- Описание ошибки - Описание ошибки
- _Тип:_ `uint8_t` - _Тип:_ `uint8_t`
- Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом. - Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом.
Если цель не поддерживает указанную при рукопожатии версию протокола, запрашивающий может попробовать установить соединение снова, указав более низкую и поддерживаемую им версию протокола. Если цель не поддерживает указанные при рукопожатии параметры, запрашивающий может попробовать установить соединение снова, с иными значениями.
Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 50 мс до 500 мс, создать новое. Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 10 мс до 500 мс, создать новое.
## Магическое число ## Магическое число

View File

@ -1,7 +1,7 @@
# Список зарезервированных ключей ячеек # Список зарезервированных ключей ячеек
<!-- TODO: сделать папку и там разместить подробное описание некоторых ключей --> <!-- TODO: сделать папку и там разместить подробное описание некоторых ключей -->
Перечисленные здесь значения являются либо совсем базовыми, либо предназначены для использования сервером. Все данные транзитных пакетов (т.е. тех, которые предназначены для кого-то кроме подключённого напрямую серверу), для которых критична подлинность, должны передаваться в ячейке `Data` и быть подписанными с помощью ячейки `SignedDataHash`. Перечисленные здесь значения являются либо совсем базовыми, либо предназначены для использования сервером. Все данные транзитных пакетов (т.е. тех, которые предназначены для кого-то кроме сервера подключённого напрямую), для которых критична подлинность, должны передаваться в ячейке `Data` и быть подписанными с помощью ячейки `SignedDataHash`.
@ -34,7 +34,7 @@
- Path - Path
- _Значение:_ `0x07` - _Значение:_ `0x07`
- _Тип:_ `char[]` - _Тип:_ `char[]`
- Название загружаемого/запрашиваемого файла или URL. - Путь к запрашиваемому/загружаемому ресурсу.
- Power - Power
- _Значение:_ `0x08` - _Значение:_ `0x08`
- _Тип:_ `Power` - _Тип:_ `Power`
@ -50,8 +50,8 @@
- CryptoAlgos - CryptoAlgos
- _Значение:_ `0x11` - _Значение:_ `0x11`
- _Тип:_ `CryptoAlgo[3]` - _Тип:_ `CryptoAlgo[4]`
- Используемые криптографические алгоритмы. Первый элемент выделен под хэш-функцию; второй элемент для ассиметричной функции; третий элемент для симметричной функции. - Используемые криптографические алгоритмы. Предназначено для использования конечной целью, а не промежуточным узлом (сервером). Первый элемент выделен под хэш-функцию; второй для ассиметричной функции подписи; третий для ассиметричной функции шифрования; четвёртый для симметричной функции.
- CryptoKeyID - CryptoKeyID
- _Значение:_ `0x12` - _Значение:_ `0x12`
- _Тип:_ `uint32_t` - _Тип:_ `uint32_t`

View File

@ -66,7 +66,7 @@ Stadium это протокол для безопасной коммуникац
`[category][subcategory][event id: 2B][payload hash: ~B][payload: >0B]` `[category][subcategory][event id: 2B][payload hash: ~B][payload: >0B]`
Размер пакета не нормирован и ответственность за его менеджмент остаётся на транспортном уровне. Размер пакета не нормирован и ответственность за его менеджмент остаётся на транспортном уровне. Размер полезной нагрузки определяется сервером, к которому происходит подключение, на этапе рукопожатия.
P.S.: _эталонная реализация Stadium будет использовать общий универсальный интерфейс, который, в свою очередь, заворачивать все данные в релевантный протокол транспортного уровня._ P.S.: _эталонная реализация Stadium будет использовать общий универсальный интерфейс, который, в свою очередь, заворачивать все данные в релевантный протокол транспортного уровня._
@ -74,8 +74,6 @@ P.S.: _эталонная реализация Stadium будет использ
Некоторые категории событий зарезервированы под нужды базового протокола или просто для событий определённого рода. Второе носит рекомендательный характер; вы также можете использовать иные диапазоны для тех-же целей. Ниже приведены диапазоны зарезервированных значений. Некоторые категории событий зарезервированы под нужды базового протокола или просто для событий определённого рода. Второе носит рекомендательный характер; вы также можете использовать иные диапазоны для тех-же целей. Ниже приведены диапазоны зарезервированных значений.
<!--Все из зарезервированных типов помещаются в минимальную размерность типа события (т.е. по одному байту на категорию и подкатегорию).-->
Зарезервировано для нужд протокола и запрещено к использованию в частных реализациях (см. также файлы в директории `reserved/` для конкретных примеров): Зарезервировано для нужд протокола и запрещено к использованию в частных реализациях (см. также файлы в директории `reserved/` для конкретных примеров):
- Категория `0x01` - Категория `0x01`
@ -92,7 +90,7 @@ P.S.: _эталонная реализация Stadium будет использ
### Зарезервированные ключи ячеек ### Зарезервированные ключи ячеек
У данных в формате KLDR также существуют зарезервированные ключи<!--, которые аналогичным образом помещаются в минимальную размерность ключа-->: У данных в формате KLDR также существуют зарезервированные ключи:
- `0x00` - `0x00`
- Запрещено к использованию. - Запрещено к использованию.

View File

@ -10,7 +10,7 @@
До выполнения аутентификации, сервер может, но не обязан, подписывать каждый свой пакет. Клиент не должен подписывать свои пакеты и должен устанавливать хэш полезной нагрузки в нулевое значение. До выполнения аутентификации, сервер может, но не обязан, подписывать каждый свой пакет. Клиент не должен подписывать свои пакеты и должен устанавливать хэш полезной нагрузки в нулевое значение.
Сервер не должен проверять подпись пакетов клиента. Клиент должен проверять подпись только в случае наличия у него открытого ключа сервера. Сервер должен не проверять подпись пакетов клиента. Клиент должен проверять подпись только в случае наличия у него открытого ключа сервера.
### Регистрация ### Регистрация

View File

@ -2,7 +2,7 @@
**Значение типа: 0xBA98** **Значение типа: 0xBA98**
**Требует аутентификацию: нет** **Требует аутентификации: нет**
## Client2Server ## Client2Server