# Типы данных Сия спецификация, помимо всего прочего, также определяет некоторые необходимые типы и структуры данных. В данном файле вы найдёте их описание и декларации. #### 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 }; ``` #### 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; ```