diff --git a/src/chat/chat_devgroup_invite.c b/src/chat/chat_devgroup_invite.c index 394c2ed5d..ffec25b87 100644 --- a/src/chat/chat_devgroup_invite.c +++ b/src/chat/chat_devgroup_invite.c @@ -41,9 +41,6 @@ static struct chat_devgroup* dg_ctx(struct UTUN_INSTANCE* inst) { return inst && static int dg_pending(unsigned state) { return state == DG_WAIT_PIN || state == DG_PIN_SENT || state == DG_KEYS_SENT || state >= DG_WAIT_RETURN; } static void dg_clear_pins(struct dg_invite* p) { OPENSSL_cleanse(p->pin, sizeof(p->pin)); OPENSSL_cleanse(p->entered_pin, sizeof(p->entered_pin)); - if (!dg_pending(p->state)) { - OPENSSL_cleanse(p->last_pin, sizeof(p->last_pin)); OPENSSL_cleanse(p->last_return_pin, sizeof(p->last_return_pin)); - } } static int dg_random_pin(char pin[5], const char* different) { uint32_t random; @@ -114,6 +111,7 @@ void chat_devgroup_revalidate_members(struct UTUN_INSTANCE* inst, uint64_t group if (!dg_peer(inst, group, p->peer, x, ed) && !memcmp(x, p->x, 32) && !memcmp(ed, p->ed, 32)) continue; p->state = p->state == DG_KEYS_SENT ? DG_UNKNOWN : DG_REJECTED; dg_clear_pins(p); changed = 1; + OPENSSL_cleanse(p->last_pin, sizeof(p->last_pin)); OPENSSL_cleanse(p->last_return_pin, sizeof(p->last_return_pin)); DEBUG_INFO(DEBUG_CATEGORY_CHAT, "devgroup: invitation revoked group=%llu peer=%016llx state=%u", (unsigned long long)group, (unsigned long long)p->peer, p->state); } @@ -283,6 +281,7 @@ void chat_devgroup_cancel_pending(struct UTUN_INSTANCE* inst) { struct dg_invite* p = &ctx->slots[i]; if (!dg_pending(p->state)) continue; p->state = p->state == 3 ? 7 : 5; dg_clear_pins(p); + OPENSSL_cleanse(p->last_pin, sizeof(p->last_pin)); OPENSSL_cleanse(p->last_return_pin, sizeof(p->last_return_pin)); DEBUG_INFO(DEBUG_CATEGORY_CHAT, "devgroup: invitation cancelled peer=%016llx state=%u", (unsigned long long)p->peer, p->state); } dg_changed(ctx); diff --git a/tests/test_group_api_isolation.c b/tests/test_group_api_isolation.c index 4917452c9..2a57c5cea 100644 --- a/tests/test_group_api_isolation.c +++ b/tests/test_group_api_isolation.c @@ -236,7 +236,8 @@ static int api_stream_packet(const struct stream_message* m, const void* payload static int api_streams(void) { struct UTUN_INSTANCE* server = fixture.nodes[0]; struct UTUN_INSTANCE* client = fixture.nodes[1]; - for (unsigned i = 0; i < 2; i++) REQUIRE(!chat_service_start(fixture.nodes[i])); + /* Предыдущие сценарии запускали модули вручную; перейти к штатному полному lifecycle чата. */ + for (unsigned i = 0; i < 2; i++) { chat_core_destroy(fixture.nodes[i]); REQUIRE(!chat_service_start(fixture.nodes[i])); } fixture.receivers[ETCP_ID_STREAM] = server->api_bindings.callbacks[ETCP_ID_STREAM]; server->api_bindings.callbacks[ETCP_ID_STREAM] = observe; api_stream_client = client->api_bindings.callbacks[ETCP_ID_STREAM]; client->api_bindings.callbacks[ETCP_ID_STREAM] = api_stream_observe; @@ -277,7 +278,6 @@ static int api_streams(void) { REQUIRE(!send_routed(&saved, relay_wire, sizeof(relay_wire), 0)); REQUIRE(!send_routed(&saved, relay_wire, sizeof(relay_wire), ROUTE_CRYPTO_SIGN)); check("STREAM relay requires both signature and encryption", net->relay_request_count == 1); - struct SVC_ROUTE_HDR wrong_group = saved; wrong_group.group_id = 111; REQUIRE(!api_send(111, ETCP_RT_ID_STREAM, relay_wire, sizeof(relay_wire))); check("STREAM routed group must match payload group", net->relay_request_count == 1); REQUIRE(!api_admit(112, client->node_id, 0)); lease = f->deadline;