Правки касательно ХШ, криптографии и пр. мелочь
This commit is contained in:
parent
29348a49d4
commit
c6b88359f9
@ -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
|
||||
|
23
HANDSHAKE.md
23
HANDSHAKE.md
@ -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 мс, создать новое.
|
||||
|
||||
## Магическое число
|
||||
|
||||
|
@ -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`
|
||||
|
@ -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`
|
||||
- Запрещено к использованию.
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
До выполнения аутентификации, сервер может, но не обязан, подписывать каждый свой пакет. Клиент не должен подписывать свои пакеты и должен устанавливать хэш полезной нагрузки в нулевое значение.
|
||||
|
||||
Сервер не должен проверять подпись пакетов клиента. Клиент должен проверять подпись только в случае наличия у него открытого ключа сервера.
|
||||
Сервер должен не проверять подпись пакетов клиента. Клиент должен проверять подпись только в случае наличия у него открытого ключа сервера.
|
||||
|
||||
### Регистрация
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
**Значение типа: 0xBA98**
|
||||
|
||||
**Требует аутентификацию: нет**
|
||||
**Требует аутентификации: нет**
|
||||
|
||||
## Client2Server
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user