tls sasl
iOS CI / Build and Test SwiftUI App (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build Unsigned iOS IPA (push) Canceled after 0s
Build Unsigned iOS and macOS Apps / Build macOS ZIP (push) Canceled after 0s

This commit is contained in:
wt committed 2026-09-02 11:46:11 +07:00
1 parent e3fcee3351
commit d4b4c92759
29 files changed
+2177 -61

No files matched your search

+31 -7
View File
@@ -12,14 +12,28 @@
разблокировка возможна по Face ID/Touch ID.
- Пароль для SCRAM нормализуется по RFC 4013 (SASLprep), чтобы совпадать с
серверной нормализацией; для PLAIN пароль отправляется как введён.
- SCRAM доступен в вариантах SHA-512 (предпочтительный, реализация Luma),
SHA-256 и SHA-1 (Martin); механизм выбирается по рекламе сервера.
- SCRAM доступен в вариантах SHA-512, SHA-256 и SHA-1 (SHA-512 —
реализация Luma), а также в PLUS-вариантах с канальной привязкой
(SCRAM-SHA-512-PLUS > SHA-256-PLUS > SHA-1-PLUS): gs2-заголовок
«p=tls-exporter,» (RFC 9266) или «p=tls-server-end-point,» доказывает,
что SASL-обмен идёт по тому же TLS-каналу, который видит клиент, и
ломает MITM-ретрансляцию. PLUS выбирается только когда сервер
рекламирует соответствующий channel-binding тип, иначе — обычный SCRAM;
механизм выбирается по рекламе сервера.
- OMEMO работает в legacy-неймспейсе `eu.siacs.conversations.axolotl` (так
умеет закреплённая версия MartinOMEMO); сообщения OMEMO 2
(`urn:xmpp:omemo:2`) показываются как нерасшифрованные, а не пустые.
- Канал шифруется STARTTLS/direct TLS через SecureTransport с уровнем
`negotiatedSSL` (исключает TLS ниже 1.2) и ALPN «xmpp-client»; на системах
с поддержкой SecureTransport договаривается TLS 1.3.
умеет закреплённая версия MartinOMEMO) и в OMEMO 2 (`urn:xmpp:omemo:2`,
payload AES-256-CBC + HMAC-SHA-256 в конверте SCE `urn:xmpp:sce:0`). Luma
публикует omemo:2 bundle и список устройств, делит Double Ratchet-сессии с
legacy-модулем и помечает протокол каждого ключа на экране шифрования.
- Канал шифруется STARTTLS/direct TLS собственным TLS-процессором Luma на
OpenSSL 3 (SecureTransport ограничивает потоковый TLS версией 1.2 и не
имеет keying exporter): минимум TLS 1.2, максимум TLS 1.3, ALPN
«xmpp-client», SNI по домену XMPP. Сертификат проверяется через
SecTrust с серверной политикой домена из JID (та же логика
CertificateTrustEvaluator). Фактическая версия TLS, шифр и выбранный
SASL-механизм (самый стойкий из рекламируемых сервером, с канальной
привязкой при её доступности) показываются на экране информации о
сервере.
- Когда OMEMO включено глобально или для конкретного чата, исходящие сообщения
не откатываются на plaintext при ошибке: ошибка показывается пользователю.
- Пользователь может осознанно отключить OMEMO глобально или для отдельного
@@ -65,6 +79,16 @@
- На iOS файл OMEMO-состояния и база локальной истории (SwiftData
`.store`) получают data-protection `completeUntilFirstUserAuthentication`.
- Архивные эхо собственных служебных станз (receipts, chat markers,
повторно доставленные копии) и собственные сообщения, которые невозможно
расшифровать обратно (нет encrypt-to-self ключа или self-сессия устарела),
не превращаются в пузыри «Не удалось расшифровать сообщение»: они
отбрасываются, как это делают другие клиенты, чтобы не засорять историю
фантомами, которых нет в виде сообщений на сервере.
- Сохранение медиа выполняется только по явному действию пользователя:
фото/видео/видеосообщения — в медиатеку, файлы и голосовые — в «Файлы»
(Загрузки). Расшифрованное содержимое при этом покидает sandbox приложения.
## Известные ограничения
- На macOS история (SwiftData SQLite в Application Support) и OMEMO state