stadium-proto/Streams.md

4.1 KiB
Raw Blame History

Потоки

Поток представляет из себя канал обмена событиями в определённой конфигурации. Узлы должны обрабатывать события единообразно, вне зависимости от того, через какой поток они передаются.

Stream ID

Каждый поток имеет пару собственных уникальных идентификаторов: "Stream ID", "SID". Они используются для определения принадлежности события к существующим потокам. Для увеличения энтропии, с целью исключения анализа траффика, SID представляет из себя нефиксированное значение, уникальное для каждого события. Каждый из двух узлов в соединении имеет собственный SID.

Допустим, что есть два узла: pc, который подключается, и ps, к которому подключается pc. Тогда пусть SID, используемый узлом pc будет называться sidc, а ps - sids. Для того, чтобы установить новое соединение, узлы должны проделать следующее:

  1. pc генерирует стартовое значение sidc и отправляет его узлу ps вместе с алгоритмами симметричного шифрования и хэширования для обработки sids, а также симметричный ключ соответствующего алгоритму размера.
  2. 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 в полученном событии, то он обязан разорвать соединение.