From 999514abec9b78d30bacbff50b345b13f48420ea Mon Sep 17 00:00:00 2001
From: shr3dd3r <uraneban@blackhost.xyz>
Date: Tue, 19 Dec 2023 06:08:43 +0300
Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=81=D0=BD=D0=BE=D0=B2=D0=B0=20=D0=BA?=
 =?UTF-8?q?=D0=B0=D1=81=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=BE=20=D0=BF?=
 =?UTF-8?q?=D0=BE=D1=82=D0=BE=D0=BA=D0=BE=D0=B2=20=D0=B3=D0=BE=D1=82=D0=BE?=
 =?UTF-8?q?=D0=B2=D0=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .gitignore |  1 -
 Streams.md | 26 ++++++++++++++++++++++++++
 2 files changed, 26 insertions(+), 1 deletion(-)
 create mode 100644 Streams.md

diff --git a/.gitignore b/.gitignore
index 8956a72..bf6f4d0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,4 +5,3 @@ LBM.md
 Reserved LBM keys.md
 Reserved events/
 Sessions.md
-Streams.md
\ No newline at end of file
diff --git a/Streams.md b/Streams.md
new file mode 100644
index 0000000..0fe4800
--- /dev/null
+++ b/Streams.md
@@ -0,0 +1,26 @@
+# Потоки
+
+**Поток** представляет из себя канал обмена _событиями_ в определённой конфигурации. _Узлы_ должны обрабатывать _события_ единообразно, вне зависимости от того, через какой _поток_ они передаются.
+
+## 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'ятся сами с собой. В реализации это может выглядеть вот так: <!--NOTICE: получше формализовать надо, скорее всего-->
+
+```C
+// 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 в полученном _событии_, то он обязан разорвать _соединение_. <!--и сохранять статус _потока_ в течении времени, определяемого имплементацией и конфигурацией. _Узел_, инициировавший создание _потока_, может попробовать пересоздать его в течении этого времени, -->
+<!--TODO: StreamRessurectionKey, восстановление потока в случае обрыва связи-->