Verify group join binding independently of member profile
This commit is contained in:
1 parent
08a233eeed
commit
7eb4450bef
3 files changed
+12
-3
No files matched your search
@@ -632,6 +632,10 @@ static int member_apply_record(struct UTUN_INSTANCE* inst, const char* ch_id,
|
||||
int identity_ok = 1;
|
||||
int has_signature = m->signature && !_sig_is_zero64(m->signature);
|
||||
if (!is_local) {
|
||||
if (m->join_sig && !_sig_is_zero64(m->join_sig)) {
|
||||
int verified = _verify_join_sig(db, ch_id, m);
|
||||
if (verified != 1) return verified == MS_VERIFY_ERROR ? MT_ERR_IO : MT_ERR_DATA;
|
||||
}
|
||||
/* жёсткая привязка идентичности: node_id = derive(x25519), ed25519 — доверенный из nodes */
|
||||
uint64_t derived = sc_derive_node_id_from_pubkey(m->x25519);
|
||||
if (!derived) {
|
||||
@@ -928,6 +932,11 @@ int member_sync_verify_local_record(struct sqlite3* db, const char* ch_id, const
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* JOIN проверяется и при наличии профиля: профиль сам по себе не связывает запись с группой. */
|
||||
if (m->join_sig && !_sig_is_zero64(m->join_sig)) {
|
||||
int verified = _verify_join_sig(db, ch_id, m);
|
||||
if (verified != 1) return verified == MS_VERIFY_ERROR ? -1 : 0;
|
||||
}
|
||||
/* update_sig присутствует — верифицируем */
|
||||
if (m->update_sig && !_sig_is_zero64(m->update_sig)) {
|
||||
uint8_t vmsg[8192];
|
||||
|
||||
@@ -156,7 +156,7 @@ static void test_invitation_certificate(struct UASYNC* ua) {
|
||||
}
|
||||
uint64_t nid = sc_derive_node_id_from_pubkey(x); uint8_t join[64], tree[64], update[64], body[256];
|
||||
int len = member_sync_build_join_msg(x, owner_pub, nid, x, 1, body, sizeof(body)); assert(len == 112);
|
||||
assert(sc_ed25519_sign(priv, body, len, join) == SC_OK && member_sync_sign_pubkey(owner_priv, x, tree) == 0);
|
||||
assert(sc_ed25519_sign(priv, body, len, join) == SC_OK && member_sync_sign_join(owner_priv, join, tree) == 0);
|
||||
struct ms_member_rec rec = { .node_id = nid, .x25519 = x, .ed25519 = pub, .join_sig = join, .join_ts = 1,
|
||||
.update_sig = update, .update_ts = 2, .userinfo = "{\"name\":\"profile\"}", .signature = tree };
|
||||
len = member_sync_build_update_msg(join, rec.update_ts, rec.userinfo, body, sizeof(body)); assert(len > 0);
|
||||
@@ -213,7 +213,7 @@ static void test_owner_sizes(struct UASYNC* ua) {
|
||||
uint8_t join[64], tree[64], owner[64], update[64], msg[MS_ADM_TAGS_MAX + 8];
|
||||
int n = member_sync_build_join_msg(x, owner_pub, nid, x, 1, msg, sizeof(msg)); assert(n > 0);
|
||||
assert(sc_ed25519_sign(priv, msg, n, join) == SC_OK);
|
||||
assert(member_sync_sign_pubkey(owner_priv, x, tree) == 0);
|
||||
assert(member_sync_sign_join(owner_priv, join, tree) == 0);
|
||||
char tags[MS_ADM_TAGS_MAX + 2];
|
||||
char userinfo[MS_USERINFO_MAX + 1];
|
||||
struct ms_member_rec rec = { .node_id = nid, .x25519 = x, .ed25519 = pub,
|
||||
|
||||
@@ -105,7 +105,7 @@ static void purge_setup(struct purge_fixture* f, struct UASYNC* ua, int join_onl
|
||||
.signature = f->tree, .adm_tags = "{\"ver\":\"1\",\"storage\":\"yes\"}", .adm_tags_sig = f->owner_sig };
|
||||
int len = member_sync_build_join_msg(f->x, f->owner, f->member.node_id, f->x, 1, body, sizeof(body)); assert(len == 112);
|
||||
assert(sc_ed25519_sign(priv, body, len, f->join) == SC_OK);
|
||||
assert(member_sync_sign_pubkey(owner_priv, f->x, f->tree) == 0);
|
||||
assert(member_sync_sign_join(owner_priv, f->join, f->tree) == 0);
|
||||
if (!join_only) {
|
||||
f->member.update_sig = f->update; f->member.update_ts = 2;
|
||||
len = member_sync_build_update_msg(f->join, 2, f->member.userinfo, body, sizeof(body)); assert(len > 0);
|
||||
|
||||
Reference in new issue
Block a user