diff --git a/daemon/p2p_announce.c b/daemon/p2p_announce.c index 1fcc85744..a384c608f 100644 --- a/daemon/p2p_announce.c +++ b/daemon/p2p_announce.c @@ -263,7 +263,9 @@ static void broadcast_channel_announcement(struct lightningd_state *dstate, stru { struct msg_channel_announcement *msg = tal(peer, struct msg_channel_announcement); struct txlocator *loc; - u8 *ser; + struct signature *my_node_signature; + struct signature *my_bitcoin_signature; + u8 *serialized; loc = locate_tx(msg, dstate, &peer->anchor.txid); @@ -271,21 +273,40 @@ static void broadcast_channel_announcement(struct lightningd_state *dstate, stru msg->channel_id.txnum = loc->index; msg->channel_id.outnum = peer->anchor.index; + + /* Set all sigs to zero */ + memset(&msg->node_signature_1, 0, sizeof(msg->node_signature_1)); + memset(&msg->bitcoin_signature_1, 0, sizeof(msg->bitcoin_signature_1)); + memset(&msg->node_signature_2, 0, sizeof(msg->node_signature_2)); + memset(&msg->bitcoin_signature_2, 0, sizeof(msg->bitcoin_signature_2)); + + //FIXME(cdecker) Copy remote stored signatures into place if (pubkey_cmp(&dstate->id, peer->id) > 0) { msg->node_id_1 = *peer->id; msg->node_id_2 = dstate->id; msg->bitcoin_key_1 = *peer->id; msg->bitcoin_key_2 = dstate->id; + my_node_signature = &msg->node_signature_2; + my_bitcoin_signature = &msg->bitcoin_signature_2; } else { msg->node_id_2 = *peer->id; msg->node_id_1 = dstate->id; msg->bitcoin_key_2 = *peer->id; msg->bitcoin_key_1 = dstate->id; + my_node_signature = &msg->node_signature_1; + my_bitcoin_signature = &msg->bitcoin_signature_1; } + /* Sign the node_id with the bitcoin_key, proves delegation */ + serialized = tal_arr(msg, u8, 0); + towire_pubkey(&serialized, &dstate->id); + privkey_sign(dstate, serialized, tal_count(serialized), my_bitcoin_signature); - //FIXME(cdecker) actually sign this packet, currently not pinned down in spec - ser = towire_channel_announcement(msg, msg); - broadcast(dstate, WIRE_CHANNEL_ANNOUNCEMENT, ser, NULL); + /* Sign the entire packet with `node_id`, proves integrity and origin */ + serialized = towire_channel_announcement(msg, msg); + privkey_sign(dstate, serialized + 128, tal_count(serialized) - 128, my_node_signature); + + serialized = towire_channel_announcement(msg, msg); + broadcast(dstate, WIRE_CHANNEL_ANNOUNCEMENT, serialized, NULL); tal_free(msg); }