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

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`. Размерность опускается для контрольных сумм и не-криптографических функций.
```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

View File

@ -1,9 +1,11 @@
# 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][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: указанная конфигурация размерностей не поддерживается.-->
- 0x05: указанная конфигурация размерностей не поддерживается.
- 0x06: недопустимые параметры криптографии.
- 0x07: один из указанных криптографических алгоритмов отключён на сервере.
- Описание ошибки
- _Тип:_ `uint8_t`
- Текстовое описание ошибки. Является строкой в кодировке ASCII, оканчивающейся нулевым байтом.
Если цель не поддерживает указанную при рукопожатии версию протокола, запрашивающий может попробовать установить соединение снова, указав более низкую и поддерживаемую им версию протокола.
Если цель не поддерживает указанные при рукопожатии параметры, запрашивающий может попробовать установить соединение снова, с иными значениями.
Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 50 мс до 500 мс, создать новое.
Если при хэндшейке запрашивающим был указан новый способ подключения и получен валидный ответ с согласием от сервера - то они обязаны разорвать текущее соединение, затем, спустя случайное количество времени, от 10 мс до 500 мс, создать новое.
## Магическое число

View File

@ -1,7 +1,7 @@
# Список зарезервированных ключей ячеек
<!-- TODO: сделать папку и там разместить подробное описание некоторых ключей -->
Перечисленные здесь значения являются либо совсем базовыми, либо предназначены для использования сервером. Все данные транзитных пакетов (т.е. тех, которые предназначены для кого-то кроме подключённого напрямую серверу), для которых критична подлинность, должны передаваться в ячейке `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`

View File

@ -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`
- Запрещено к использованию.

View File

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

View File

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