From fca9bf1a16447d1e80aba3278fb84cf2c78258e7 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Tue, 13 Dec 2016 22:59:40 +0100 Subject: [PATCH] gossip: Partially sign channel_announcements We can already add our own signatures, will have to defer remote signatures until we implement the channel setup messages from the spec. --- daemon/p2p_announce.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) 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); }