4.1 KiB
Потоки
Поток представляет из себя канал обмена событиями в определённой конфигурации. Узлы должны обрабатывать события единообразно, вне зависимости от того, через какой поток они передаются.
Stream ID
Каждый поток имеет пару собственных уникальных идентификаторов: "Stream ID", "SID". Они используются для определения принадлежности события к существующим потокам. Для увеличения энтропии, с целью исключения анализа траффика, SID представляет из себя нефиксированное значение, уникальное для каждого события. Каждый из двух узлов в соединении имеет собственный SID.
Допустим, что есть два узла: pc
, который подключается, и ps
, к которому подключается pc
. Тогда пусть SID, используемый узлом pc
будет называться sidc
, а ps
- sids
. Для того, чтобы установить новое соединение, узлы должны проделать следующее:
pc
генерирует стартовое значениеsidc
и отправляет его узлуps
вместе с алгоритмами симметричного шифрования и хэширования для обработкиsids
, а также симметричный ключ соответствующего алгоритму размера.ps
принимает данные и отвечает узлуpc
стартовым значениемsids
, алгоритмами шифрования и хэшированияsidc
, а также симметричный ключ соответствующего алгоритму размера.
При этом, ps
должен иметь единую конфигурацию алгоритмов симметричного шифрования, хэш-функции и используемый ключ для обработки SID всех потоков. Перед использованием в отправляемом событии, узел должен обработать прежнее значение SID, а именно: зашифровать его с использованием избранного при установке соединения алгоритма симметричного шифрования и ключа, а затем вычислить хэш. Если размер выходных данных хэш-функции больше размера SID, то эти данные поблочно XOR'ятся сами с собой. В реализации это может выглядеть вот так:
// size_t arr_sz: размер вывода хэш-функции
// char *arr: вывод хэш-функции
// uint32_t sid: прежний SID
sid = *(uint32_t*)arr;
for (size_t i = 1; i < arr_sz / 4; ++i)
sid = sid ^ ((uint32_t*)arr)[i];
Если любой из узлов обнаруживает ложное значение SID в полученном событии, то он обязан разорвать соединение.