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