|
|
|
|
@ -605,13 +605,19 @@ int topo_group_process_nodeinfo(struct TOPO_GROUP* group, struct ETCP_CONN* from
|
|
|
|
|
/* verify Ed25519 self-signature: Ed25519_pubkey must sign X25519_pubkey */ |
|
|
|
|
{ |
|
|
|
|
uint64_t ekchk; memcpy(&ekchk, new_ni->ed25519_public_key, 8); |
|
|
|
|
if (ekchk != 0 && sc_ed25519_verify(new_ni->ed25519_public_key, new_ni->public_key, SC_PUBKEY_SIZE, new_ni->x25519_self_sig) != SC_OK) { |
|
|
|
|
if (ekchk == 0) { |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "NODEINFO x25519_self_sig SKIP (ed25519 key zero) node=%016llx from=%s", |
|
|
|
|
(unsigned long long)node_id, from->log_name); |
|
|
|
|
} else if (sc_ed25519_verify(new_ni->ed25519_public_key, new_ni->public_key, SC_PUBKEY_SIZE, new_ni->x25519_self_sig) != SC_OK) { |
|
|
|
|
DEBUG_ERROR(DEBUG_CATEGORY_BGP, "NODEINFO x25519_self_sig VERIFY FAIL node=%016llx ed_pubkey=%016llx... from=%s — rejecting as forgery", |
|
|
|
|
(unsigned long long)node_id, ekchk, from->log_name); |
|
|
|
|
topo_node_free_raw(group->instance->topo_groups, new_ni); |
|
|
|
|
u_free(new_subnets); u_free(new_tranzit); u_free(new_hop_list); |
|
|
|
|
if (nodeinfo1) { queue_remove_data(group->nodes, &nodeinfo1->ll); queue_free(paths); queue_entry_free(&nodeinfo1->ll); } |
|
|
|
|
return -1; |
|
|
|
|
} else { |
|
|
|
|
DEBUG_DEBUG(DEBUG_CATEGORY_BGP, "NODEINFO x25519_self_sig OK node=%016llx ed_pubkey=%016llx... from=%s", |
|
|
|
|
(unsigned long long)node_id, ekchk, from->log_name); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|