From 6d9ef7383cfe028a73ad324fe634612d2a82b3c3 Mon Sep 17 00:00:00 2001 From: evgeny Date: Fri, 30 Oct 2026 22:42:02 +0100 Subject: [PATCH] Recheck peer admission during session handshake and document BLE policy --- doc/ble_etcp.txt | 24 +++++++++++++++++++ src/transport_layer/etcp_connections.c | 3 ++- .../chatgui-android/jni_bridge/android_ble.c | 5 ++-- 3 files changed, 29 insertions(+), 3 deletions(-) diff --git a/doc/ble_etcp.txt b/doc/ble_etcp.txt index 6dd7bd9ed..061b6fd9b 100644 --- a/doc/ble_etcp.txt +++ b/doc/ble_etcp.txt @@ -80,6 +80,30 @@ BLE ACK подтверждает приём GATT-value драйвером, не кадры — неизменённые зашифрованные ETCP-пакеты, без IP-заголовков/добавочного framing. До завершения обмена ключами действует дедлайн 20 секунд. +Допуск знакомого узла (31.10.2026) +-------------------------------- +etcp_connection_create(instance, name, require_known_node) сохраняет политику до NEW callbacks. +При флаге1 сам ETCP проверяет ключ после аутентификации пакета/STCP, до ответа INIT, +публикации UP и при подтверждении эпохи. Новый handshake проверяет заново; обычные DATA +используют положительный кэш линка. Протокол на проводе не меняется. +Проверка реализована в topo_groups_peer_key_known: активная своя CHAT-группа и полная +локальная запись source=0/deleted=0, точный X25519-ключ и производный node_id. +SQL принадлежит topo_node_sqlite_member_key_allowed. Объявление BLE, nodes-реестр или +пустая заглушка участника допуска не дают. Нет БД/групп или отказ чтения — нет допуска. + +У ETCP_CONN несколько путей: etcp_link_add(..., require_known_node) дополнительно +ограничивает новый BLE-линк уже существующего общего соединения, не меняя его TCP/UDP-пути. +Штатные Android/desktop BLE создают conn/link с require_known_node=1. Изолированные +аппаратные пробы без базы явно выбирают0; это не настройка штатного пользовательского UI. + +Неизвестному bootstrap-ключу общий BLE-драйвер не создаёт ETCP_CONN. Это только +отрицательный preflight, не доказательство владения ключом. GATT остаётся максимум60с +в режиме invitation-only: отдельный канал INVITE доступен по прежней настройке приёма, +а DATA отбрасывается. Если приглашение привело к JOIN и ключ стал известным, драйвер +раз в секунду проверяет возможность повышения, затем запускает полноценный ETCP handshake. +Поэтому отказ неизвестному ETCP не ломает приглашения, но один HELLO/публичный ключ +никогда не публикует UP и не удостоверяет известного собеседника. + Диагностика линка в обеих GUI использует общий etcp_link_get_snapshot: подпись BLE, физическое направление из ble_get_outgoing и фактические link_state/link_status ETCP. GATT READY сам по себе не включает зелёный индикатор. Адреса IP, порты и имя diff --git a/src/transport_layer/etcp_connections.c b/src/transport_layer/etcp_connections.c index c94a82a87..9919525b5 100644 --- a/src/transport_layer/etcp_connections.c +++ b/src/transport_layer/etcp_connections.c @@ -2936,7 +2936,8 @@ int etcp_packet_decrypted(struct ETCP_SOCKET* e_sock, struct ETCP_DGRAM* pkt, pkt->link=link; if (!pkt->data_len) { DEBUG_WARN(DEBUG_CATEGORY_ETCP,"empty decrypted ETCP packet"); result = 46; goto done; } if (conn->close_requested) { memory_pool_free(conn->instance->pkt_pool, pkt); goto done; } - if (!admit_peer(link, pkt->data[0] == ETCP_INIT_RESPONSE || pkt->data[0] == ETCP_INIT_RESPONSE_NOINIT)) { + if (!admit_peer(link, pkt->data[0] == ETCP_INIT_RESPONSE || pkt->data[0] == ETCP_INIT_RESPONSE_NOINIT + || (pkt->data[0] >= ETCP_SESSION_HELLO && pkt->data[0] <= ETCP_SESSION_CONFIRM))) { result = 8; goto done; } if (etcp_session_receive(link->etcp,pkt->data,pkt->data_len)) { diff --git a/tools/chatgui-android/jni_bridge/android_ble.c b/tools/chatgui-android/jni_bridge/android_ble.c index b56e2f6c9..0d21a3d3d 100644 --- a/tools/chatgui-android/jni_bridge/android_ble.c +++ b/tools/chatgui-android/jni_bridge/android_ble.c @@ -241,7 +241,8 @@ static void broadcast(void* arg, const struct ble_endpoint* ep, const uint8_t* b } } static int validate(void* arg, ble_link_id link, uint64_t peer) { - (void)arg; DEBUG_INFO(CAT, "BLE validation allow link=%llu node=%016llx", (unsigned long long)link, (unsigned long long)peer); + (void)arg; DEBUG_INFO(CAT, "BLE GATT identity received link=%llu node=%016llx; ETCP admission pending", + (unsigned long long)link, (unsigned long long)peer); return 1; } static void received(void* arg, ble_link_id link) { @@ -299,7 +300,7 @@ static void configure(void* arg) { } echo_instance = inst; } - driver = ble_etcp_create(instance_lite_get_uasync(), (flags & 8) ? NULL : inst, &cfg); + driver = ble_etcp_create(instance_lite_get_uasync(), (flags & 8) ? NULL : inst, &cfg, !(flags & (8 | 32))); transport = ble_etcp_radio(driver); if (!transport) { android_ble_detach(); return; } if (flags & (8 | 32)) {