Recheck peer admission during session handshake and document BLE policy

This commit is contained in:
evgeny committed 2026-10-30 22:42:02 +01:00
1 parent 8d92144a5a
commit 6d9ef7383c
3 files changed
+29 -3

No files matched your search

+24
View File
@@ -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, порты и имя
+2 -1
View File
@@ -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)) {
@@ -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)) {