stadium-proto/DATA TYPES.md

123 lines
3.6 KiB
Markdown
Raw Normal View History

2023-07-08 07:09:56 +05:30
# Типы данных
Сия спецификация, помимо всего прочего, также определяет некоторые необходимые типы и структуры данных. В данном файле вы найдёте их описание и декларации.
#### 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, CramerShoup 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;
```
2023-07-08 07:09:56 +05:30
#### LocID
Идентификатор локального для конкретного сервера объекта.
```C++
typedef uint64_t LocID;
```
#### GlobID
Идентификатор глобального объекта.
2023-07-08 07:09:56 +05:30
```C++
typedef struct {
uint64_t Object;
ServerDescriptor Server;
2023-07-08 07:09:56 +05:30
} GlobID;
```
#### Power
Права доступа к какому-либо объекту. Представляет из себя набор следующих флагов:
- `0b00000000000000000000000000000001`: чтение
- `0b00000000000000000000000000000010`: запись
- `0b00000000000000000000000000000100`: удаление
- `0b10000000000000000000000000000000`: изменение прав доступа
- `0b01111111111111111111111111111000`: нераспределено
Нераспределённые флаги могут быть использованы в расширениях протокола.
2023-07-08 07:09:56 +05:30
```C++
typedef uint32_t Power;
```