49 lines
6.4 KiB
Plaintext
49 lines
6.4 KiB
Plaintext
Внедрение группы устройств в чат (devgroup).
|
||
|
||
Первый этап: объединение устройств одного пользователя и группировка в списке участников.
|
||
|
||
1. Идентичность и хранение.
|
||
Устройство состоит максимум в одной devgroup. При создании группы генерируются две отдельные общие пары ключей:
|
||
X25519 для шифрования и Ed25519 для подписей. Публичный ключ Ed25519 идентифицирует группу.
|
||
Обе пары одинаковы на всех устройствах devgroup; при добавлении устройств передаются существующие ключи.
|
||
Принадлежность подтверждает подпись devgroup над идентичностью конкретного устройства (node_id и его публичные ключи).
|
||
Одного совпадения публичного ключа devgroup недостаточно.
|
||
Секреты хранятся отдельно от публичного профиля и не теряются при перезапуске; текущий local_identity перезаписывается при старте.
|
||
|
||
2. Приглашение.
|
||
A выбирает известное устройство B и показывает PIN из 4 цифр. B получает приглашение и вводит PIN с экрана A.
|
||
Обмен идёт через ETCP-router с обязательными сквозным шифрованием и подписью; BGP обеспечивает маршрут.
|
||
Приглашение одноразовое, привязано к ключам B и случайному ID, действует 2 минуты, допускает 3 попытки.
|
||
После проверки A передаёт ключи и профиль группы. B проверяет и сохраняет их, затем подтверждает успех.
|
||
Повторы идемпотентны; потеря подтверждения означает неизвестный результат, а не отказ. Переданные секреты отменой не отзываются.
|
||
Устройство из другой devgroup должно сначала выйти из неё; неявного слияния групп нет.
|
||
|
||
3. Профиль и версии.
|
||
Ник, ver, timestamp и публичный ключ X25519 входят в расширяемый JSON, целиком подписанный ключом Ed25519 devgroup
|
||
с отдельным назначением подписи. Подпись связывает ключ шифрования с идентичностью группы.
|
||
Хранятся и пересылаются исходные подписанные байты. Победитель определяется по (ver, timestamp, SHA256(JSON)).
|
||
Локальное изменение увеличивает максимальную известную ver на 1; при репликации версия не увеличивается.
|
||
Формат должен учитывать текущие ограничения userinfo: строковые значения и общий размер 1024 байта вместе с остальными свойствами.
|
||
|
||
4. Репликация первого этапа.
|
||
Оба публичных ключа, удостоверение устройства и подписанный профиль передаются в подписанном userinfo участника.
|
||
Устройство публикует их во всех своих каналах. Более свежий проверенный профиль своей devgroup принимает
|
||
и переносит в собственные записи остальных каналов, не меняя чужие записи и не перепубликуя неизменившиеся данные.
|
||
Это работает по связанной цепочке общих каналов; независимая от каналов сеть устройств в первый этап не входит.
|
||
При создании канала и вступлении в новый канал сразу публикуется актуальная принадлежность.
|
||
|
||
5. Выход.
|
||
Добровольный выход удаляет локальные ключи и devgroup-поля из всех собственных member-записей с повышением их версий.
|
||
Локальное состояние и публикации меняются атомарно; уведомления и распространение выполняются после commit.
|
||
Старые сетевые записи не возвращают устройство в группу. Принудительный отзыв устройства со сменой ключей — отдельный этап.
|
||
|
||
6. Список участников и границы этапа.
|
||
В Qt и Android устройства с проверенной принадлежностью объединяются под раскрывающимся [+] с актуальным ником devgroup.
|
||
Внутри показываются устройства текущего канала. Права и действия остаются у конкретных устройств;
|
||
заголовок группы не подменяется node_id одного из них. Группа online, если доступно хотя бы одно активное устройство.
|
||
Звонки на все устройства и объединение DM в первый этап не входят.
|
||
|
||
Порядок реализации: состояние и проверка devgroup → профиль и репликация → приглашения → API/headless → Qt и Android.
|
||
Проверить подделки, конфликты версий, offline-сходимость, повторы, потери ответов, перезапуск, ошибки сохранения и выход.
|
||
Логи показывают состояния и причины отказов, но не PIN и секреты.
|