122 lines
3.4 KiB
Markdown
122 lines
3.4 KiB
Markdown
# Типы данных
|
||
|
||
Сия спецификация, помимо всего прочего, также определяет некоторые необходимые типы и структуры данных. В данном файле вы найдёте их описание и декларации.
|
||
|
||
|
||
|
||
#### CryptoAlgoType
|
||
|
||
Перечисление всех допустимых к использованию в базовом протоколе алгоритмов вычисления хэшей, контрольных сумм, симметричного и ассиметричного шифрования.
|
||
|
||
```C++
|
||
enum CryptoAlgoType: uint8_t {
|
||
Reserved = 0,
|
||
// Checksums
|
||
CRC_16 = 11,
|
||
CRC_32,
|
||
CRC_64,
|
||
fletcher_8,
|
||
fletcher_16,
|
||
fletcher_32,
|
||
Adler_32,
|
||
// Non-crypto hashes
|
||
Murmur64A = 31,
|
||
Murmur3_32,
|
||
Murmur3_128,
|
||
Spooky_128,
|
||
// Cryptographic hashes
|
||
BLAKE2b = 61,
|
||
BLAKE3,
|
||
GOST,
|
||
HAS160,
|
||
HAVAL,
|
||
MD2,
|
||
MD5,
|
||
RIPEMD,
|
||
SHA1,
|
||
SHA2,
|
||
SHAKE128,
|
||
SHAKE256,
|
||
Skein,
|
||
Snefru,
|
||
Streebog,
|
||
Tiger,
|
||
Whirlpool,
|
||
// Symmetric key block ciphers
|
||
Blowfish = 131,
|
||
Twofish,
|
||
TripleDES_CBC,
|
||
AES_GCM, // AKA Rijndael
|
||
AES_CBC,
|
||
AES_CTR,
|
||
Camellia,
|
||
Salsa20,
|
||
CAST5,
|
||
CAST6,
|
||
Kuznyechik,
|
||
MESH,
|
||
Akelarre,
|
||
RC6,
|
||
// TODO
|
||
};
|
||
```
|
||
|
||
<!-- TODO: RSA, YAK, Cramer–Shoup system, Paillier cryptosystem, curves (25519 & 448), ElGamal, etc. -->
|
||
|
||
#### CryptoAlgo
|
||
|
||
Структура, определяющая криптографический алгоритм и размерность. Для шифров это размер ключа, а для хэшей - размер выходных данных (если применимо). Для хэш-функций и симметричных шифров размер ключа вычисляется по формуле `Size << 4`, а для ассиметричных по формуле `Size << 8`. Размерность опускается для контрольных сумм и не-криптографических функций.
|
||
|
||
```C++
|
||
struct CryptoAlgo {
|
||
CryptoAlgoType Type;
|
||
uint8_t Size;
|
||
};
|
||
```
|
||
|
||
#### ServerDescriptor
|
||
|
||
Дескриптор сервера, представляющий из себя хэш открытого ключа серверной подписи и использующийся алгоритм. Длинна хэша может варьироваться, но всегда не более 512 бит.
|
||
|
||
```C++
|
||
struct ServerDescriptor {
|
||
char[64] Hash;
|
||
CryptoAlgo Type;
|
||
};
|
||
```
|
||
|
||
#### LocID
|
||
|
||
Идентификатор локального для конкретного сервера объекта.
|
||
|
||
```C++
|
||
typedef uint64_t LocID;
|
||
```
|
||
|
||
|
||
#### GlobID
|
||
|
||
Идентификатор глобального объекта.
|
||
|
||
```C++
|
||
struct GlobID {
|
||
uint64_t Object;
|
||
ServerDescriptor Server;
|
||
};
|
||
```
|
||
|
||
#### Power
|
||
|
||
Права доступа к какому-либо объекту. Представляет из себя набор следующих флагов:
|
||
|
||
- `0b00000000000000000000000000000001`: чтение
|
||
- `0b00000000000000000000000000000010`: запись
|
||
- `0b00000000000000000000000000000100`: удаление
|
||
- `0b10000000000000000000000000000000`: изменение прав доступа
|
||
- `0b01111111111111111111111111111000`: нераспределено
|
||
|
||
Нераспределённые флаги могут быть использованы в расширениях протокола.
|
||
|
||
```C++
|
||
typedef uint32_t Power;
|
||
``` |