Ed25519 self-signature in NODEINFO + fix sync sequence and zero-key bug

Add x25519_self_sig[64] to TOPOMSG_NODE/TOPO_NODE:
- topo_node.h: add field to both structs (wire format + memory)
- topo_node.c: compute Ed25519_sign(ed25519_privkey, x25519_pubkey) for own node
- topo_node.c: serialize/deserialize x25519_self_sig
- topo_group.c: verify Ed25519 self-sig on NODEINFO receive, reject forgery

Fix Ed25519 pubkey zero-key bug:
- topo_node_sqlite.c: get_ed25519_pubkey rejects all-zero key (MUST be non-zero)

Delay db_sync until Ed25519 key is available:
- db_sync.c: db_sync_on_conn_up checks db_get_ed25519_pubkey before starting
- db_sync.c: db_sync_peer_check_cb also checks Ed25519 key availability
- This prevents sync starting before NODEINFO with verified Ed25519 arrives
This commit is contained in:
Evgeny committed 2026-07-23 19:55:15 +03:00
1 parent 3890d2038d
commit 85269d1da3
5 files changed
+32 -6

No files matched your search

+3 -1
View File
@@ -165,6 +165,7 @@ struct TOPOMSG_NODE {
uint8_t ver;
uint8_t public_key[SC_PUBKEY_SIZE];
uint8_t ed25519_public_key[SC_PUBKEY_SIZE];
uint8_t x25519_self_sig[64]; // Ed25519_sign(ed25519_privkey, x25519_pubkey, 32)
uint8_t node_name_len;
uint8_t local_v4_sockets;
uint8_t local_v4_addrs;
@@ -206,7 +207,8 @@ struct TOPO_NODE {
uint8_t ver;
uint8_t public_key[SC_PUBKEY_SIZE];
uint8_t ed25519_public_key[SC_PUBKEY_SIZE];
char* node_name; // отдельный u_strdup/u_free
uint8_t x25519_self_sig[64]; // Ed25519_sign(ed25519_privkey, x25519_pubkey, 32)
char* node_name; // отдельный u_strdup/u_free
struct TOPO_SOCKMETA4* v4_sock_meta; // linked list head
struct TOPO_ADDR4* v4_addrs; // linked list head
struct TOPO_SOCKMETA6* v6_sock_meta;