parsec3/notes/p3-2layout_ideas.md
sergeych 19b91c0470 +exception registry could be extended from inside adapter and transport
+if websock is already initialized in the server, ignore an error
2022-12-10 14:07:10 +01:00

2.9 KiB

Принцип

Поверх незащищенного уровня вешаем DH, инициализируем сразу.

Адаптеру второго уровня передаем некую затравку, из нее формируем ключ токена, который никому не отдаем (выводим из затравки). Когда ДХ сессия установлена, мы передаем клиенту токен сессии - зашифрованный на ключ клиента его сессионный ключ и использованием EtA.

Когда клиент пытается быстро восстановиться он присылает нам токен сессии. Мы его пытаемся расшифровать ключеом токена. Если он не изменился (а такое вполне себе возможно) или неверный, то EtA в любом случае это поймает. Если же EtA расшифровал, мы знаем что ключ нормальный, и его используем его для сессии.

Таким образом, сервер сессии не хранит :) по моему прикольно!

Реализация

Сервер

Начальное подключение

После получения ключа сессии из DH, шифрует его на ключ токена и полученный токен сессии отдает клиенту. Клиент сохраняет и ключ сессии, и токен.

Восстановление по токену

Клиент при начальном соединении вспоминает ключ сессии и токен, и отправляет последний на сервер, а для проверки владения отправляет также зашифрованный на сессионный ключ тот случайный мусор (EtA достаточная проверка, контент проверять не требуется).

Сервер при коннекте получает пару (токен, зашифрованная контрольная посылка). Он расшифровывает токен, получает ключ сессии. Если расшифровка успешна (EtA опять), то он знает что ключ верный. Дальше он расшифровывает им контрольную посылку, и если EtA не выдает ошибки, считает что сессия восстановлена, и отсылает новый токен сессии (ключ токена должен потихоньку ротироваться). После чего считаем что сессия восстановлена.