123 lines
3.6 KiB
Markdown
123 lines
3.6 KiB
Markdown
# Типы данных
|
||
|
||
Сия спецификация, помимо всего прочего, также определяет некоторые необходимые типы и структуры данных. В данном файле вы найдёте их описание и декларации.
|
||
|
||
|
||
|
||
#### CryptoAlgoType
|
||
|
||
Перечисление всех допустимых к использованию в базовом протоколе алгоритмов вычисления хэшей, контрольных сумм, симметричного и ассиметричного шифрования.
|
||
|
||
```C++
|
||
enum CryptoAlgoType: uint8_t {
|
||
Reserved = 0,
|
||
// Checksums
|
||
CRC_16 = 10,
|
||
CRC_32 = 11,
|
||
CRC_64 = 12,
|
||
fletcher_8 = 13,
|
||
fletcher_16 = 14,
|
||
fletcher_32 = 15,
|
||
Adler_32 = 16,
|
||
// Non-crypto hashes
|
||
Pearson_8 = 30,
|
||
Murmur64A = 31,
|
||
Murmur3_32 = 32,
|
||
Murmur3_128 = 33,
|
||
Spooky_128 = 34,
|
||
// Cryptographic hashes
|
||
BLAKE2b = 60,
|
||
BLAKE3 = 61,
|
||
GOST = 62,
|
||
HAS160 = 63,
|
||
HAVAL = 64,
|
||
MD2 = 65,
|
||
MD5 = 66,
|
||
RIPEMD = 67,
|
||
SHA1 = 68,
|
||
SHA2 = 69,
|
||
SHAKE128 = 70,
|
||
SHAKE256 = 71,
|
||
Skein = 72,
|
||
Snefru = 73,
|
||
Streebog = 74,
|
||
Tiger = 75,
|
||
Whirlpool = 76,
|
||
// Symmetric key block ciphers
|
||
Blowfish = 130,
|
||
Twofish = 131,
|
||
TripleDES_CBC = 132,
|
||
AES_GCM = 133, // AKA Rijndael
|
||
AES_CBC = 134,
|
||
AES_CTR = 135,
|
||
Camellia = 136,
|
||
Salsa20 = 137,
|
||
CAST5 = 138,
|
||
CAST6 = 139,
|
||
Kuznyechik = 140,
|
||
MESH = 141,
|
||
Akelarre = 142,
|
||
RC6 = 143,
|
||
// TODO
|
||
};
|
||
```
|
||
|
||
<!-- TODO: RSA, YAK, Cramer–Shoup system, Paillier cryptosystem, curves (25519 & 448), ElGamal, etc. -->
|
||
|
||
#### CryptoAlgo
|
||
|
||
Структура, определяющая криптографический алгоритм и размерность. Для шифров это размер ключа, а для хэшей - размер выходных данных (если применимо). Для хэш-функций и симметричных шифров размер ключа вычисляется по формуле `Size << 4`, а для ассиметричных по формуле `Size << 8`. Размерность опускается для контрольных сумм и не-криптографических функций.
|
||
|
||
```C++
|
||
typedef struct {
|
||
CryptoAlgoType Type;
|
||
uint8_t Size;
|
||
} CryptoAlgo;
|
||
```
|
||
|
||
#### ServerDescriptor
|
||
|
||
Дескриптор сервера, представляющий из себя хэш открытого ключа серверной подписи и использующийся алгоритм. Длинна хэша может варьироваться, но всегда не более 512 бит.
|
||
|
||
```C++
|
||
typedef struct {
|
||
char[64] Hash;
|
||
CryptoAlgo Type;
|
||
} ServerDescriptor;
|
||
```
|
||
|
||
#### LocID
|
||
|
||
Идентификатор локального для конкретного сервера объекта.
|
||
|
||
```C++
|
||
typedef uint64_t LocID;
|
||
```
|
||
|
||
|
||
#### GlobID
|
||
|
||
Идентификатор глобального объекта.
|
||
|
||
```C++
|
||
typedef struct {
|
||
uint64_t Object;
|
||
ServerDescriptor Server;
|
||
} GlobID;
|
||
```
|
||
|
||
#### Power
|
||
|
||
Права доступа к какому-либо объекту. Представляет из себя набор следующих флагов:
|
||
|
||
- `0b00000000000000000000000000000001`: чтение
|
||
- `0b00000000000000000000000000000010`: запись
|
||
- `0b00000000000000000000000000000100`: удаление
|
||
- `0b10000000000000000000000000000000`: изменение прав доступа
|
||
- `0b01111111111111111111111111111000`: нераспределено
|
||
|
||
Нераспределённые флаги могут быть использованы в расширениях протокола.
|
||
|
||
```C++
|
||
typedef uint32_t Power;
|
||
``` |