Recheck peer admission during session handshake and document BLE policy
This commit is contained in:
1 parent
8d92144a5a
commit
6d9ef7383c
3 files changed
+29
-3
No files matched your search
@@ -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, порты и имя
|
||||
|
||||
@@ -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)) {
|
||||
|
||||
Reference in new issue
Block a user