1 #include <bitcoin/chainparams.h>
2 #include <ccan/io/io.h>
3 #include <common/dev_disconnect.h>
4 #include <common/status.h>
5 #include <common/wire_error.h>
6 #include <connectd/connectd.h>
7 #include <connectd/connectd_wiregen.h>
8 #include <connectd/peer_exchange_initmsg.h>
9 #include <wire/peer_wire.h>
10 
11 /* Temporary structure for us to read peer message in */
12 struct peer {
13 	struct daemon *daemon;
14 
15 	/* The ID of the peer */
16 	struct node_id id;
17 
18 	/* Where it's connected to/from. */
19 	struct wireaddr_internal addr;
20 
21 	/* Crypto state for writing/reading peer initmsg */
22 	struct crypto_state cs;
23 
24 	/* Buffer for reading/writing message. */
25 	u8 *msg;
26 
27 	bool incoming;
28 };
29 
contains_common_chain(struct bitcoin_blkid * chains)30 static bool contains_common_chain(struct bitcoin_blkid *chains)
31 {
32 	for (size_t i = 0; i < tal_count(chains); i++) {
33 		if (bitcoin_blkid_eq(&chains[i], &chainparams->genesis_blockhash))
34 			return true;
35 	}
36 	return false;
37 }
38 
39 /* Here in case we need to read another message. */
40 static struct io_plan *read_init(struct io_conn *conn, struct peer *peer);
41 
peer_init_received(struct io_conn * conn,struct peer * peer)42 static struct io_plan *peer_init_received(struct io_conn *conn,
43 					  struct peer *peer)
44 {
45 	u8 *msg = cryptomsg_decrypt_body(tmpctx, &peer->cs, peer->msg);
46 	u8 *globalfeatures, *features;
47 	struct tlv_init_tlvs *tlvs = tlv_init_tlvs_new(msg);
48 
49 	if (!msg)
50 		return io_close(conn);
51 
52 	status_peer_io(LOG_IO_IN, &peer->id, msg);
53 
54 	/* BOLT #1:
55 	 *
56 	 * A receiving node:
57 	 *   - upon receiving a message of _odd_, unknown type:
58 	 *     - MUST ignore the received message.
59 	 */
60 	if (unlikely(is_unknown_msg_discardable(msg)))
61 		return read_init(conn, peer);
62 
63 	if (!fromwire_init(tmpctx, msg, &globalfeatures, &features, tlvs)) {
64 		status_peer_debug(&peer->id,
65 				  "bad fromwire_init '%s', closing",
66 				  tal_hex(tmpctx, msg));
67 		return io_close(conn);
68 	}
69 
70 	/* BOLT #1:
71 	 * The receiving node:
72 	 * ...
73 	 *  - upon receiving `networks` containing no common chains
74 	 *    - MAY fail the connection.
75 	 */
76 	if (tlvs->networks) {
77 		if (!contains_common_chain(tlvs->networks)) {
78 			status_peer_debug(&peer->id,
79 			                  "No common chain with this peer '%s', closing",
80 			                  tal_hex(tmpctx, msg));
81 			msg = towire_warningfmt(NULL, NULL, "No common network");
82 			msg = cryptomsg_encrypt_msg(NULL, &peer->cs, take(msg));
83 			return io_write(conn, msg, tal_count(msg), io_close_cb, NULL);
84 		}
85 	}
86 
87 	/* The globalfeatures field is now unused, but there was a
88 	 * window where it was: combine the two. */
89 	features = featurebits_or(tmpctx, take(features), globalfeatures);
90 
91 	/* Usually return io_close_taken_fd, but may wait for old peer to
92 	 * be disconnected if it's a reconnect. */
93 	return peer_connected(conn, peer->daemon, &peer->id,
94 			      &peer->addr, &peer->cs,
95 			      take(features),
96 			      peer->incoming);
97 }
98 
peer_init_hdr_received(struct io_conn * conn,struct peer * peer)99 static struct io_plan *peer_init_hdr_received(struct io_conn *conn,
100 					      struct peer *peer)
101 {
102 	u16 len;
103 
104 	if (!cryptomsg_decrypt_header(&peer->cs, peer->msg, &len))
105 		return io_close(conn);
106 
107 	tal_free(peer->msg);
108 	peer->msg = tal_arr(peer, u8, (u32)len + CRYPTOMSG_BODY_OVERHEAD);
109 	return io_read(conn, peer->msg, tal_count(peer->msg),
110 		       peer_init_received, peer);
111 }
112 
read_init(struct io_conn * conn,struct peer * peer)113 static struct io_plan *read_init(struct io_conn *conn, struct peer *peer)
114 {
115 	/* Free our sent init msg. */
116 	tal_free(peer->msg);
117 
118 	/* BOLT #1:
119 	 *
120 	 * The receiving node:
121 	 *  - MUST wait to receive `init` before sending any other messages.
122 	 */
123 	peer->msg = tal_arr(peer, u8, CRYPTOMSG_HDR_SIZE);
124 	return io_read(conn, peer->msg, tal_bytelen(peer->msg),
125 		       peer_init_hdr_received, peer);
126 }
127 
128 #if DEVELOPER
peer_write_postclose(struct io_conn * conn,struct peer * peer)129 static struct io_plan *peer_write_postclose(struct io_conn *conn,
130 					    struct peer *peer)
131 {
132 	dev_sabotage_fd(io_conn_fd(conn), true);
133 	return read_init(conn, peer);
134 }
135 
peer_write_post_sabotage(struct io_conn * conn,struct peer * peer)136 static struct io_plan *peer_write_post_sabotage(struct io_conn *conn,
137 						struct peer *peer)
138 {
139 	dev_sabotage_fd(io_conn_fd(conn), false);
140 	return read_init(conn, peer);
141 }
142 #endif
143 
peer_exchange_initmsg(struct io_conn * conn,struct daemon * daemon,const struct feature_set * our_features,const struct crypto_state * cs,const struct node_id * id,const struct wireaddr_internal * addr,bool incoming)144 struct io_plan *peer_exchange_initmsg(struct io_conn *conn,
145 				      struct daemon *daemon,
146 				      const struct feature_set *our_features,
147 				      const struct crypto_state *cs,
148 				      const struct node_id *id,
149 				      const struct wireaddr_internal *addr,
150 				      bool incoming)
151 {
152 	/* If conn is closed, forget peer */
153 	struct peer *peer = tal(conn, struct peer);
154 	struct io_plan *(*next)(struct io_conn *, struct peer *);
155 	struct tlv_init_tlvs *tlvs;
156 
157 	peer->daemon = daemon;
158 	peer->id = *id;
159 	peer->addr = *addr;
160 	peer->cs = *cs;
161 	peer->incoming = incoming;
162 
163 	/* BOLT #1:
164 	 *
165 	 * The sending node:
166 	 *   - MUST send `init` as the first Lightning message for any
167 	 *     connection.
168 	 *  ...
169 	 *   - SHOULD set `networks` to all chains it will gossip or open
170 	 *     channels for.
171 	 */
172 	tlvs = tlv_init_tlvs_new(tmpctx);
173 	tlvs->networks = tal_dup_arr(tlvs, struct bitcoin_blkid,
174 				     &chainparams->genesis_blockhash, 1, 0);
175 
176 	/* Initially, there were two sets of feature bits: global and local.
177 	 * Local affected peer nodes only, global affected everyone.  Both were
178 	 * sent in the `init` message, but node_announcement only advertized
179 	 * globals.
180 	 *
181 	 * But we didn't have any globals for a long time, and it turned out
182 	 * that people wanted us to broadcast local features so they could do
183 	 * peer selection.  We agreed that the number spaces should be distinct,
184 	 * but debate still raged on how to handle them.
185 	 *
186 	 * Meanwhile, we finally added a global bit to the spec, so now it
187 	 * matters.  And LND v0.8 decided to make option_static_remotekey a
188 	 * GLOBAL bit, not a local bit, so we need to send that as a global
189 	 * bit here.
190 	 *
191 	 * Finally, we agreed that bits below 13 could be put in both, but
192 	 * from now on they'll all go in initfeatures. */
193 	peer->msg = towire_init(NULL,
194 				our_features->bits[GLOBAL_INIT_FEATURE],
195 				our_features->bits[INIT_FEATURE],
196 				tlvs);
197 	status_peer_io(LOG_IO_OUT, &peer->id, peer->msg);
198 	peer->msg = cryptomsg_encrypt_msg(peer, &peer->cs, take(peer->msg));
199 
200 	next = read_init;
201 #if DEVELOPER
202 	switch (dev_disconnect(WIRE_INIT)) {
203 	case DEV_DISCONNECT_BEFORE:
204 		dev_sabotage_fd(io_conn_fd(conn), true);
205 		break;
206 	case DEV_DISCONNECT_DROPPKT:
207 		peer->msg = tal_free(peer->msg); /* FALL THRU */
208 	case DEV_DISCONNECT_AFTER:
209 		next = peer_write_postclose;
210 		break;
211 	case DEV_DISCONNECT_BLACKHOLE:
212 		dev_blackhole_fd(io_conn_fd(conn));
213 		break;
214 	case DEV_DISCONNECT_NORMAL:
215 		break;
216 	case DEV_DISCONNECT_DISABLE_AFTER:
217 		next = peer_write_post_sabotage;
218 		break;
219 	}
220 #endif /* DEVELOPER */
221 
222 	return io_write(conn, peer->msg, tal_bytelen(peer->msg), next, peer);
223 }
224