chiark / gitweb /
pubkey handling: Call sethash when needed
[secnet.git] / site.c
1 /* site.c - manage communication with a remote network site */
2
3 /*
4  * This file is part of secnet.
5  * See README for full list of copyright holders.
6  *
7  * secnet is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  * 
12  * secnet is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * version 3 along with secnet; if not, see
19  * https://www.gnu.org/licenses/gpl.html.
20  */
21
22 /* The 'site' code doesn't know anything about the structure of the
23    packets it's transmitting.  In fact, under the new netlink
24    configuration scheme it doesn't need to know anything at all about
25    IP addresses, except how to contact its peer.  This means it could
26    potentially be used to tunnel other protocols too (IPv6, IPX, plain
27    old Ethernet frames) if appropriate netlink code can be written
28    (and that ought not to be too hard, eg. using the TUN/TAP device to
29    pretend to be an Ethernet interface).  */
30
31 /* At some point in the future the netlink code will be asked for
32    configuration information to go in the PING/PONG packets at the end
33    of the key exchange. */
34
35 #include "secnet.h"
36 #include <stdio.h>
37 #include <string.h>
38 #include <limits.h>
39 #include <assert.h>
40 #include <sys/socket.h>
41
42 #include <sys/mman.h>
43 #include "util.h"
44 #include "unaligned.h"
45 #include "magic.h"
46 #include "pubkeys.h"
47
48 #define SETUP_BUFFER_LEN 2048
49
50 #define DEFAULT_KEY_LIFETIME                  (3600*1000) /* [ms] */
51 #define DEFAULT_KEY_RENEGOTIATE_GAP           (5*60*1000) /* [ms] */
52 #define DEFAULT_SETUP_RETRIES 5
53 #define DEFAULT_SETUP_RETRY_INTERVAL             (2*1000) /* [ms] */
54 #define DEFAULT_WAIT_TIME                       (20*1000) /* [ms] */
55
56 #define DEFAULT_MOBILE_KEY_LIFETIME      (2*24*3600*1000) /* [ms] */
57 #define DEFAULT_MOBILE_KEY_RENEGOTIATE_GAP (12*3600*1000) /* [ms] */
58 #define DEFAULT_MOBILE_SETUP_RETRIES 30
59 #define DEFAULT_MOBILE_SETUP_RETRY_INTERVAL      (1*1000) /* [ms] */
60 #define DEFAULT_MOBILE_WAIT_TIME                (10*1000) /* [ms] */
61
62 #define DEFAULT_MOBILE_PEER_EXPIRY            (2*60)      /* [s] */
63
64 #define PEERKEYS_SUFFIX_MAXLEN (sizeof("~incoming")-1)
65
66 /* Each site can be in one of several possible states. */
67
68 /* States:
69    SITE_STOP         - nothing is allowed to happen; tunnel is down;
70                        all session keys have been erased
71      -> SITE_RUN upon external instruction
72    SITE_RUN          - site up, maybe with valid key
73      -> SITE_RESOLVE upon outgoing packet and no valid key
74          we start name resolution for the other end of the tunnel
75      -> SITE_SENTMSG2 upon valid incoming message 1 and suitable time
76          we send an appropriate message 2
77    SITE_RESOLVE      - waiting for name resolution
78      -> SITE_SENTMSG1 upon successful resolution
79          we send an appropriate message 1
80      -> SITE_SENTMSG2 upon valid incoming message 1 (then abort resolution)
81          we abort resolution and 
82      -> SITE_WAIT on timeout or resolution failure
83    SITE_SENTMSG1
84      -> SITE_SENTMSG2 upon valid incoming message 1 from higher priority end
85      -> SITE_SENTMSG3 upon valid incoming message 2
86      -> SITE_WAIT on timeout
87    SITE_SENTMSG2
88      -> SITE_SENTMSG4 upon valid incoming message 3
89      -> SITE_WAIT on timeout
90    SITE_SENTMSG3
91      -> SITE_SENTMSG5 upon valid incoming message 4
92      -> SITE_WAIT on timeout
93    SITE_SENTMSG4
94      -> SITE_RUN upon valid incoming message 5
95      -> SITE_WAIT on timeout
96    SITE_SENTMSG5
97      -> SITE_RUN upon valid incoming message 6
98      -> SITE_WAIT on timeout
99    SITE_WAIT         - failed to establish key; do nothing for a while
100      -> SITE_RUN on timeout
101    */
102
103 #define SITE_STOP     0
104 #define SITE_RUN      1
105 #define SITE_RESOLVE  2
106 #define SITE_SENTMSG1 3
107 #define SITE_SENTMSG2 4
108 #define SITE_SENTMSG3 5
109 #define SITE_SENTMSG4 6
110 #define SITE_SENTMSG5 7
111 #define SITE_WAIT     8
112
113 #define CASES_MSG3_KNOWN LABEL_MSG3: case LABEL_MSG3BIS
114
115 struct msg;
116
117 int32_t site_max_start_pad = 4*4;
118
119 static cstring_t state_name(uint32_t state)
120 {
121     switch (state) {
122     case 0: return "STOP";
123     case 1: return "RUN";
124     case 2: return "RESOLVE";
125     case 3: return "SENTMSG1";
126     case 4: return "SENTMSG2";
127     case 5: return "SENTMSG3";
128     case 6: return "SENTMSG4";
129     case 7: return "SENTMSG5";
130     case 8: return "WAIT";
131     default: return "*bad state*";
132     }
133 }
134
135 #define NONCELEN 8
136
137 #define LOG_UNEXPECTED    0x00000001
138 #define LOG_SETUP_INIT    0x00000002
139 #define LOG_SETUP_TIMEOUT 0x00000004
140 #define LOG_ACTIVATE_KEY  0x00000008
141 #define LOG_TIMEOUT_KEY   0x00000010
142 #define LOG_SEC           0x00000020
143 #define LOG_STATE         0x00000040
144 #define LOG_DROP          0x00000080
145 #define LOG_DUMP          0x00000100
146 #define LOG_ERROR         0x00000400
147 #define LOG_PEER_ADDRS    0x00000800
148 #define LOG_SIGKEYS       0x00001000
149
150 static struct flagstr log_event_table[]={
151     { "unexpected", LOG_UNEXPECTED },
152     { "setup-init", LOG_SETUP_INIT },
153     { "setup-timeout", LOG_SETUP_TIMEOUT },
154     { "activate-key", LOG_ACTIVATE_KEY },
155     { "timeout-key", LOG_TIMEOUT_KEY },
156     { "security", LOG_SEC },
157     { "state-change", LOG_STATE },
158     { "packet-drop", LOG_DROP },
159     { "dump-packets", LOG_DUMP },
160     { "errors", LOG_ERROR },
161     { "peer-addrs", LOG_PEER_ADDRS },
162     { "sigkeys", LOG_SIGKEYS },
163     { "default", LOG_SETUP_INIT|LOG_SETUP_TIMEOUT|
164       LOG_ACTIVATE_KEY|LOG_TIMEOUT_KEY|LOG_SEC|LOG_ERROR|LOG_SIGKEYS },
165     { "all", 0xffffffff },
166     { NULL, 0 }
167 };
168
169
170 /***** TRANSPORT PEERS declarations *****/
171
172 /* Details of "mobile peer" semantics:
173
174    - We use the same data structure for the different configurations,
175      but manage it with different algorithms.
176    
177    - We record up to mobile_peers_max peer address/port numbers
178      ("peers") for key setup, and separately up to mobile_peers_max
179      for data transfer.
180
181    - In general, we make a new set of addrs (see below) when we start
182      a new key exchange; the key setup addrs become the data transport
183      addrs when key setup complets.
184
185    If our peer is mobile:
186
187    - We send to all recent addresses of incoming packets, plus
188      initially all configured addresses (which we also expire).
189
190    - So, we record addrs of good incoming packets, as follows:
191       1. expire any peers last seen >120s ("mobile-peer-expiry") ago
192       2. add the peer of the just received packet to the applicable list
193          (possibly evicting the oldest entries to make room)
194      NB that we do not expire peers until an incoming packet arrives.
195
196    - If the peer has a configured address or name, we record them the
197      same way, but only as a result of our own initiation of key
198      setup.  (We might evict some incoming packet addrs to make room.)
199
200    - The default number of addrs to keep is 3, or 4 if we have a
201      configured name or address.  That's space for two configured
202      addresses (one IPv6 and one IPv4), plus two received addresses.
203
204    - Outgoing packets are sent to every recorded address in the
205      applicable list.  Any unsupported[1] addresses are deleted from
206      the list right away.  (This should only happen to configured
207      addresses, of course, but there is no need to check that.)
208
209    - When we successfully complete a key setup, we merge the key setup
210      peers into the data transfer peers.
211
212    [1] An unsupported address is one for whose AF we don't have a
213      socket (perhaps because we got EAFNOSUPPORT or some such) or for
214      which sendto gives ENETUNREACH.
215
216    If neither end is mobile:
217
218    - When peer initiated the key exchange, we use the incoming packet
219      address.
220
221    - When we initiate the key exchange, we try configured addresses
222      until we get one which isn't unsupported then fixate on that.
223
224    - When we complete a key setup, we replace the data transport peers
225      with those from the key setup.
226
227    If we are mobile:
228
229    - We can't tell when local network setup changes so we can't cache
230      the unsupported addrs and completely remove the spurious calls to
231      sendto, but we can optimise things a bit by deprioritising addrs
232      which seem to be unsupported.
233
234    - Use only configured addresses.  (Except, that if our peer
235      initiated a key exchange we use the incoming packet address until
236      our name resolution completes.)
237
238    - When we send a packet, try each address in turn; if addr
239      supported, put that address to the end of the list for future
240      packets, and go onto the next address.
241
242    - When we complete a key setup, we replace the data transport peers
243      with those from the key setup.
244
245    */
246
247 typedef struct {
248     struct timeval last;
249     struct comm_addr addr;
250 } transport_peer;
251
252 typedef struct {
253 /* configuration information */
254 /* runtime information */
255     int npeers;
256     transport_peer peers[MAX_PEER_ADDRS];
257 } transport_peers;
258
259 /* Basic operations on transport peer address sets */
260 static void transport_peers_clear(struct site *st, transport_peers *peers);
261 static int transport_peers_valid(transport_peers *peers);
262 static void transport_peers_copy(struct site *st, transport_peers *dst,
263                                  const transport_peers *src);
264
265 /* Record address of incoming setup packet; resp. data packet. */
266 static void transport_setup_msgok(struct site *st, const struct comm_addr *a);
267 static void transport_data_msgok(struct site *st, const struct comm_addr *a);
268
269 /* Initialise the setup addresses.  Called before we send the first
270  * packet in a key exchange.  If we are the initiator, as a result of
271  * resolve completing (or being determined not to be relevant) or an
272  * incoming PROD; if we are the responder, as a result of the MSG1. */
273 static bool_t transport_compute_setupinit_peers(struct site *st,
274         const struct comm_addr *configured_addrs /* 0 if none or not found */,
275         int n_configured_addrs /* 0 if none or not found */,
276         const struct comm_addr *incoming_packet_addr /* 0 if none */);
277
278 /* Called if we are the responder in a key setup, when the resolve
279  * completes.  transport_compute_setupinit_peers will hvae been called
280  * earlier.  If _complete is called, we are still doing the key setup
281  * (and we should use the new values for both the rest of the key
282  * setup and the ongoing data exchange); if _tardy is called, the key
283  * setup is done (either completed or not) and only the data peers are
284  * relevant */
285 static void transport_resolve_complete(struct site *st,
286         const struct comm_addr *addrs, int naddrs);
287 static void transport_resolve_complete_tardy(struct site *st,
288         const struct comm_addr *addrs, int naddrs);
289
290 static void transport_xmit(struct site *st, transport_peers *peers,
291                            struct buffer_if *buf, bool_t candebug);
292
293  /***** END of transport peers declarations *****/
294
295
296 struct data_key {
297     struct transform_inst_if *transform;
298     uint64_t key_timeout; /* End of life of current key */
299     uint32_t remote_session_id;
300 };
301
302 struct site {
303     closure_t cl;
304     struct site_if ops;
305 /* configuration information */
306     string_t localname;
307     string_t remotename;
308     bool_t keepalive;
309     bool_t local_mobile, peer_mobile; /* Mobile client support */
310     int32_t transport_peers_max;
311     string_t tunname; /* localname<->remotename by default, used in logs */
312     cstring_t *addresses; /* DNS name or address(es) for bootstrapping, optional */
313     int remoteport; /* Port for bootstrapping, optional */
314     uint32_t mtu_target;
315     struct netlink_if *netlink;
316     struct comm_if **comms;
317     struct comm_clientinfo **commclientinfos;
318     int ncomms;
319     struct resolver_if *resolver;
320     struct log_if *log;
321     struct hash_if *defhash;
322     struct random_if *random;
323     struct privcache_if *privkeys;
324     struct sigprivkey_if *privkey_fixed;
325     struct transform_if **transforms;
326     int ntransforms;
327     struct dh_if *dh;
328
329     uint32_t index; /* Index of this site */
330     uint32_t early_capabilities;
331     uint32_t local_capabilities;
332     int32_t setup_retries; /* How many times to send setup packets */
333     int32_t setup_retry_interval; /* Initial timeout for setup packets */
334     int32_t wait_timeout_mean; /* How long to wait if setup unsuccessful */
335     int32_t mobile_peer_expiry; /* How long to remember 2ary addresses */
336     int32_t key_lifetime; /* How long a key lasts once set up */
337     int32_t key_renegotiate_time; /* If we see traffic (or a keepalive)
338                                       after this time, initiate a new
339                                       key exchange */
340
341     bool_t our_name_later; /* our name > peer name */
342     uint32_t log_events;
343
344 /* runtime information */
345     uint32_t state;
346     uint64_t now; /* Most recently seen time */
347     bool_t allow_send_prod;
348     bool_t msg1_crossed_logged;
349     int resolving_count;
350     int resolving_n_results_all;
351     int resolving_n_results_stored;
352     struct comm_addr resolving_results[MAX_PEER_ADDRS];
353     const char *peerkeys_path;
354     struct pathprefix_template peerkeys_tmpl;
355     struct peer_keyset *peerkeys_current, *peerkeys_kex;
356
357     /* The currently established session */
358     struct data_key current;
359     struct data_key auxiliary_key;
360     bool_t auxiliary_is_new;
361     uint64_t renegotiate_key_time; /* When we can negotiate a new key */
362     uint64_t auxiliary_renegotiate_key_time;
363     transport_peers peers; /* Current address(es) of peer for data traffic */
364
365     /* The current key setup protocol exchange.  We can only be
366        involved in one of these at a time.  There's a potential for
367        denial of service here (the attacker keeps sending a setup
368        packet; we keep trying to continue the exchange, and have to
369        timeout before we can listen for another setup packet); perhaps
370        we should keep a list of 'bad' sources for setup packets. */
371     uint32_t remote_capabilities;
372     uint16_t remote_adv_mtu;
373     struct transform_if *chosen_transform;
374     uint32_t setup_session_id;
375     transport_peers setup_peers;
376     uint8_t localN[NONCELEN]; /* Nonces for key exchange */
377     uint8_t remoteN[NONCELEN];
378     struct buffer_if buffer; /* Current outgoing key exchange packet */
379     struct buffer_if scratch;
380     int32_t retries; /* Number of retries remaining */
381     uint64_t timeout; /* Timeout for current state */
382     uint8_t *dhsecret;
383     uint8_t *sharedsecret;
384     uint32_t sharedsecretlen, sharedsecretallocd;
385     struct transform_inst_if *new_transform; /* For key setup/verify */
386 };
387
388 static uint32_t event_log_priority(struct site *st, uint32_t event)
389 {
390     if (!(event&st->log_events))
391         return 0;
392     switch(event) {
393     case LOG_UNEXPECTED:    return M_INFO;
394     case LOG_SETUP_INIT:    return M_INFO;
395     case LOG_SETUP_TIMEOUT: return M_NOTICE;
396     case LOG_ACTIVATE_KEY:  return M_INFO;
397     case LOG_TIMEOUT_KEY:   return M_INFO;
398     case LOG_SEC:           return M_SECURITY;
399     case LOG_STATE:         return M_DEBUG;
400     case LOG_DROP:          return M_DEBUG;
401     case LOG_DUMP:          return M_DEBUG;
402     case LOG_ERROR:         return M_ERR;
403     case LOG_PEER_ADDRS:    return M_DEBUG;
404     case LOG_SIGKEYS:       return M_INFO;
405     default:                return M_ERR;
406     }
407 }
408
409 static uint32_t slog_start(struct site *st, uint32_t event)
410 {
411     uint32_t class=event_log_priority(st, event);
412     if (class) {
413         slilog_part(st->log,class,"%s: ",st->tunname);
414     }
415     return class;
416 }
417
418 static void vslog(struct site *st, uint32_t event, cstring_t msg, va_list ap)
419 FORMAT(printf,3,0);
420 static void vslog(struct site *st, uint32_t event, cstring_t msg, va_list ap)
421 {
422     uint32_t class;
423
424     class=slog_start(st,event);
425     if (class) {
426         vslilog_part(st->log,class,msg,ap);
427         slilog_part(st->log,class,"\n");
428     }
429 }
430
431 static void slog(struct site *st, uint32_t event, cstring_t msg, ...)
432 FORMAT(printf,3,4);
433 static void slog(struct site *st, uint32_t event, cstring_t msg, ...)
434 {
435     va_list ap;
436     va_start(ap,msg);
437     vslog(st,event,msg,ap);
438     va_end(ap);
439 }
440
441 static void logtimeout(struct site *st, const char *fmt, ...)
442 FORMAT(printf,2,3);
443 static void logtimeout(struct site *st, const char *fmt, ...)
444 {
445     uint32_t class=event_log_priority(st,LOG_SETUP_TIMEOUT);
446     if (!class)
447         return;
448
449     va_list ap;
450     va_start(ap,fmt);
451
452     slilog_part(st->log,class,"%s: ",st->tunname);
453     vslilog_part(st->log,class,fmt,ap);
454
455     const char *delim;
456     int i;
457     for (i=0, delim=" (tried ";
458          i<st->setup_peers.npeers;
459          i++, delim=", ") {
460         transport_peer *peer=&st->setup_peers.peers[i];
461         const char *s=comm_addr_to_string(&peer->addr);
462         slilog_part(st->log,class,"%s%s",delim,s);
463     }
464
465     slilog_part(st->log,class,")\n");
466     va_end(ap);
467 }
468
469 static void set_link_quality(struct site *st);
470 static void delete_keys(struct site *st, cstring_t reason, uint32_t loglevel);
471 static void delete_one_key(struct site *st, struct data_key *key,
472                            const char *reason /* may be 0 meaning don't log*/,
473                            const char *which /* ignored if !reasonn */,
474                            uint32_t loglevel /* ignored if !reasonn */);
475 static bool_t initiate_key_setup(struct site *st, cstring_t reason,
476                                  const struct comm_addr *prod_hint);
477 static void enter_state_run(struct site *st);
478 static bool_t enter_state_resolve(struct site *st);
479 static void decrement_resolving_count(struct site *st, int by);
480 static bool_t enter_new_state(struct site *st,uint32_t next,
481                               const struct msg *prompt
482                               /* may be 0 for SENTMSG1 */);
483 static void enter_state_wait(struct site *st);
484 static void activate_new_key(struct site *st);
485
486 static bool_t is_transform_valid(struct transform_inst_if *transform)
487 {
488     return transform && transform->valid(transform->st);
489 }
490
491 static bool_t current_valid(struct site *st)
492 {
493     return is_transform_valid(st->current.transform);
494 }
495
496 #define DEFINE_CALL_TRANSFORM(fwdrev)                                   \
497 static transform_apply_return                                           \
498 call_transform_##fwdrev(struct site *st,                                \
499                                    struct transform_inst_if *transform, \
500                                    struct buffer_if *buf,               \
501                                    const char **errmsg)                 \
502 {                                                                       \
503     if (!is_transform_valid(transform)) {                               \
504         *errmsg="transform not set up";                                 \
505         return transform_apply_err;                                     \
506     }                                                                   \
507     return transform->fwdrev(transform->st,buf,errmsg);                 \
508 }
509
510 DEFINE_CALL_TRANSFORM(forwards)
511 DEFINE_CALL_TRANSFORM(reverse)
512
513 static void dispose_transform(struct transform_inst_if **transform_var)
514 {
515     struct transform_inst_if *transform=*transform_var;
516     if (transform) {
517         transform->delkey(transform->st);
518         transform->destroy(transform->st);
519     }
520     *transform_var = 0;
521 }    
522
523 #define CHECK_AVAIL(b,l) do { if ((b)->size<(l)) return False; } while(0)
524 #define CHECK_EMPTY(b) do { if ((b)->size!=0) return False; } while(0)
525 #define CHECK_TYPE(b,t) do { uint32_t type; \
526     CHECK_AVAIL((b),4); \
527     type=buf_unprepend_uint32((b)); \
528     if (type!=(t)) return False; } while(0)
529
530 static _Bool type_is_msg23(uint32_t type)
531 {
532     switch (type) {
533         case LABEL_MSG2: case CASES_MSG3_KNOWN: return True;
534         default: return False;
535     }
536 }
537 static _Bool type_is_msg34(uint32_t type)
538 {
539     switch (type) {
540         case CASES_MSG3_KNOWN: case LABEL_MSG4: return True;
541         default: return False;
542     }
543 }
544
545 struct parsedname {
546     int32_t len;
547     uint8_t *name;
548     struct buffer_if extrainfo;
549 };
550
551 struct msg {
552     uint8_t *hashstart;
553     uint32_t dest;
554     uint32_t source;
555     struct parsedname remote;
556     struct parsedname local;
557     uint32_t remote_capabilities;
558     uint16_t remote_mtu;
559     int capab_transformnum;
560     uint8_t *nR;
561     uint8_t *nL;
562     int32_t pklen;
563     char *pk;
564     int32_t hashlen;
565     struct alg_msg_data sig;
566     int n_pubkeys_accepted_nom; /* may be > MAX_SIG_KEYS ! */
567     const struct sigkeyid *pubkeys_accepted[MAX_SIG_KEYS];
568     int signing_key_index;
569 };
570
571 static const struct sigkeyid keyid_zero;
572
573 static int32_t wait_timeout(struct site *st) {
574     int32_t t = st->wait_timeout_mean;
575     int8_t factor;
576     if (t < INT_MAX/2) {
577         st->random->generate(st->random->st,sizeof(factor),&factor);
578         t += (t / 256) * factor;
579     }
580     return t;
581 }
582
583 static _Bool set_new_transform(struct site *st, char *pk)
584 {
585     _Bool ok;
586
587     /* Make room for the shared key */
588     st->sharedsecretlen=st->chosen_transform->keylen?:st->dh->ceil_len;
589     assert(st->sharedsecretlen);
590     if (st->sharedsecretlen > st->sharedsecretallocd) {
591         st->sharedsecretallocd=st->sharedsecretlen;
592         st->sharedsecret=safe_realloc_ary(st->sharedsecret,1,
593                                           st->sharedsecretallocd,
594                                           "site:sharedsecret");
595     }
596
597     /* Generate the shared key */
598     st->dh->makeshared(st->dh->st,st->dhsecret,st->dh->len,pk,
599                        st->sharedsecret,st->sharedsecretlen);
600
601     /* Set up the transform */
602     struct transform_if *generator=st->chosen_transform;
603     struct transform_inst_if *generated=generator->create(generator->st);
604     ok = generated->setkey(generated->st,st->sharedsecret,
605                            st->sharedsecretlen,st->our_name_later);
606
607     dispose_transform(&st->new_transform);
608     if (!ok) return False;
609     st->new_transform=generated;
610
611     slog(st,LOG_SETUP_INIT,"key exchange negotiated transform"
612          " %d (capabilities ours=%#"PRIx32" theirs=%#"PRIx32")",
613          st->chosen_transform->capab_bit,
614          st->local_capabilities, st->remote_capabilities);
615     return True;
616 }
617
618 struct xinfoadd {
619     int32_t lenpos, afternul;
620 };
621 static void append_string_xinfo_start(struct buffer_if *buf,
622                                       struct xinfoadd *xia,
623                                       const char *str)
624     /* Helps construct one of the names with additional info as found
625      * in MSG1..4.  Call this function first, then append all the
626      * desired extra info (not including the nul byte) to the buffer,
627      * then call append_string_xinfo_done. */
628 {
629     xia->lenpos = buf->size;
630     buf_append_string(buf,str);
631     buf_append_uint8(buf,0);
632     xia->afternul = buf->size;
633 }
634 static void append_string_xinfo_done(struct buffer_if *buf,
635                                      struct xinfoadd *xia)
636 {
637     /* we just need to adjust the string length */
638     if (buf->size == xia->afternul) {
639         /* no extra info, strip the nul too */
640         buf_unappend_uint8(buf);
641     } else {
642         put_uint16(buf->start+xia->lenpos, buf->size-(xia->lenpos+2));
643     }
644 }
645
646 /* Build any of msg1 to msg4. msg5 and msg6 are built from the inside
647    out using a transform of config data supplied by netlink */
648 static bool_t generate_msg(struct site *st, uint32_t type, cstring_t what,
649                            const struct msg *prompt
650                            /* may be 0 for MSG1 */)
651 {
652     string_t dhpub;
653     unsigned minor;
654     int ki;
655
656     st->retries=st->setup_retries;
657     BUF_ALLOC(&st->buffer,what);
658     buffer_init(&st->buffer,0);
659     buf_append_uint32(&st->buffer,
660         (type==LABEL_MSG1?0:st->setup_session_id));
661     buf_append_uint32(&st->buffer,st->index);
662     buf_append_uint32(&st->buffer,type);
663
664     struct xinfoadd xia;
665     append_string_xinfo_start(&st->buffer,&xia,st->localname);
666     if ((st->local_capabilities & st->early_capabilities) ||
667         (type != LABEL_MSG1)) {
668         buf_append_uint32(&st->buffer,st->local_capabilities);
669     }
670     if (type_is_msg34(type)) {
671         buf_append_uint16(&st->buffer,st->mtu_target);
672     }
673     if (type_is_msg23(type)) {
674         buf_append_uint8(&st->buffer,st->peerkeys_kex->nkeys);
675         for (ki=0; ki<st->peerkeys_kex->nkeys; ki++) {
676             struct peer_pubkey *pk = &st->peerkeys_kex->keys[ki];
677             BUF_ADD_OBJ(append,&st->buffer,pk->id);
678         }
679     }
680     struct sigprivkey_if *privkey=0;
681     if (type_is_msg34(type)) {
682         assert(prompt->n_pubkeys_accepted_nom>0);
683         for (ki=0;
684              ki<prompt->n_pubkeys_accepted_nom && ki<MAX_SIG_KEYS;
685              ki++) {
686             const struct sigkeyid *kid=prompt->pubkeys_accepted[ki];
687             if (st->privkeys) {
688                 privkey=st->privkeys->lookup(st->privkeys->st,kid,st->log);
689                 if (privkey) goto privkey_found;
690             } else {
691                 if (sigkeyid_equal(&keyid_zero,kid)) {
692                     privkey=st->privkey_fixed;
693                     goto privkey_found;
694                 }
695             }
696         }
697         uint32_t class = slog_start(st,LOG_ERROR);
698         if (class) {
699             slilog_part(st->log,class,"no suitable private key, peer wanted");
700             for (ki=0;
701                  ki<prompt->n_pubkeys_accepted_nom && ki<MAX_SIG_KEYS;
702                  ki++) {
703                 slilog_part(st->log,class, " " SIGKEYID_PR_FMT,
704                             SIGKEYID_PR_VAL(prompt->pubkeys_accepted[ki]));
705             }
706             if (prompt->n_pubkeys_accepted_nom > MAX_SIG_KEYS)
707                 slilog_part(st->log,class," +%d",
708                             prompt->n_pubkeys_accepted_nom - MAX_SIG_KEYS);
709             slilog_part(st->log,class,"\n");
710         }
711         return False;
712
713     privkey_found:
714         buf_append_uint8(&st->buffer,ki);
715     }
716
717     append_string_xinfo_done(&st->buffer,&xia);
718
719     buf_append_string(&st->buffer,st->remotename);
720     BUF_ADD_OBJ(append,&st->buffer,st->localN);
721     if (type==LABEL_MSG1) return True;
722     BUF_ADD_OBJ(append,&st->buffer,st->remoteN);
723     if (type==LABEL_MSG2) return True;
724
725     if (hacky_par_mid_failnow()) return False;
726
727     if (MSGMAJOR(type) == 3) do {
728         minor = MSGMINOR(type);
729         if (minor < 1) break;
730         buf_append_uint8(&st->buffer,st->chosen_transform->capab_bit);
731     } while (0);
732
733     dhpub=st->dh->makepublic(st->dh->st,st->dhsecret,st->dh->len);
734     buf_append_string(&st->buffer,dhpub);
735     free(dhpub);
736
737     bool_t ok=privkey->sign(privkey->st,
738                             st->buffer.start,
739                             st->buffer.size,
740                             &st->buffer);
741     if (!ok) goto fail;
742     return True;
743
744  fail:
745     return False;
746 }
747
748 static bool_t unpick_name(struct buffer_if *msg, struct parsedname *nm)
749 {
750     CHECK_AVAIL(msg,2);
751     nm->len=buf_unprepend_uint16(msg);
752     CHECK_AVAIL(msg,nm->len);
753     nm->name=buf_unprepend(msg,nm->len);
754     uint8_t *nul=memchr(nm->name,0,nm->len);
755     if (!nul) {
756         buffer_readonly_view(&nm->extrainfo,0,0);
757     } else {
758         buffer_readonly_view(&nm->extrainfo, nul+1, msg->start-(nul+1));
759         nm->len=nul-nm->name;
760     }
761     return True;
762 }
763
764 static bool_t unpick_msg(struct site *st, uint32_t type,
765                          struct buffer_if *msg, struct msg *m)
766 {
767     unsigned minor;
768
769     m->n_pubkeys_accepted_nom=-1;
770     m->capab_transformnum=-1;
771     m->signing_key_index=-1;
772     m->hashstart=msg->start;
773     CHECK_AVAIL(msg,4);
774     m->dest=buf_unprepend_uint32(msg);
775     CHECK_AVAIL(msg,4);
776     m->source=buf_unprepend_uint32(msg);
777     CHECK_TYPE(msg,type);
778     if (!unpick_name(msg,&m->remote)) return False;
779     m->remote_capabilities=0;
780     m->remote_mtu=0;
781     if (m->remote.extrainfo.size) {
782         CHECK_AVAIL(&m->remote.extrainfo,4);
783         m->remote_capabilities=buf_unprepend_uint32(&m->remote.extrainfo);
784     }
785     if (type_is_msg34(type) && m->remote.extrainfo.size) {
786         CHECK_AVAIL(&m->remote.extrainfo,2);
787         m->remote_mtu=buf_unprepend_uint16(&m->remote.extrainfo);
788     }
789     if (type_is_msg23(type) && m->remote.extrainfo.size) {
790         m->n_pubkeys_accepted_nom = buf_unprepend_uint8(&m->remote.extrainfo);
791         if (!m->n_pubkeys_accepted_nom) return False;
792         for (int ki_nom=0; ki_nom<m->n_pubkeys_accepted_nom; ki_nom++) {
793             CHECK_AVAIL(&m->remote.extrainfo,KEYIDSZ);
794             struct sigkeyid *kid = buf_unprepend(&m->remote.extrainfo,KEYIDSZ);
795             if (ki_nom<MAX_SIG_KEYS) m->pubkeys_accepted[ki_nom] = kid;
796         }
797     } else {
798         m->n_pubkeys_accepted_nom = 1;
799         m->pubkeys_accepted[0] = &keyid_zero;
800     }
801     if (type_is_msg34(type) && m->remote.extrainfo.size) {
802         m->signing_key_index=buf_unprepend_uint8(&m->remote.extrainfo);
803     } else {
804         m->signing_key_index=0;
805     }
806     if (!unpick_name(msg,&m->local)) return False;
807     if (type==LABEL_PROD) {
808         CHECK_EMPTY(msg);
809         return True;
810     }
811     CHECK_AVAIL(msg,NONCELEN);
812     m->nR=buf_unprepend(msg,NONCELEN);
813     if (type==LABEL_MSG1) {
814         CHECK_EMPTY(msg);
815         return True;
816     }
817     CHECK_AVAIL(msg,NONCELEN);
818     m->nL=buf_unprepend(msg,NONCELEN);
819     if (type==LABEL_MSG2) {
820         CHECK_EMPTY(msg);
821         return True;
822     }
823     if (MSGMAJOR(type) == 3) do {
824         minor = MSGMINOR(type);
825 #define MAYBE_READ_CAP(minminor, kind, dflt) do {                       \
826     if (minor < (minminor))                                             \
827         m->capab_##kind##num = (dflt);                                  \
828     else {                                                              \
829         CHECK_AVAIL(msg, 1);                                            \
830         m->capab_##kind##num = buf_unprepend_uint8(msg);                \
831     }                                                                   \
832 } while (0)
833         MAYBE_READ_CAP(1, transform, CAPAB_BIT_ANCIENTTRANSFORM);
834 #undef MAYBE_READ_CAP
835     } while (0);
836     CHECK_AVAIL(msg,2);
837     m->pklen=buf_unprepend_uint16(msg);
838     CHECK_AVAIL(msg,m->pklen);
839     m->pk=buf_unprepend(msg,m->pklen);
840     m->hashlen=msg->start-m->hashstart;
841
842     if (m->signing_key_index < 0 ||
843         m->signing_key_index >= st->peerkeys_kex->nkeys) {
844         return False;
845     }
846     struct sigpubkey_if *pubkey=
847         st->peerkeys_kex->keys[m->signing_key_index].pubkey;
848     if (!pubkey->unpick(pubkey->st,msg,&m->sig)) {
849         return False;
850     }
851
852     CHECK_EMPTY(msg);
853
854     return True;
855 }
856
857 static bool_t name_matches(const struct parsedname *nm, const char *expected)
858 {
859     int expected_len=strlen(expected);
860     return
861         nm->len == expected_len &&
862         !memcmp(nm->name, expected, expected_len);
863 }    
864
865 static bool_t check_msg(struct site *st, uint32_t type, struct msg *m,
866                         cstring_t *error)
867 {
868     if (type==LABEL_MSG1) return True;
869
870     /* Check that the site names and our nonce have been sent
871        back correctly, and then store our peer's nonce. */ 
872     if (!name_matches(&m->remote,st->remotename)) {
873         *error="wrong remote site name";
874         return False;
875     }
876     if (!name_matches(&m->local,st->localname)) {
877         *error="wrong local site name";
878         return False;
879     }
880     if (memcmp(m->nL,st->localN,NONCELEN)!=0) {
881         *error="wrong locally-generated nonce";
882         return False;
883     }
884     if (type==LABEL_MSG2) return True;
885     if (!consttime_memeq(m->nR,st->remoteN,NONCELEN)) {
886         *error="wrong remotely-generated nonce";
887         return False;
888     }
889     /* MSG3 has complicated rules about capabilities, which are
890      * handled in process_msg3. */
891     if (MSGMAJOR(type) == 3) return True;
892     if (m->remote_capabilities!=st->remote_capabilities) {
893         *error="remote capabilities changed";
894         return False;
895     }
896     if (type==LABEL_MSG4) return True;
897     *error="unknown message type";
898     return False;
899 }
900
901 static void peerkeys_maybe_incorporate(struct site *st, const char *file,
902                                        const char *whatmore,
903                                        int logcl_enoent)
904 {
905     struct peer_keyset *atsuffix=
906         keyset_load(file,&st->scratch,st->log,logcl_enoent,st->defhash);
907     if (!atsuffix) return;
908
909     if (st->peerkeys_current &&
910         serial_cmp(atsuffix->serial,st->peerkeys_current->serial) <= 0) {
911         slog(st,LOG_SIGKEYS,"keys from %s%s are older, discarding",
912              file,whatmore);
913         keyset_dispose(&atsuffix);
914         int r=unlink(file);
915         if (r) slog(st,LOG_ERROR,"failed to remove old key update %s: %s\n",
916                     st->peerkeys_tmpl.buffer,strerror(errno));
917         return;
918     } else {
919         slog(st,LOG_SIGKEYS,"keys from %s%s are newer, installing",
920              file,whatmore);
921         keyset_dispose(&st->peerkeys_current);
922         st->peerkeys_current=atsuffix;
923         int r=rename(file,st->peerkeys_path);
924         if (r) slog(st,LOG_ERROR,"failed to install key update %s as %s: %s\n",
925                     st->peerkeys_tmpl.buffer,st->peerkeys_path,
926                     strerror(errno));
927     }
928 }
929
930 static void peerkeys_check_for_update(struct site *st)
931 {
932     /* peerkeys files
933      *
934      *  <F>            live file, loaded on startup, updated by secnet
935      *                  (only).  * in-memory peerkeys_current is kept
936      *                  synced with this file
937      *
938      *  <F>~update     update file from config manager, checked before
939      *                  every key exchange.  config manager must rename
940      *                  this file into place; it will be renamed and
941      *                  then removed by secnet.
942      *
943      *  <F>~proc       update file being processed by secnet.
944      *                  only secnet may write or remove.
945      *
946      *  <F>~incoming   update file from peer, being received by secnet
947      *                  may be incomplete, unverified, or even malicious
948      *                  only secnet may write or remove.
949      *
950      *  <F>~tmp        update file from config manager, only mss may
951      *                  write or rename
952      *
953      * secnet discards updates that are not more recent than (by
954      * serial) the live file.  But it may not process updates
955      * immediately.
956      *
957      * The implied keyset to be used is MAX(live, proc, update).
958      * 
959      * secnet does:
960      *  check live vs proc, either mv proc live or rm proc
961      *  if proc doesn't exist, mv update proc
962      *
963      * make-secnet-sites does:
964      *  write: rename something onto update
965      *  read: read update,proc,live in that order and take max
966      *
967      * We support only one concurrent secnet, one concurrent
968      * writing make-secnet-sites, and any number of readers.
969      * We want to maintain a live file at all times as that
970      * is what secnet actually reads at startup and uses.
971      *
972      * Proof that this is sound:
973      *   Let us regard update,proc,live as i=0,1,2
974      *   Files contain public key sets and are manipulated as
975      *    a whole, and we may regard key sets with the same
976      *    serial as equivalent.
977      *   We talk below about reading as if it were atomic.
978      *    Actually the atomic operation is open(2); the
979      *    reading gets whatever that name refers to.  So
980      *    we can model this as an atomic read.
981      *   secnet eventually moves all data into the live file
982      *    or deletes it, so there should be no indefinitely
983      *    stale data; informally this means we can disregard
984      *    the possibility of very old serials and regard
985      *    serials as fully ordered.  (We don't bother with
986      *    a formal proof of this property.)
987      *   Consequently we will only think about the serial
988      *    and not the contents.  We treat absent files as
989      *    minimal (we will write -1 for convenience although
990      *    we don't mean a numerical value).  We write S(i).
991      *
992      * Invariant 1 for secnet's transformations is as follows:
993      *   Each file S(i) is only reduced (to S'(i)) if for some j S'(j)
994      *   >= S(i), with S'(j) either being >= S(i) beforehand, or
995      *   updated atomically together with S(i).
996      *
997      * Proof of invariant 1 for the secnet operations:
998      *   (a) check live vs proc, proc>live, mv:
999      *      j=2, i=1; S'(i)=-1, so S(i) is being reduced.  S'(j) is
1000      *      equal to S(i), and the rename is atomic [1], so S'(j) and
1001      *      S'(i) are updated simultaneously.  S(j) is being
1002      *      increased.  (There are no hazards from concurrent writers;
1003      *      only we ourselves (secnet) write to live or proc.)
1004      *   (b) check live vs proc, proc<=live, rm:
1005      *      j=2, i=1; S'(i)=-1, so S(i) is being reduced.  But
1006      *      S(j) is >= $(i) throughout.  (Again, no concurrent
1007      *      writer hazards.)
1008      *   (c) mv update proc (when proc does not exist):
1009      *      j=1, i=0; S(i) is being reduced to -1.  But simultaneously
1010      *      S(j) is being increased to the old S(i).  Our precondition
1011      *      (proc not existing) is not subject to a concurrent writer
1012      *      hazards because only we write to proc; our action is
1013      *      atomic and takes whatever update is available (if any).
1014      *
1015      * Proof of soundness for the mss reading operation:
1016      *   Let M be MAX(\forall S) at the point where mss reads update.
1017      *   Invariant 2: when mss reads S(k), MAX(K, S(k)..S(2)) >= M,
1018      *   where K is the max S it has seen so far.  Clearly this is
1019      *   true for k=0 (with K==-1).  secnet's operations never break
1020      *   this invariant because if any S() is reduced, another one
1021      *   counted must be increased.  mss's step operation
1022      *   updates K with S(k), so MAX(K', S(k+1)..)=MAX(K, S(k)..),
1023      *   and updates k to k+1, preserving the invariant.
1024      *   At the end we have k=3 and K=>M.  Since secnet never
1025      *   invents serials, K=M in the absence of an mss update
1026      *   with a bigger S.
1027      *
1028      * Consideration of the mss update operation:
1029      *   Successive serials from sites file updates etc. are supposed
1030      *   to be increasing.  When this is true, M is increased.  A
1031      *   concurrent reading mss which makes its first read after the
1032      *   update will get the new data (by the proofs above).  This
1033      *   seems to be the required property.
1034      *
1035      * QED.
1036      *
1037      * [1] From "Base Specifications issue 7",
1038      *  2.9.7 Thread Interactions with Regular File Operations
1039      *  All of the following functions shall be atomic with respect to
1040      *  each other in the effects specified in POSIX.1-2017 when they
1041      *  operate on regular files or symbolic links:
1042      *   ... rename ... open ...
1043      */
1044     if (!st->peerkeys_path) return;
1045
1046     pathprefix_template_setsuffix(&st->peerkeys_tmpl,"~proc");
1047     peerkeys_maybe_incorporate(st,st->peerkeys_tmpl.buffer,
1048                                " (found old update)",
1049                                M_DEBUG);
1050
1051     pathprefix_template_setsuffix(&st->peerkeys_tmpl,"~update");
1052     const char *inputp=st->peerkeys_tmpl.buffer;
1053     if (access(inputp,R_OK)) {
1054         if (errno!=ENOENT)
1055             slog(st,LOG_ERROR,"cannot access peer key update file %s\n",
1056                  inputp);
1057         return;
1058     }
1059
1060     buffer_init(&st->scratch,0);
1061     BUF_ADD_BYTES(append,&st->scratch,
1062                   st->peerkeys_tmpl.buffer,
1063                   strlen(st->peerkeys_tmpl.buffer)+1);
1064     inputp=st->scratch.start;
1065
1066     pathprefix_template_setsuffix(&st->peerkeys_tmpl,"~proc");
1067     const char *oursp=st->peerkeys_tmpl.buffer;
1068
1069     int r=rename(inputp,oursp);
1070     if (r) {
1071         slog(st,LOG_ERROR,"failed to claim key update file %s as %s: %s",
1072              inputp,oursp,strerror(errno));
1073         return;
1074     }
1075
1076     peerkeys_maybe_incorporate(st,oursp," (update)",M_ERR);
1077 }
1078
1079
1080 static bool_t kex_init(struct site *st)
1081 {
1082     keyset_dispose(&st->peerkeys_kex);
1083     peerkeys_check_for_update(st);
1084     if (!st->peerkeys_current) {
1085         slog(st,LOG_SETUP_INIT,"no peer public keys, abandoning key setup");
1086         return False;
1087     }
1088     st->peerkeys_kex = keyset_dup(st->peerkeys_current);
1089     st->random->generate(st->random->st,NONCELEN,st->localN);
1090     return True;
1091 }
1092
1093 static bool_t generate_msg1(struct site *st, const struct msg *prompt_maybe_0)
1094 {
1095     return
1096         generate_msg(st,LABEL_MSG1,"site:MSG1",prompt_maybe_0);
1097 }
1098
1099 static bool_t process_msg1(struct site *st, struct buffer_if *msg1,
1100                            const struct comm_addr *src,
1101                            const struct msg *m)
1102 {
1103     /* We've already determined we're in an appropriate state to
1104        process an incoming MSG1, and that the MSG1 has correct values
1105        of A and B. */
1106
1107     st->setup_session_id=m->source;
1108     st->remote_capabilities=m->remote_capabilities;
1109     memcpy(st->remoteN,m->nR,NONCELEN);
1110     return True;
1111 }
1112
1113 static bool_t generate_msg2(struct site *st,
1114                             const struct msg *prompt_may_be_null)
1115 {
1116     return
1117         generate_msg(st,LABEL_MSG2,"site:MSG2",prompt_may_be_null);
1118 }
1119
1120 static bool_t process_msg2(struct site *st, struct buffer_if *msg2,
1121                            const struct comm_addr *src,
1122                            struct msg *m /* returned */)
1123 {
1124     cstring_t err;
1125
1126     if (!unpick_msg(st,LABEL_MSG2,msg2,m)) return False;
1127     if (!check_msg(st,LABEL_MSG2,m,&err)) {
1128         slog(st,LOG_SEC,"msg2: %s",err);
1129         return False;
1130     }
1131     st->setup_session_id=m->source;
1132     st->remote_capabilities=m->remote_capabilities;
1133
1134     /* Select the transform to use */
1135
1136     uint32_t remote_crypto_caps = st->remote_capabilities & CAPAB_TRANSFORM_MASK;
1137     if (!remote_crypto_caps)
1138         /* old secnets only had this one transform */
1139         remote_crypto_caps = 1UL << CAPAB_BIT_ANCIENTTRANSFORM;
1140
1141 #define CHOOSE_CRYPTO(kind, whats) do {                                 \
1142     struct kind##_if *iface;                                            \
1143     uint32_t bit, ours = 0;                                             \
1144     int i;                                                              \
1145     for (i= 0; i < st->n##kind##s; i++) {                               \
1146         iface=st->kind##s[i];                                           \
1147         bit = 1UL << iface->capab_bit;                                  \
1148         if (bit & remote_crypto_caps) goto kind##_found;                \
1149         ours |= bit;                                                    \
1150     }                                                                   \
1151     slog(st,LOG_ERROR,"no " whats " in common"                          \
1152          " (us %#"PRIx32"; them: %#"PRIx32")",                          \
1153          st->local_capabilities & ours, remote_crypto_caps);            \
1154     return False;                                                       \
1155 kind##_found:                                                           \
1156     st->chosen_##kind = iface;                                          \
1157 } while (0)
1158
1159     CHOOSE_CRYPTO(transform, "transforms");
1160
1161 #undef CHOOSE_CRYPTO
1162
1163     memcpy(st->remoteN,m->nR,NONCELEN);
1164     return True;
1165 }
1166
1167 static bool_t generate_msg3(struct site *st, const struct msg *prompt)
1168 {
1169     /* Now we have our nonce and their nonce. Think of a secret key,
1170        and create message number 3. */
1171     st->random->generate(st->random->st,st->dh->len,st->dhsecret);
1172     return generate_msg(st,
1173                         (st->remote_capabilities & CAPAB_TRANSFORM_MASK)
1174                         ? LABEL_MSG3BIS
1175                         : LABEL_MSG3,
1176                         "site:MSG3",prompt);
1177 }
1178
1179 static bool_t process_msg3_msg4(struct site *st, struct msg *m)
1180 {
1181     /* Check signature and store g^x mod m */
1182     int ki;
1183
1184     if (m->signing_key_index >= 0) {
1185         if (m->signing_key_index >= st->peerkeys_kex->nkeys)
1186             return False;
1187         ki=m->signing_key_index;
1188     } else {
1189         for (ki=0; ki<st->peerkeys_kex->nkeys; ki++)
1190             if (sigkeyid_equal(&keyid_zero,&st->peerkeys_kex->keys[ki].id))
1191                 goto found;
1192         /* not found */
1193         slog(st,LOG_ERROR,
1194              "peer signed with keyid zero, which we do not accept");
1195         return False;
1196     found:;
1197     }
1198     struct sigpubkey_if *pubkey=st->peerkeys_kex->keys[ki].pubkey;
1199
1200     if (!pubkey->check(pubkey->st,
1201                        m->hashstart,m->hashlen,
1202                        &m->sig)) {
1203         slog(st,LOG_SEC,"msg3/msg4 signature failed check!");
1204         return False;
1205     }
1206
1207     st->remote_adv_mtu=m->remote_mtu;
1208
1209     return True;
1210 }
1211
1212 static bool_t process_msg3(struct site *st, struct buffer_if *msg3,
1213                            const struct comm_addr *src, uint32_t msgtype,
1214                            struct msg *m /* returned */)
1215 {
1216     cstring_t err;
1217
1218     switch (msgtype) {
1219         case CASES_MSG3_KNOWN: break;
1220         default: assert(0);
1221     }
1222
1223     if (!unpick_msg(st,msgtype,msg3,m)) return False;
1224     if (!check_msg(st,msgtype,m,&err)) {
1225         slog(st,LOG_SEC,"msg3: %s",err);
1226         return False;
1227     }
1228     uint32_t capab_adv_late = m->remote_capabilities
1229         & ~st->remote_capabilities & st->early_capabilities;
1230     if (capab_adv_late) {
1231         slog(st,LOG_SEC,"msg3 impermissibly adds early capability flag(s)"
1232              " %#"PRIx32" (was %#"PRIx32", now %#"PRIx32")",
1233              capab_adv_late, st->remote_capabilities, m->remote_capabilities);
1234         return False;
1235     }
1236
1237 #define CHOSE_CRYPTO(kind, what) do {                                   \
1238     struct kind##_if *iface;                                            \
1239     int i;                                                              \
1240     for (i=0; i<st->n##kind##s; i++) {                                  \
1241         iface=st->kind##s[i];                                           \
1242         if (iface->capab_bit == m->capab_##kind##num)                   \
1243             goto kind##_found;                                          \
1244     }                                                                   \
1245     slog(st,LOG_SEC,"peer chose unknown-to-us " what " %d!",            \
1246          m->capab_##kind##num);                                                 \
1247     return False;                                                       \
1248 kind##_found:                                                           \
1249     st->chosen_##kind=iface;                                            \
1250 } while (0)
1251
1252     CHOSE_CRYPTO(transform, "transform");
1253
1254 #undef CHOSE_CRYPTO
1255
1256     if (!process_msg3_msg4(st,m))
1257         return False;
1258
1259     /* Update our idea of the remote site's capabilities, now that we've
1260      * verified that its message was authentic.
1261      *
1262      * Our previous idea of the remote site's capabilities came from the
1263      * unauthenticated MSG1.  We've already checked that this new message
1264      * doesn't change any of the bits we relied upon in the past, but it may
1265      * also have set additional capability bits.  We simply throw those away
1266      * now, and use the authentic capabilities from this MSG3. */
1267     st->remote_capabilities=m->remote_capabilities;
1268
1269     /* Terminate their DH public key with a '0' */
1270     m->pk[m->pklen]=0;
1271     /* Invent our DH secret key */
1272     st->random->generate(st->random->st,st->dh->len,st->dhsecret);
1273
1274     /* Generate the shared key and set up the transform */
1275     if (!set_new_transform(st,m->pk)) return False;
1276
1277     return True;
1278 }
1279
1280 static bool_t generate_msg4(struct site *st, const struct msg *prompt)
1281 {
1282     /* We have both nonces, their public key and our private key. Generate
1283        our public key, sign it and send it to them. */
1284     return generate_msg(st,LABEL_MSG4,"site:MSG4",prompt);
1285 }
1286
1287 static bool_t process_msg4(struct site *st, struct buffer_if *msg4,
1288                            const struct comm_addr *src,
1289                            struct msg *m /* returned */)
1290 {
1291     cstring_t err;
1292
1293     if (!unpick_msg(st,LABEL_MSG4,msg4,m)) return False;
1294     if (!check_msg(st,LABEL_MSG4,m,&err)) {
1295         slog(st,LOG_SEC,"msg4: %s",err);
1296         return False;
1297     }
1298     
1299     if (!process_msg3_msg4(st,m))
1300         return False;
1301
1302     /* Terminate their DH public key with a '0' */
1303     m->pk[m->pklen]=0;
1304
1305     /* Generate the shared key and set up the transform */
1306     if (!set_new_transform(st,m->pk)) return False;
1307
1308     return True;
1309 }
1310
1311 struct msg0 {
1312     uint32_t dest;
1313     uint32_t source;
1314     uint32_t type;
1315 };
1316
1317 static bool_t unpick_msg0(struct site *st, struct buffer_if *msg0,
1318                           struct msg0 *m)
1319 {
1320     CHECK_AVAIL(msg0,4);
1321     m->dest=buf_unprepend_uint32(msg0);
1322     CHECK_AVAIL(msg0,4);
1323     m->source=buf_unprepend_uint32(msg0);
1324     CHECK_AVAIL(msg0,4);
1325     m->type=buf_unprepend_uint32(msg0);
1326     return True;
1327     /* Leaves transformed part of buffer untouched */
1328 }
1329
1330 static bool_t generate_msg5(struct site *st, const struct msg *prompt)
1331 {
1332     cstring_t transform_err;
1333
1334     BUF_ALLOC(&st->buffer,"site:MSG5");
1335     /* We are going to add four words to the message */
1336     buffer_init(&st->buffer,calculate_max_start_pad());
1337     /* Give the netlink code an opportunity to put its own stuff in the
1338        message (configuration information, etc.) */
1339     buf_prepend_uint32(&st->buffer,LABEL_MSG5);
1340     if (call_transform_forwards(st,st->new_transform,
1341                                 &st->buffer,&transform_err))
1342         return False;
1343     buf_prepend_uint32(&st->buffer,LABEL_MSG5);
1344     buf_prepend_uint32(&st->buffer,st->index);
1345     buf_prepend_uint32(&st->buffer,st->setup_session_id);
1346
1347     st->retries=st->setup_retries;
1348     return True;
1349 }
1350
1351 static bool_t process_msg5(struct site *st, struct buffer_if *msg5,
1352                            const struct comm_addr *src,
1353                            struct transform_inst_if *transform)
1354 {
1355     struct msg0 m;
1356     cstring_t transform_err;
1357
1358     if (!unpick_msg0(st,msg5,&m)) return False;
1359
1360     if (call_transform_reverse(st,transform,msg5,&transform_err)) {
1361         /* There's a problem */
1362         slog(st,LOG_SEC,"process_msg5: transform: %s",transform_err);
1363         return False;
1364     }
1365     /* Buffer should now contain untransformed PING packet data */
1366     CHECK_AVAIL(msg5,4);
1367     if (buf_unprepend_uint32(msg5)!=LABEL_MSG5) {
1368         slog(st,LOG_SEC,"MSG5/PING packet contained wrong label");
1369         return False;
1370     }
1371     /* Older versions of secnet used to write some config data here
1372      * which we ignore.  So we don't CHECK_EMPTY */
1373     return True;
1374 }
1375
1376 static void create_msg6(struct site *st, struct transform_inst_if *transform,
1377                         uint32_t session_id)
1378 {
1379     cstring_t transform_err;
1380
1381     BUF_ALLOC(&st->buffer,"site:MSG6");
1382     /* We are going to add four words to the message */
1383     buffer_init(&st->buffer,calculate_max_start_pad());
1384     /* Give the netlink code an opportunity to put its own stuff in the
1385        message (configuration information, etc.) */
1386     buf_prepend_uint32(&st->buffer,LABEL_MSG6);
1387     transform_apply_return problem =
1388         call_transform_forwards(st,transform,
1389                                 &st->buffer,&transform_err);
1390     assert(!problem);
1391     buf_prepend_uint32(&st->buffer,LABEL_MSG6);
1392     buf_prepend_uint32(&st->buffer,st->index);
1393     buf_prepend_uint32(&st->buffer,session_id);
1394 }
1395
1396 static bool_t generate_msg6(struct site *st, const struct msg *prompt)
1397 {
1398     if (!is_transform_valid(st->new_transform))
1399         return False;
1400     create_msg6(st,st->new_transform,st->setup_session_id);
1401     st->retries=1; /* Peer will retransmit MSG5 if this packet gets lost */
1402     return True;
1403 }
1404
1405 static bool_t process_msg6(struct site *st, struct buffer_if *msg6,
1406                            const struct comm_addr *src)
1407 {
1408     struct msg0 m;
1409     cstring_t transform_err;
1410
1411     if (!unpick_msg0(st,msg6,&m)) return False;
1412
1413     if (call_transform_reverse(st,st->new_transform,msg6,&transform_err)) {
1414         /* There's a problem */
1415         slog(st,LOG_SEC,"process_msg6: transform: %s",transform_err);
1416         return False;
1417     }
1418     /* Buffer should now contain untransformed PING packet data */
1419     CHECK_AVAIL(msg6,4);
1420     if (buf_unprepend_uint32(msg6)!=LABEL_MSG6) {
1421         slog(st,LOG_SEC,"MSG6/PONG packet contained invalid data");
1422         return False;
1423     }
1424     /* Older versions of secnet used to write some config data here
1425      * which we ignore.  So we don't CHECK_EMPTY */
1426     return True;
1427 }
1428
1429 static transform_apply_return
1430 decrypt_msg0(struct site *st, struct buffer_if *msg0,
1431                            const struct comm_addr *src)
1432 {
1433     cstring_t transform_err, auxkey_err, newkey_err="n/a";
1434     struct msg0 m;
1435     transform_apply_return problem;
1436
1437     if (!unpick_msg0(st,msg0,&m)) return False;
1438
1439     /* Keep a copy so we can try decrypting it with multiple keys */
1440     buffer_copy(&st->scratch, msg0);
1441
1442     problem = call_transform_reverse(st,st->current.transform,
1443                                      msg0,&transform_err);
1444     if (!problem) {
1445         if (!st->auxiliary_is_new)
1446             delete_one_key(st,&st->auxiliary_key,
1447                            "peer has used new key","auxiliary key",LOG_SEC);
1448         return 0;
1449     }
1450     if (transform_apply_return_badseq(problem))
1451         goto badseq;
1452
1453     buffer_copy(msg0, &st->scratch);
1454     problem = call_transform_reverse(st,st->auxiliary_key.transform,
1455                                      msg0,&auxkey_err);
1456     if (!problem) {
1457         slog(st,LOG_DROP,"processing packet which uses auxiliary key");
1458         if (st->auxiliary_is_new) {
1459             /* We previously timed out in state SENTMSG5 but it turns
1460              * out that our peer did in fact get our MSG5 and is
1461              * using the new key.  So we should switch to it too. */
1462             /* This is a bit like activate_new_key. */
1463             struct data_key t;
1464             t=st->current;
1465             st->current=st->auxiliary_key;
1466             st->auxiliary_key=t;
1467
1468             delete_one_key(st,&st->auxiliary_key,"peer has used new key",
1469                            "previous key",LOG_SEC);
1470             st->auxiliary_is_new=0;
1471             st->renegotiate_key_time=st->auxiliary_renegotiate_key_time;
1472         }
1473         return 0;
1474     }
1475     if (transform_apply_return_badseq(problem))
1476         goto badseq;
1477
1478     if (st->state==SITE_SENTMSG5) {
1479         buffer_copy(msg0, &st->scratch);
1480         problem = call_transform_reverse(st,st->new_transform,
1481                                          msg0,&newkey_err);
1482         if (!problem) {
1483             /* It looks like we didn't get the peer's MSG6 */
1484             /* This is like a cut-down enter_new_state(SITE_RUN) */
1485             slog(st,LOG_STATE,"will enter state RUN (MSG0 with new key)");
1486             BUF_FREE(&st->buffer);
1487             st->timeout=0;
1488             activate_new_key(st);
1489             return 0; /* do process the data in this packet */
1490         }
1491         if (transform_apply_return_badseq(problem))
1492             goto badseq;
1493     }
1494
1495     slog(st,LOG_SEC,"transform: %s (aux: %s, new: %s)",
1496          transform_err,auxkey_err,newkey_err);
1497     initiate_key_setup(st,"incoming message would not decrypt",0);
1498     send_nak(src,m.dest,m.source,m.type,msg0,"message would not decrypt");
1499     assert(problem);
1500     return problem;
1501
1502  badseq:
1503     slog(st,LOG_DROP,"transform: %s (bad seq.)",transform_err);
1504     assert(problem);
1505     return problem;
1506 }
1507
1508 static bool_t process_msg0(struct site *st, struct buffer_if *msg0,
1509                            const struct comm_addr *src)
1510 {
1511     uint32_t type;
1512     transform_apply_return problem;
1513
1514     problem = decrypt_msg0(st,msg0,src);
1515     if (problem==transform_apply_seqdupe) {
1516         /* We recently received another copy of this packet, maybe due
1517          * to polypath.  That's not a problem; indeed, for the
1518          * purposes of transport address management it is a success.
1519          * But we don't want to process the packet. */
1520         transport_data_msgok(st,src);
1521         return False;
1522     }
1523     if (problem)
1524         return False;
1525
1526     CHECK_AVAIL(msg0,4);
1527     type=buf_unprepend_uint32(msg0);
1528     switch(type) {
1529     case LABEL_MSG7:
1530         /* We must forget about the current session. */
1531         delete_keys(st,"request from peer",LOG_SEC);
1532         /* probably, the peer is shutting down, and this is going to fail,
1533          * but we need to be trying to bring the link up again */
1534         if (st->keepalive)
1535             initiate_key_setup(st,"peer requested key teardown",0);
1536         return True;
1537     case LABEL_MSG9:
1538         /* Deliver to netlink layer */
1539         st->netlink->deliver(st->netlink->st,msg0);
1540         transport_data_msgok(st,src);
1541         /* See whether we should start negotiating a new key */
1542         if (st->now > st->renegotiate_key_time)
1543             initiate_key_setup(st,"incoming packet in renegotiation window",0);
1544         return True;
1545     default:
1546         slog(st,LOG_SEC,"incoming encrypted message of type %08x "
1547              "(unknown)",type);
1548         break;
1549     }
1550     return False;
1551 }
1552
1553 static void dump_packet(struct site *st, struct buffer_if *buf,
1554                         const struct comm_addr *addr, bool_t incoming,
1555                         bool_t ok)
1556 {
1557     uint32_t dest=get_uint32(buf->start);
1558     uint32_t source=get_uint32(buf->start+4);
1559     uint32_t msgtype=get_uint32(buf->start+8);
1560
1561     if (st->log_events & LOG_DUMP)
1562         slilog(st->log,M_DEBUG,"%s: %s: %08x<-%08x: %08x: %s%s",
1563                st->tunname,incoming?"incoming":"outgoing",
1564                dest,source,msgtype,comm_addr_to_string(addr),
1565                ok?"":" - fail");
1566 }
1567
1568 static bool_t comm_addr_sendmsg(struct site *st,
1569                                 const struct comm_addr *dest,
1570                                 struct buffer_if *buf)
1571 {
1572     int i;
1573     struct comm_clientinfo *commclientinfo = 0;
1574
1575     for (i=0; i < st->ncomms; i++) {
1576         if (st->comms[i] == dest->comm) {
1577             commclientinfo = st->commclientinfos[i];
1578             break;
1579         }
1580     }
1581     return dest->comm->sendmsg(dest->comm->st, buf, dest, commclientinfo);
1582 }
1583
1584 static uint32_t site_status(void *st)
1585 {
1586     return 0;
1587 }
1588
1589 static bool_t send_msg(struct site *st)
1590 {
1591     if (st->retries>0) {
1592         transport_xmit(st, &st->setup_peers, &st->buffer, True);
1593         st->timeout=st->now+st->setup_retry_interval;
1594         st->retries--;
1595         return True;
1596     } else if (st->state==SITE_SENTMSG5) {
1597         logtimeout(st,"timed out sending MSG5, stashing new key");
1598         /* We stash the key we have produced, in case it turns out that
1599          * our peer did see our MSG5 after all and starts using it. */
1600         /* This is a bit like some of activate_new_key */
1601         struct transform_inst_if *t;
1602         t=st->auxiliary_key.transform;
1603         st->auxiliary_key.transform=st->new_transform;
1604         st->new_transform=t;
1605         dispose_transform(&st->new_transform);
1606
1607         st->auxiliary_is_new=1;
1608         st->auxiliary_key.key_timeout=st->now+st->key_lifetime;
1609         st->auxiliary_renegotiate_key_time=st->now+st->key_renegotiate_time;
1610         st->auxiliary_key.remote_session_id=st->setup_session_id;
1611
1612         enter_state_wait(st);
1613         return False;
1614     } else {
1615         logtimeout(st,"timed out sending key setup packet "
1616             "(in state %s)",state_name(st->state));
1617         enter_state_wait(st);
1618         return False;
1619     }
1620 }
1621
1622 static void site_resolve_callback(void *sst, const struct comm_addr *addrs,
1623                                   int stored_naddrs, int all_naddrs,
1624                                   const char *address, const char *failwhy)
1625 {
1626     struct site *st=sst;
1627
1628     if (!stored_naddrs) {
1629         slog(st,LOG_ERROR,"resolution of %s failed: %s",address,failwhy);
1630     } else {
1631         slog(st,LOG_PEER_ADDRS,"resolution of %s completed, %d addrs, eg: %s",
1632              address, all_naddrs, comm_addr_to_string(&addrs[0]));;
1633
1634         int space=st->transport_peers_max-st->resolving_n_results_stored;
1635         int n_tocopy=MIN(stored_naddrs,space);
1636         COPY_ARRAY(st->resolving_results + st->resolving_n_results_stored,
1637                    addrs,
1638                    n_tocopy);
1639         st->resolving_n_results_stored += n_tocopy;
1640         st->resolving_n_results_all += all_naddrs;
1641     }
1642
1643     decrement_resolving_count(st,1);
1644 }
1645
1646 static void decrement_resolving_count(struct site *st, int by)
1647 {
1648     assert(st->resolving_count>0);
1649     st->resolving_count-=by;
1650
1651     if (st->resolving_count)
1652         return;
1653
1654     /* OK, we are done with them all.  Handle combined results. */
1655
1656     const struct comm_addr *addrs=st->resolving_results;
1657     int naddrs=st->resolving_n_results_stored;
1658     assert(naddrs<=st->transport_peers_max);
1659
1660     if (naddrs) {
1661         if (naddrs != st->resolving_n_results_all) {
1662             slog(st,LOG_SETUP_INIT,"resolution of supplied addresses/names"
1663                  " yielded too many results (%d > %d), some ignored",
1664                  st->resolving_n_results_all, naddrs);
1665         }
1666         slog(st,LOG_STATE,"resolution completed, %d addrs, eg: %s",
1667              naddrs, iaddr_to_string(&addrs[0].ia));;
1668     }
1669
1670     switch (st->state) {
1671     case SITE_RESOLVE:
1672         if (transport_compute_setupinit_peers(st,addrs,naddrs,0)) {
1673             enter_new_state(st,SITE_SENTMSG1,0);
1674         } else {
1675             /* Can't figure out who to try to to talk to */
1676             slog(st,LOG_SETUP_INIT,
1677                  "key exchange failed: cannot find peer address");
1678             enter_state_run(st);
1679         }
1680         break;
1681     case SITE_SENTMSG1: case SITE_SENTMSG2:
1682     case SITE_SENTMSG3: case SITE_SENTMSG4:
1683     case SITE_SENTMSG5:
1684         if (naddrs) {
1685             /* We start using the address immediately for data too.
1686              * It's best to store it in st->peers now because we might
1687              * go via SENTMSG5, WAIT, and a MSG0, straight into using
1688              * the new key (without updating the data peer addrs). */
1689             transport_resolve_complete(st,addrs,naddrs);
1690         } else if (st->local_mobile) {
1691             /* We can't let this rest because we may have a peer
1692              * address which will break in the future. */
1693             slog(st,LOG_SETUP_INIT,"resolution failed: "
1694                  "abandoning key exchange");
1695             enter_state_wait(st);
1696         } else {
1697             slog(st,LOG_SETUP_INIT,"resolution failed: "
1698                  " continuing to use source address of peer's packets"
1699                  " for key exchange and ultimately data");
1700         }
1701         break;
1702     case SITE_RUN:
1703         if (naddrs) {
1704             slog(st,LOG_SETUP_INIT,"resolution completed tardily,"
1705                  " updating peer address(es)");
1706             transport_resolve_complete_tardy(st,addrs,naddrs);
1707         } else if (st->local_mobile) {
1708             /* Not very good.  We should queue (another) renegotiation
1709              * so that we can update the peer address. */
1710             st->key_renegotiate_time=st->now+wait_timeout(st);
1711         } else {
1712             slog(st,LOG_SETUP_INIT,"resolution failed: "
1713                  " continuing to use source address of peer's packets");
1714         }
1715         break;
1716     case SITE_WAIT:
1717     case SITE_STOP:
1718         /* oh well */
1719         break;
1720     }
1721 }
1722
1723 static bool_t initiate_key_setup(struct site *st, cstring_t reason,
1724                                  const struct comm_addr *prod_hint)
1725 {
1726     /* Reentrancy hazard: can call enter_new_state/enter_state_* */
1727     if (st->state!=SITE_RUN) return False;
1728     slog(st,LOG_SETUP_INIT,"initiating key exchange (%s)",reason);
1729     if (st->addresses) {
1730         slog(st,LOG_SETUP_INIT,"resolving peer address(es)");
1731         return enter_state_resolve(st);
1732     } else if (transport_compute_setupinit_peers(st,0,0,prod_hint)) {
1733         return enter_new_state(st,SITE_SENTMSG1,0);
1734     }
1735     slog(st,LOG_SETUP_INIT,"key exchange failed: no address for peer");
1736     return False;
1737 }
1738
1739 static void activate_new_key(struct site *st)
1740 {
1741     struct transform_inst_if *t;
1742
1743     /* We have three transform instances, which we swap between old,
1744        active and setup */
1745     t=st->auxiliary_key.transform;
1746     st->auxiliary_key.transform=st->current.transform;
1747     st->current.transform=st->new_transform;
1748     st->new_transform=t;
1749     dispose_transform(&st->new_transform);
1750
1751     st->timeout=0;
1752     st->auxiliary_is_new=0;
1753     st->auxiliary_key.key_timeout=st->current.key_timeout;
1754     st->current.key_timeout=st->now+st->key_lifetime;
1755     st->renegotiate_key_time=st->now+st->key_renegotiate_time;
1756     transport_peers_copy(st,&st->peers,&st->setup_peers);
1757     st->current.remote_session_id=st->setup_session_id;
1758
1759     /* Compute the inter-site MTU.  This is min( our_mtu, their_mtu ).
1760      * But their mtu be unspecified, in which case we just use ours. */
1761     uint32_t intersite_mtu=
1762         MIN(st->mtu_target, st->remote_adv_mtu ?: ~(uint32_t)0);
1763     st->netlink->set_mtu(st->netlink->st,intersite_mtu);
1764
1765     slog(st,LOG_ACTIVATE_KEY,"new key activated"
1766          " (mtu ours=%"PRId32" theirs=%"PRId32" intersite=%"PRId32")",
1767          st->mtu_target, st->remote_adv_mtu, intersite_mtu);
1768     enter_state_run(st);
1769 }
1770
1771 static void delete_one_key(struct site *st, struct data_key *key,
1772                            cstring_t reason, cstring_t which, uint32_t loglevel)
1773 {
1774     if (!is_transform_valid(key->transform)) return;
1775     if (reason) slog(st,loglevel,"%s deleted (%s)",which,reason);
1776     dispose_transform(&key->transform);
1777     key->key_timeout=0;
1778 }
1779
1780 static void delete_keys(struct site *st, cstring_t reason, uint32_t loglevel)
1781 {
1782     if (current_valid(st)) {
1783         slog(st,loglevel,"session closed (%s)",reason);
1784
1785         delete_one_key(st,&st->current,0,0,0);
1786         set_link_quality(st);
1787     }
1788     delete_one_key(st,&st->auxiliary_key,0,0,0);
1789 }
1790
1791 static void state_assert(struct site *st, bool_t ok)
1792 {
1793     if (!ok) fatal("site:state_assert");
1794 }
1795
1796 static void enter_state_stop(struct site *st)
1797 {
1798     st->state=SITE_STOP;
1799     st->timeout=0;
1800     delete_keys(st,"entering state STOP",LOG_TIMEOUT_KEY);
1801     dispose_transform(&st->new_transform);
1802 }
1803
1804 static void set_link_quality(struct site *st)
1805 {
1806     uint32_t quality;
1807     if (current_valid(st))
1808         quality=LINK_QUALITY_UP;
1809     else if (st->state==SITE_WAIT || st->state==SITE_STOP)
1810         quality=LINK_QUALITY_DOWN;
1811     else if (st->addresses)
1812         quality=LINK_QUALITY_DOWN_CURRENT_ADDRESS;
1813     else if (transport_peers_valid(&st->peers))
1814         quality=LINK_QUALITY_DOWN_STALE_ADDRESS;
1815     else
1816         quality=LINK_QUALITY_DOWN;
1817
1818     st->netlink->set_quality(st->netlink->st,quality);
1819 }
1820
1821 static void enter_state_run(struct site *st)
1822 {
1823     slog(st,LOG_STATE,"entering state RUN%s",
1824          current_valid(st) ? " (keyed)" : " (unkeyed)");
1825     st->state=SITE_RUN;
1826     st->timeout=0;
1827
1828     st->setup_session_id=0;
1829     transport_peers_clear(st,&st->setup_peers);
1830     keyset_dispose(&st->peerkeys_kex);
1831     FILLZERO(st->localN);
1832     FILLZERO(st->remoteN);
1833     dispose_transform(&st->new_transform);
1834     memset(st->dhsecret,0,st->dh->len);
1835     if (st->sharedsecret) memset(st->sharedsecret,0,st->sharedsecretlen);
1836     set_link_quality(st);
1837
1838     if (st->keepalive && !current_valid(st))
1839         initiate_key_setup(st, "keepalive", 0);
1840 }
1841
1842 static bool_t ensure_resolving(struct site *st)
1843 {
1844     /* Reentrancy hazard: may call site_resolve_callback and hence
1845      * enter_new_state, enter_state_* and generate_msg*. */
1846     if (st->resolving_count)
1847         return True;
1848
1849     assert(st->addresses);
1850
1851     /* resolver->request might reentrantly call site_resolve_callback
1852      * which will decrement st->resolving, so we need to increment it
1853      * twice beforehand to prevent decrement from thinking we're
1854      * finished, and decrement it ourselves.  Alternatively if
1855      * everything fails then there are no callbacks due and we simply
1856      * set it to 0 and return false.. */
1857     st->resolving_n_results_stored=0;
1858     st->resolving_n_results_all=0;
1859     st->resolving_count+=2;
1860     const char **addrp=st->addresses;
1861     const char *address;
1862     bool_t anyok=False;
1863     for (; (address=*addrp++); ) {
1864         bool_t ok = st->resolver->request(st->resolver->st,address,
1865                                           st->remoteport,st->comms[0],
1866                                           site_resolve_callback,st);
1867         if (ok)
1868             st->resolving_count++;
1869         anyok|=ok;
1870     }
1871     if (!anyok) {
1872         st->resolving_count=0;
1873         return False;
1874     }
1875     decrement_resolving_count(st,2);
1876     return True;
1877 }
1878
1879 static bool_t enter_state_resolve(struct site *st)
1880 {
1881     /* Reentrancy hazard!  See ensure_resolving. */
1882     state_assert(st,st->state==SITE_RUN);
1883     slog(st,LOG_STATE,"entering state RESOLVE");
1884     st->state=SITE_RESOLVE;
1885     return ensure_resolving(st);
1886 }
1887
1888 static bool_t enter_new_state(struct site *st, uint32_t next,
1889                               const struct msg *prompt
1890                               /* may be 0 for SENTMSG1 */)
1891 {
1892     bool_t (*gen)(struct site *st, const struct msg *prompt);
1893     int r;
1894
1895     slog(st,LOG_STATE,"entering state %s",state_name(next));
1896     switch(next) {
1897     case SITE_SENTMSG1:
1898         state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE);
1899         if (!kex_init(st)) return False;
1900         gen=generate_msg1;
1901         st->msg1_crossed_logged = False;
1902         break;
1903     case SITE_SENTMSG2:
1904         state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1905                      st->state==SITE_SENTMSG1 || st->state==SITE_WAIT);
1906         if (!kex_init(st)) return False;
1907         gen=generate_msg2;
1908         break;
1909     case SITE_SENTMSG3:
1910         state_assert(st,st->state==SITE_SENTMSG1);
1911         BUF_FREE(&st->buffer);
1912         gen=generate_msg3;
1913         break;
1914     case SITE_SENTMSG4:
1915         state_assert(st,st->state==SITE_SENTMSG2);
1916         BUF_FREE(&st->buffer);
1917         gen=generate_msg4;
1918         break;
1919     case SITE_SENTMSG5:
1920         state_assert(st,st->state==SITE_SENTMSG3);
1921         BUF_FREE(&st->buffer);
1922         gen=generate_msg5;
1923         break;
1924     case SITE_RUN:
1925         state_assert(st,st->state==SITE_SENTMSG4);
1926         BUF_FREE(&st->buffer);
1927         gen=generate_msg6;
1928         break;
1929     default:
1930         gen=NULL;
1931         fatal("enter_new_state(%s): invalid new state",state_name(next));
1932         break;
1933     }
1934
1935     if (hacky_par_start_failnow()) return False;
1936
1937     r= gen(st,prompt) && send_msg(st);
1938
1939     hacky_par_end(&r,
1940                   st->setup_retries, st->setup_retry_interval,
1941                   send_msg, st);
1942     
1943     if (r) {
1944         st->state=next;
1945         if (next==SITE_RUN) {
1946             BUF_FREE(&st->buffer); /* Never reused */
1947             st->timeout=0; /* Never retransmit */
1948             activate_new_key(st);
1949         }
1950         return True;
1951     }
1952     slog(st,LOG_ERROR,"error entering state %s",state_name(next));
1953     st->buffer.free=False; /* Unconditionally use the buffer; it may be
1954                               in either state, and enter_state_wait() will
1955                               do a BUF_FREE() */
1956     enter_state_wait(st);
1957     return False;
1958 }
1959
1960 /* msg7 tells our peer that we're about to forget our key */
1961 static bool_t send_msg7(struct site *st, cstring_t reason)
1962 {
1963     cstring_t transform_err;
1964
1965     if (current_valid(st) && st->buffer.free
1966         && transport_peers_valid(&st->peers)) {
1967         BUF_ALLOC(&st->buffer,"site:MSG7");
1968         buffer_init(&st->buffer,calculate_max_start_pad());
1969         buf_append_uint32(&st->buffer,LABEL_MSG7);
1970         buf_append_string(&st->buffer,reason);
1971         if (call_transform_forwards(st, st->current.transform,
1972                                     &st->buffer, &transform_err))
1973             goto free_out;
1974         buf_prepend_uint32(&st->buffer,LABEL_MSG0);
1975         buf_prepend_uint32(&st->buffer,st->index);
1976         buf_prepend_uint32(&st->buffer,st->current.remote_session_id);
1977         transport_xmit(st,&st->peers,&st->buffer,True);
1978         BUF_FREE(&st->buffer);
1979     free_out:
1980         return True;
1981     }
1982     return False;
1983 }
1984
1985 /* We go into this state if our peer becomes uncommunicative. Similar to
1986    the "stop" state, we forget all session keys for a while, before
1987    re-entering the "run" state. */
1988 static void enter_state_wait(struct site *st)
1989 {
1990     slog(st,LOG_STATE,"entering state WAIT");
1991     st->timeout=st->now+wait_timeout(st);
1992     st->state=SITE_WAIT;
1993     set_link_quality(st);
1994     BUF_FREE(&st->buffer); /* will have had an outgoing packet in it */
1995     /* XXX Erase keys etc. */
1996 }
1997
1998 static void generate_prod(struct site *st, struct buffer_if *buf)
1999 {
2000     buffer_init(buf,0);
2001     buf_append_uint32(buf,0);
2002     buf_append_uint32(buf,0);
2003     buf_append_uint32(buf,LABEL_PROD);
2004     buf_append_string(buf,st->localname);
2005     buf_append_string(buf,st->remotename);
2006 }
2007
2008 static void generate_send_prod(struct site *st,
2009                                const struct comm_addr *source)
2010 {
2011     if (!st->allow_send_prod) return; /* too soon */
2012     if (!(st->state==SITE_RUN || st->state==SITE_RESOLVE ||
2013           st->state==SITE_WAIT)) return; /* we'd ignore peer's MSG1 */
2014
2015     slog(st,LOG_SETUP_INIT,"prodding peer for key exchange");
2016     st->allow_send_prod=0;
2017     generate_prod(st,&st->scratch);
2018     bool_t ok = comm_addr_sendmsg(st, source, &st->scratch);
2019     dump_packet(st,&st->scratch,source,False,ok);
2020 }
2021
2022 static inline void site_settimeout(uint64_t timeout, int *timeout_io)
2023 {
2024     if (timeout) {
2025         int64_t offset=timeout-*now;
2026         if (offset<0) offset=0;
2027         if (offset>INT_MAX) offset=INT_MAX;
2028         if (*timeout_io<0 || offset<*timeout_io)
2029             *timeout_io=offset;
2030     }
2031 }
2032
2033 static int site_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
2034                            int *timeout_io)
2035 {
2036     struct site *st=sst;
2037
2038     BEFOREPOLL_WANT_FDS(0); /* We don't use any file descriptors */
2039     st->now=*now;
2040
2041     /* Work out when our next timeout is. The earlier of 'timeout' or
2042        'current.key_timeout'. A stored value of '0' indicates no timeout
2043        active. */
2044     site_settimeout(st->timeout, timeout_io);
2045     site_settimeout(st->current.key_timeout, timeout_io);
2046     site_settimeout(st->auxiliary_key.key_timeout, timeout_io);
2047
2048     return 0; /* success */
2049 }
2050
2051 static void check_expiry(struct site *st, struct data_key *key,
2052                          const char *which)
2053 {
2054     if (key->key_timeout && *now>key->key_timeout) {
2055         delete_one_key(st,key,"maximum life exceeded",which,LOG_TIMEOUT_KEY);
2056     }
2057 }
2058
2059 /* NB site_afterpoll will be called before site_beforepoll is ever called */
2060 static void site_afterpoll(void *sst, struct pollfd *fds, int nfds)
2061 {
2062     struct site *st=sst;
2063
2064     st->now=*now;
2065     if (st->timeout && *now>st->timeout) {
2066         st->timeout=0;
2067         if (st->state>=SITE_SENTMSG1 && st->state<=SITE_SENTMSG5) {
2068             if (!hacky_par_start_failnow())
2069                 send_msg(st);
2070         } else if (st->state==SITE_WAIT) {
2071             enter_state_run(st);
2072         } else {
2073             slog(st,LOG_ERROR,"site_afterpoll: unexpected timeout, state=%d",
2074                  st->state);
2075         }
2076     }
2077     check_expiry(st,&st->current,"current key");
2078     check_expiry(st,&st->auxiliary_key,"auxiliary key");
2079 }
2080
2081 /* This function is called by the netlink device to deliver packets
2082    intended for the remote network. The packet is in "raw" wire
2083    format, but is guaranteed to be word-aligned. */
2084 static void site_outgoing(void *sst, struct buffer_if *buf)
2085 {
2086     struct site *st=sst;
2087     cstring_t transform_err;
2088     
2089     if (st->state==SITE_STOP) {
2090         BUF_FREE(buf);
2091         return;
2092     }
2093
2094     st->allow_send_prod=1;
2095
2096     /* In all other states we consider delivering the packet if we have
2097        a valid key and a valid address to send it to. */
2098     if (current_valid(st) && transport_peers_valid(&st->peers)) {
2099         /* Transform it and send it */
2100         if (buf->size>0) {
2101             buf_prepend_uint32(buf,LABEL_MSG9);
2102             if (call_transform_forwards(st, st->current.transform,
2103                                         buf, &transform_err))
2104                 goto free_out;
2105             buf_prepend_uint32(buf,LABEL_MSG0);
2106             buf_prepend_uint32(buf,st->index);
2107             buf_prepend_uint32(buf,st->current.remote_session_id);
2108             transport_xmit(st,&st->peers,buf,False);
2109         }
2110     free_out:
2111         BUF_FREE(buf);
2112         return;
2113     }
2114
2115     slog(st,LOG_DROP,"discarding outgoing packet of size %d",buf->size);
2116     BUF_FREE(buf);
2117     initiate_key_setup(st,"outgoing packet",0);
2118 }
2119
2120 static bool_t named_for_us(struct site *st, const struct buffer_if *buf_in,
2121                            uint32_t type, struct msg *m,
2122                            struct priomsg *whynot)
2123     /* For packets which are identified by the local and remote names.
2124      * If it has our name and our peer's name in it it's for us. */
2125 {
2126     struct buffer_if buf[1];
2127     buffer_readonly_clone(buf,buf_in);
2128
2129     if (!unpick_msg(st,type,buf,m)) {
2130         priomsg_update_fixed(whynot, comm_notify_whynot_unpick, "malformed");
2131         return False;
2132     }
2133 #define NAME_MATCHES(lr)                                                \
2134     if (!name_matches(&m->lr, st->lr##name)) {                          \
2135         if (priomsg_update_fixed(whynot, comm_notify_whynot_name_##lr,  \
2136                                  "unknown " #lr " name: ")) {           \
2137             truncmsg_add_packet_string(&whynot->m, m->lr.len, m->lr.name); \
2138         }                                                               \
2139         return False;                                                   \
2140     }
2141     NAME_MATCHES(remote);
2142     NAME_MATCHES(local );
2143 #undef NAME_MATCHES
2144
2145     return True;
2146 }
2147
2148 static bool_t we_have_priority(struct site *st, const struct msg *m) {
2149     if (st->local_capabilities & m->remote_capabilities &
2150         CAPAB_PRIORITY_MOBILE) {
2151         if (st->local_mobile) return True;
2152         if (st-> peer_mobile) return False;
2153     }
2154     return st->our_name_later;
2155 }
2156
2157 static bool_t setup_late_msg_ok(struct site *st, 
2158                                 const struct buffer_if *buf_in,
2159                                 uint32_t msgtype,
2160                                 const struct comm_addr *source,
2161                                 struct msg *m /* returned */) {
2162     /* For setup packets which seem from their type like they are
2163      * late.  Maybe they came via a different path.  All we do is make
2164      * a note of the sending address, iff they look like they are part
2165      * of the current key setup attempt. */
2166     if (!named_for_us(st,buf_in,msgtype,m,0))
2167         /* named_for_us calls unpick_msg which gets the nonces */
2168         return False;
2169     if (!consttime_memeq(m->nR,st->remoteN,NONCELEN) ||
2170         !consttime_memeq(m->nL,st->localN, NONCELEN))
2171         /* spoof ?  from stale run ?  who knows */
2172         return False;
2173     transport_setup_msgok(st,source);
2174     return True;
2175 }
2176
2177 /* This function is called by the communication device to deliver
2178    packets from our peers.
2179    It should return True if the packet is recognised as being for
2180    this current site instance (and should therefore not be processed
2181    by other sites), even if the packet was otherwise ignored. */
2182 static bool_t site_incoming(void *sst, struct buffer_if *buf,
2183                             const struct comm_addr *source,
2184                             struct priomsg *whynot)
2185 {
2186     struct site *st=sst;
2187
2188     if (buf->size < 12) return False;
2189
2190     uint32_t dest=get_uint32(buf->start);
2191     uint32_t msgtype=get_uint32(buf->start+8);
2192     struct msg msg;
2193       /* initialised by named_for_us, or process_msgN for N!=1 */
2194
2195     if (msgtype==LABEL_MSG1) {
2196         if (!named_for_us(st,buf,msgtype,&msg,whynot))
2197             return False;
2198         /* It's a MSG1 addressed to us. Decide what to do about it. */
2199         dump_packet(st,buf,source,True,True);
2200         if (st->state==SITE_RUN || st->state==SITE_RESOLVE ||
2201             st->state==SITE_WAIT) {
2202             /* We should definitely process it */
2203             transport_compute_setupinit_peers(st,0,0,source);
2204             if (process_msg1(st,buf,source,&msg)) {
2205                 slog(st,LOG_SETUP_INIT,"key setup initiated by peer");
2206                 bool_t entered=enter_new_state(st,SITE_SENTMSG2,&msg);
2207                 if (entered && st->addresses && st->local_mobile)
2208                     /* We must do this as the very last thing, because
2209                        the resolver callback might reenter us. */
2210                     ensure_resolving(st);
2211             } else {
2212                 slog(st,LOG_ERROR,"failed to process incoming msg1");
2213             }
2214             BUF_FREE(buf);
2215             return True;
2216         } else if (st->state==SITE_SENTMSG1) {
2217             /* We've just sent a message 1! They may have crossed on
2218                the wire. If we have priority then we ignore the
2219                incoming one, otherwise we process it as usual. */
2220             if (we_have_priority(st,&msg)) {
2221                 BUF_FREE(buf);
2222                 if (!st->msg1_crossed_logged++)
2223                     slog(st,LOG_SETUP_INIT,"crossed msg1s; we are higher "
2224                          "priority => ignore incoming msg1");
2225                 return True;
2226             } else {
2227                 slog(st,LOG_SETUP_INIT,"crossed msg1s; we are lower "
2228                      "priority => use incoming msg1");
2229                 if (process_msg1(st,buf,source,&msg)) {
2230                     BUF_FREE(&st->buffer); /* Free our old message 1 */
2231                     transport_setup_msgok(st,source);
2232                     enter_new_state(st,SITE_SENTMSG2,&msg);
2233                 } else {
2234                     slog(st,LOG_ERROR,"failed to process an incoming "
2235                          "crossed msg1 (we have low priority)");
2236                 }
2237                 BUF_FREE(buf);
2238                 return True;
2239             }
2240         } else if (st->state==SITE_SENTMSG2 ||
2241                    st->state==SITE_SENTMSG4) {
2242             if (consttime_memeq(msg.nR,st->remoteN,NONCELEN)) {
2243                 /* We are ahead in the protocol, but that msg1 had the
2244                  * peer's nonce so presumably it is from this key
2245                  * exchange run, via a slower route */
2246                 transport_setup_msgok(st,source);
2247             } else {
2248                 slog(st,LOG_UNEXPECTED,"competing incoming message 1");
2249             }
2250             BUF_FREE(buf);
2251             return True;
2252         }
2253         /* The message 1 was received at an unexpected stage of the
2254            key setup.  Well, they lost the race. */
2255         slog(st,LOG_UNEXPECTED,"unexpected incoming message 1");
2256         BUF_FREE(buf);
2257         return True;
2258     }
2259     if (msgtype==LABEL_PROD) {
2260         if (!named_for_us(st,buf,msgtype,&msg,whynot))
2261             return False;
2262         dump_packet(st,buf,source,True,True);
2263         if (st->state!=SITE_RUN) {
2264             slog(st,LOG_DROP,"ignoring PROD when not in state RUN");
2265         } else if (current_valid(st)) {
2266             slog(st,LOG_DROP,"ignoring PROD when we think we have a key");
2267         } else {
2268             initiate_key_setup(st,"peer sent PROD packet",source);
2269         }
2270         BUF_FREE(buf);
2271         return True;
2272     }
2273     if (dest==st->index) {
2274         /* Explicitly addressed to us */
2275         if (msgtype!=LABEL_MSG0) dump_packet(st,buf,source,True,True);
2276         switch (msgtype) {
2277         case LABEL_NAK:
2278             /* If the source is our current peer then initiate a key setup,
2279                because our peer's forgotten the key */
2280             if (get_uint32(buf->start+4)==st->current.remote_session_id) {
2281                 bool_t initiated;
2282                 initiated = initiate_key_setup(st,"received a NAK",source);
2283                 if (!initiated) generate_send_prod(st,source);
2284             } else {
2285                 slog(st,LOG_SEC,"bad incoming NAK");
2286             }
2287             break;
2288         case LABEL_MSG0:
2289             process_msg0(st,buf,source);
2290             break;
2291         case LABEL_MSG1:
2292             /* Setup packet: should not have been explicitly addressed
2293                to us */
2294             slog(st,LOG_SEC,"incoming explicitly addressed msg1");
2295             break;
2296         case LABEL_MSG2:
2297             /* Setup packet: expected only in state SENTMSG1 */
2298             if (st->state!=SITE_SENTMSG1) {
2299                 if ((st->state==SITE_SENTMSG3 ||
2300                      st->state==SITE_SENTMSG5) &&
2301                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2302                     break;
2303                 slog(st,LOG_UNEXPECTED,"unexpected MSG2");
2304             } else if (process_msg2(st,buf,source,&msg)) {
2305                 transport_setup_msgok(st,source);
2306                 enter_new_state(st,SITE_SENTMSG3,&msg);
2307             } else {
2308                 slog(st,LOG_SEC,"invalid MSG2");
2309             }
2310             break;
2311         case CASES_MSG3_KNOWN:
2312             /* Setup packet: expected only in state SENTMSG2 */
2313             if (st->state!=SITE_SENTMSG2) {
2314                 if ((st->state==SITE_SENTMSG4) &&
2315                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2316                     break;
2317                 slog(st,LOG_UNEXPECTED,"unexpected MSG3");
2318             } else if (process_msg3(st,buf,source,msgtype,&msg)) {
2319                 transport_setup_msgok(st,source);
2320                 enter_new_state(st,SITE_SENTMSG4,&msg);
2321             } else {
2322                 slog(st,LOG_SEC,"invalid MSG3");
2323             }
2324             break;
2325         case LABEL_MSG4:
2326             /* Setup packet: expected only in state SENTMSG3 */
2327             if (st->state!=SITE_SENTMSG3) {
2328                 if ((st->state==SITE_SENTMSG5) &&
2329                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2330                     break;
2331                 slog(st,LOG_UNEXPECTED,"unexpected MSG4");
2332             } else if (process_msg4(st,buf,source,&msg)) {
2333                 transport_setup_msgok(st,source);
2334                 enter_new_state(st,SITE_SENTMSG5,&msg);
2335             } else {
2336                 slog(st,LOG_SEC,"invalid MSG4");
2337             }
2338             break;
2339         case LABEL_MSG5:
2340             /* Setup packet: expected only in state SENTMSG4 */
2341             /* (may turn up in state RUN if our return MSG6 was lost
2342                and the new key has already been activated. In that
2343                case we discard it. The peer will realise that we
2344                are using the new key when they see our data packets.
2345                Until then the peer's data packets to us get discarded. */
2346             if (st->state==SITE_SENTMSG4) {
2347                 if (process_msg5(st,buf,source,st->new_transform)) {
2348                     transport_setup_msgok(st,source);
2349                     enter_new_state(st,SITE_RUN,&msg);
2350                 } else {
2351                     slog(st,LOG_SEC,"invalid MSG5");
2352                 }
2353             } else if (st->state==SITE_RUN) {
2354                 if (process_msg5(st,buf,source,st->current.transform)) {
2355                     slog(st,LOG_DROP,"got MSG5, retransmitting MSG6");
2356                     transport_setup_msgok(st,source);
2357                     create_msg6(st,st->current.transform,
2358                                 st->current.remote_session_id);
2359                     transport_xmit(st,&st->peers,&st->buffer,True);
2360                     BUF_FREE(&st->buffer);
2361                 } else {
2362                     slog(st,LOG_SEC,"invalid MSG5 (in state RUN)");
2363                 }
2364             } else {
2365                 slog(st,LOG_UNEXPECTED,"unexpected MSG5");
2366             }
2367             break;
2368         case LABEL_MSG6:
2369             /* Setup packet: expected only in state SENTMSG5 */
2370             if (st->state!=SITE_SENTMSG5) {
2371                 slog(st,LOG_UNEXPECTED,"unexpected MSG6");
2372             } else if (process_msg6(st,buf,source)) {
2373                 BUF_FREE(&st->buffer); /* Free message 5 */
2374                 transport_setup_msgok(st,source);
2375                 activate_new_key(st);
2376             } else {
2377                 slog(st,LOG_SEC,"invalid MSG6");
2378             }
2379             break;
2380         default:
2381             slog(st,LOG_SEC,"received message of unknown type 0x%08x",
2382                  msgtype);
2383             break;
2384         }
2385         BUF_FREE(buf);
2386         return True;
2387     }
2388
2389     priomsg_update_fixed(whynot, comm_notify_whynot_general,
2390                          "not MSG1 or PROD; unknown dest index");
2391     return False;
2392 }
2393
2394 static void site_control(void *vst, bool_t run)
2395 {
2396     struct site *st=vst;
2397     if (run) enter_state_run(st);
2398     else enter_state_stop(st);
2399 }
2400
2401 static void site_phase_hook(void *sst, uint32_t newphase)
2402 {
2403     struct site *st=sst;
2404
2405     /* The program is shutting down; tell our peer */
2406     send_msg7(st,"shutting down");
2407 }
2408
2409 static void site_childpersist_clearkeys(void *sst, uint32_t newphase)
2410 {
2411     struct site *st=sst;
2412     dispose_transform(&st->current.transform);
2413     dispose_transform(&st->auxiliary_key.transform);
2414     dispose_transform(&st->new_transform);
2415     /* Not much point overwiting the signing key, since we loaded it
2416        from disk, and it is only valid prospectively if at all,
2417        anyway. */
2418     /* XXX it would be best to overwrite the DH state, because that
2419        _is_ relevant to forward secrecy.  However we have no
2420        convenient interface for doing that and in practice gmp has
2421        probably dribbled droppings all over the malloc arena.  A good
2422        way to fix this would be to have a privsep child for asymmetric
2423        crypto operations, but that's a task for another day. */
2424 }
2425
2426 static void setup_sethash(struct site *st, dict_t *dict,
2427                           struct cloc loc,
2428                           sig_sethash_fn *sethash, void *sigkey_st) {
2429     if (!st->defhash)
2430         cfgfatal(loc,"site","other settings imply `hash' key is needed");
2431     sethash(sigkey_st,st->defhash);
2432 }
2433 #define SETUP_SETHASH(k) do{                                            \
2434     if ((k)->sethash)                                                   \
2435         setup_sethash(st,dict,loc, (k)->sethash,(k)->st);       \
2436 }while(0)
2437
2438 static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
2439                           list_t *args)
2440 {
2441     static uint32_t index_sequence;
2442     struct site *st;
2443     item_t *item;
2444     dict_t *dict;
2445     int i;
2446
2447     NEW(st);
2448
2449     st->cl.description="site";
2450     st->cl.type=CL_SITE;
2451     st->cl.apply=NULL;
2452     st->cl.interface=&st->ops;
2453     st->ops.st=st;
2454     st->ops.control=site_control;
2455     st->ops.status=site_status;
2456     st->peerkeys_path=0;
2457     st->peerkeys_tmpl.buffer=0;
2458     st->peerkeys_current=st->peerkeys_kex=0;
2459
2460     /* First parameter must be a dict */
2461     item=list_elem(args,0);
2462     if (!item || item->type!=t_dict)
2463         cfgfatal(loc,"site","parameter must be a dictionary\n");
2464     
2465     dict=item->data.dict;
2466     st->localname=dict_read_string(dict, "local-name", True, "site", loc);
2467     st->remotename=dict_read_string(dict, "name", True, "site", loc);
2468
2469     st->keepalive=dict_read_bool(dict,"keepalive",False,"site",loc,False);
2470
2471     st->peer_mobile=dict_read_bool(dict,"mobile",False,"site",loc,False);
2472     st->local_mobile=
2473         dict_read_bool(dict,"local-mobile",False,"site",loc,False);
2474
2475     /* Sanity check (which also allows the 'sites' file to include
2476        site() closures for all sites including our own): refuse to
2477        talk to ourselves */
2478     if (strcmp(st->localname,st->remotename)==0) {
2479         Message(M_DEBUG,"site %s: local-name==name -> ignoring this site\n",
2480                 st->localname);
2481         if (st->peer_mobile != st->local_mobile)
2482             cfgfatal(loc,"site","site %s's peer-mobile=%d"
2483                     " but our local-mobile=%d\n",
2484                     st->localname, st->peer_mobile, st->local_mobile);
2485         free(st);
2486         return NULL;
2487     }
2488     if (st->peer_mobile && st->local_mobile) {
2489         Message(M_WARNING,"site %s: site is mobile but so are we"
2490                 " -> ignoring this site\n", st->remotename);
2491         free(st);
2492         return NULL;
2493     }
2494
2495     assert(index_sequence < 0xffffffffUL);
2496     st->index = ++index_sequence;
2497     st->local_capabilities = 0;
2498     st->early_capabilities = CAPAB_PRIORITY_MOBILE;
2499     st->netlink=find_cl_if(dict,"link",CL_NETLINK,True,"site",loc);
2500
2501 #define GET_CLOSURE_LIST(dictkey,things,nthings,CL_TYPE) do{            \
2502     list_t *things##_cfg=dict_lookup(dict,dictkey);                     \
2503     if (!things##_cfg)                                                  \
2504         cfgfatal(loc,"site","closure list \"%s\" not found\n",dictkey); \
2505     st->nthings=list_length(things##_cfg);                              \
2506     NEW_ARY(st->things,st->nthings);                                    \
2507     assert(st->nthings);                                                \
2508     for (i=0; i<st->nthings; i++) {                                     \
2509         item_t *item=list_elem(things##_cfg,i);                         \
2510         if (item->type!=t_closure)                                      \
2511             cfgfatal(loc,"site","%s is not a closure\n",dictkey);       \
2512         closure_t *cl=item->data.closure;                               \
2513         if (cl->type!=CL_TYPE)                                          \
2514             cfgfatal(loc,"site","%s closure wrong type\n",dictkey);     \
2515         st->things[i]=cl->interface;                                    \
2516     }                                                                   \
2517 }while(0)
2518
2519     GET_CLOSURE_LIST("comm",comms,ncomms,CL_COMM);
2520
2521     NEW_ARY(st->commclientinfos, st->ncomms);
2522     dict_t *comminfo = dict_read_dict(dict,"comm-info",False,"site",loc);
2523     for (i=0; i<st->ncomms; i++) {
2524         st->commclientinfos[i] =
2525             !comminfo ? 0 :
2526             st->comms[i]->clientinfo(st->comms[i],comminfo,loc);
2527     }
2528
2529     st->resolver=find_cl_if(dict,"resolver",CL_RESOLVER,True,"site",loc);
2530     st->log=find_cl_if(dict,"log",CL_LOG,True,"site",loc);
2531     st->random=find_cl_if(dict,"random",CL_RANDOMSRC,True,"site",loc);
2532
2533     st->defhash=find_cl_if(dict,"hash",CL_HASH,True,"site",loc);
2534
2535     st->privkeys=find_cl_if(dict,"key-cache",CL_PRIVCACHE,False,"site",loc);
2536     if (!st->privkeys) {
2537         st->privkey_fixed=
2538             find_cl_if(dict,"local-key",CL_SIGPRIVKEY,True,"site",loc);
2539         SETUP_SETHASH(st->privkey_fixed);
2540     }
2541
2542     struct sigpubkey_if *fixed_pubkey
2543         =find_cl_if(dict,"key",CL_SIGPUBKEY,False,"site",loc);
2544     st->peerkeys_path=dict_read_string(dict,"peer-keys",fixed_pubkey==0,
2545                                        "site",loc);
2546     if (st->peerkeys_path) {
2547         pathprefix_template_init(&st->peerkeys_tmpl,st->peerkeys_path,
2548                                  PEERKEYS_SUFFIX_MAXLEN + 1 /* nul */);
2549         st->peerkeys_current=keyset_load(st->peerkeys_path,
2550                                          &st->scratch,st->log,M_ERR,
2551                                          st->defhash);
2552         if (fixed_pubkey) {
2553             fixed_pubkey->dispose(fixed_pubkey->st);
2554         }
2555     } else {
2556         assert(fixed_pubkey);
2557         SETUP_SETHASH(fixed_pubkey);
2558         NEW(st->peerkeys_current);
2559         st->peerkeys_current->refcount=1;
2560         st->peerkeys_current->nkeys=1;
2561         st->peerkeys_current->keys[0].id=keyid_zero;
2562         st->peerkeys_current->keys[0].pubkey=fixed_pubkey;
2563         slog(st,LOG_SIGKEYS,
2564              "using old-style fixed peer public key (no `peer-keys')");
2565     }
2566
2567     st->addresses=dict_read_string_array(dict,"address",False,"site",loc,0);
2568     if (st->addresses)
2569         st->remoteport=dict_read_number(dict,"port",True,"site",loc,0);
2570     else st->remoteport=0;
2571
2572     GET_CLOSURE_LIST("transform",transforms,ntransforms,CL_TRANSFORM);
2573
2574     st->dh=find_cl_if(dict,"dh",CL_DH,True,"site",loc);
2575
2576 #define DEFAULT(D) (st->peer_mobile || st->local_mobile \
2577                     ? DEFAULT_MOBILE_##D : DEFAULT_##D)
2578 #define CFG_NUMBER(k,D) dict_read_number(dict,(k),False,"site",loc,DEFAULT(D));
2579
2580     st->key_lifetime=         CFG_NUMBER("key-lifetime",  KEY_LIFETIME);
2581     st->setup_retries=        CFG_NUMBER("setup-retries", SETUP_RETRIES);
2582     st->setup_retry_interval= CFG_NUMBER("setup-timeout", SETUP_RETRY_INTERVAL);
2583     st->wait_timeout_mean=    CFG_NUMBER("wait-time",     WAIT_TIME);
2584     st->mtu_target= dict_read_number(dict,"mtu-target",False,"site",loc,0);
2585
2586     st->mobile_peer_expiry= dict_read_number(
2587        dict,"mobile-peer-expiry",False,"site",loc,DEFAULT_MOBILE_PEER_EXPIRY);
2588
2589     const char *peerskey= st->peer_mobile
2590         ? "mobile-peers-max" : "static-peers-max";
2591     st->transport_peers_max= dict_read_number(
2592         dict,peerskey,False,"site",loc, st->addresses ? 4 : 3);
2593     if (st->transport_peers_max<1 ||
2594         st->transport_peers_max>MAX_PEER_ADDRS) {
2595         cfgfatal(loc,"site", "%s must be in range 1.."
2596                  STRING(MAX_PEER_ADDRS) "\n", peerskey);
2597     }
2598
2599     if (st->key_lifetime < DEFAULT(KEY_RENEGOTIATE_GAP)*2)
2600         st->key_renegotiate_time=st->key_lifetime/2;
2601     else
2602         st->key_renegotiate_time=st->key_lifetime-DEFAULT(KEY_RENEGOTIATE_GAP);
2603     st->key_renegotiate_time=dict_read_number(
2604         dict,"renegotiate-time",False,"site",loc,st->key_renegotiate_time);
2605     if (st->key_renegotiate_time > st->key_lifetime) {
2606         cfgfatal(loc,"site",
2607                  "renegotiate-time must be less than key-lifetime\n");
2608     }
2609
2610     st->log_events=string_list_to_word(dict_lookup(dict,"log-events"),
2611                                        log_event_table,"site");
2612
2613     st->resolving_count=0;
2614     st->allow_send_prod=0;
2615
2616     st->tunname=safe_malloc(strlen(st->localname)+strlen(st->remotename)+5,
2617                             "site_apply");
2618     sprintf(st->tunname,"%s<->%s",st->localname,st->remotename);
2619
2620     /* The information we expect to see in incoming messages of type 1 */
2621     /* fixme: lots of unchecked overflows here, but the results are only
2622        corrupted packets rather than undefined behaviour */
2623     st->our_name_later=(strcmp(st->localname,st->remotename)>0);
2624
2625     buffer_new(&st->buffer,SETUP_BUFFER_LEN);
2626
2627     buffer_new(&st->scratch,SETUP_BUFFER_LEN);
2628     BUF_ALLOC(&st->scratch,"site:scratch");
2629
2630     /* We are interested in poll(), but only for timeouts. We don't have
2631        any fds of our own. */
2632     register_for_poll(st, site_beforepoll, site_afterpoll, "site");
2633     st->timeout=0;
2634
2635     st->remote_capabilities=0;
2636     st->chosen_transform=0;
2637     st->current.key_timeout=0;
2638     st->auxiliary_key.key_timeout=0;
2639     transport_peers_clear(st,&st->peers);
2640     transport_peers_clear(st,&st->setup_peers);
2641     /* XXX mlock these */
2642     st->dhsecret=safe_malloc(st->dh->len,"site:dhsecret");
2643     st->sharedsecretlen=st->sharedsecretallocd=0;
2644     st->sharedsecret=0;
2645
2646 #define SET_CAPBIT(bit) do {                                            \
2647     uint32_t capflag = 1UL << (bit);                                    \
2648     if (st->local_capabilities & capflag)                               \
2649         slog(st,LOG_ERROR,"capability bit"                              \
2650              " %d (%#"PRIx32") reused", (bit), capflag);                \
2651     st->local_capabilities |= capflag;                                  \
2652 } while (0)
2653
2654     for (i=0; i<st->ntransforms; i++)
2655         SET_CAPBIT(st->transforms[i]->capab_bit);
2656
2657 #undef SET_CAPBIT
2658
2659     if (st->local_mobile || st->peer_mobile)
2660         st->local_capabilities |= CAPAB_PRIORITY_MOBILE;
2661
2662     /* We need to register the remote networks with the netlink device */
2663     uint32_t netlink_mtu; /* local virtual interface mtu */
2664     st->netlink->reg(st->netlink->st, site_outgoing, st, &netlink_mtu);
2665     if (!st->mtu_target)
2666         st->mtu_target=netlink_mtu;
2667     
2668     for (i=0; i<st->ncomms; i++)
2669         st->comms[i]->request_notify(st->comms[i]->st, st, site_incoming);
2670
2671     st->current.transform=0;
2672     st->auxiliary_key.transform=0;
2673     st->new_transform=0;
2674     st->auxiliary_is_new=0;
2675
2676     enter_state_stop(st);
2677
2678     add_hook(PHASE_SHUTDOWN,site_phase_hook,st);
2679     add_hook(PHASE_CHILDPERSIST,site_childpersist_clearkeys,st);
2680
2681     return new_closure(&st->cl);
2682 }
2683
2684 void site_module(dict_t *dict)
2685 {
2686     add_closure(dict,"site",site_apply);
2687 }
2688
2689
2690 /***** TRANSPORT PEERS definitions *****/
2691
2692 static void transport_peers_debug(struct site *st, transport_peers *dst,
2693                                   const char *didwhat,
2694                                   int nargs, const struct comm_addr *args,
2695                                   size_t stride) {
2696     int i;
2697     char *argp;
2698
2699     if (!(st->log_events & LOG_PEER_ADDRS))
2700         return; /* an optimisation */
2701
2702     slog(st, LOG_PEER_ADDRS, "peers (%s) %s nargs=%d => npeers=%d",
2703          (dst==&st->peers ? "data" :
2704           dst==&st->setup_peers ? "setup" : "UNKNOWN"),
2705          didwhat, nargs, dst->npeers);
2706
2707     for (i=0, argp=(void*)args;
2708          i<nargs;
2709          i++, (argp+=stride?stride:sizeof(*args))) {
2710         const struct comm_addr *ca=(void*)argp;
2711         slog(st, LOG_PEER_ADDRS, " args: addrs[%d]=%s",
2712              i, comm_addr_to_string(ca));
2713     }
2714     for (i=0; i<dst->npeers; i++) {
2715         struct timeval diff;
2716         timersub(tv_now,&dst->peers[i].last,&diff);
2717         const struct comm_addr *ca=&dst->peers[i].addr;
2718         slog(st, LOG_PEER_ADDRS, " peers: addrs[%d]=%s T-%ld.%06ld",
2719              i, comm_addr_to_string(ca),
2720              (unsigned long)diff.tv_sec, (unsigned long)diff.tv_usec);
2721     }
2722 }
2723
2724 static void transport_peers_expire(struct site *st, transport_peers *peers) {
2725     /* peers must be sorted first */
2726     int previous_peers=peers->npeers;
2727     struct timeval oldest;
2728     oldest.tv_sec  = tv_now->tv_sec - st->mobile_peer_expiry;
2729     oldest.tv_usec = tv_now->tv_usec;
2730     while (peers->npeers>1 &&
2731            timercmp(&peers->peers[peers->npeers-1].last, &oldest, <))
2732         peers->npeers--;
2733     if (peers->npeers != previous_peers)
2734         transport_peers_debug(st,peers,"expire", 0,0,0);
2735 }
2736
2737 static bool_t transport_peer_record_one(struct site *st, transport_peers *peers,
2738                                         const struct comm_addr *ca,
2739                                         const struct timeval *tv) {
2740     /* returns false if output is full */
2741     int search;
2742
2743     if (peers->npeers >= st->transport_peers_max)
2744         return 0;
2745
2746     for (search=0; search<peers->npeers; search++)
2747         if (comm_addr_equal(&peers->peers[search].addr, ca))
2748             return 1;
2749
2750     peers->peers[peers->npeers].addr = *ca;
2751     peers->peers[peers->npeers].last = *tv;
2752     peers->npeers++;
2753     return 1;
2754 }
2755
2756 static void transport_record_peers(struct site *st, transport_peers *peers,
2757                                    const struct comm_addr *addrs, int naddrs,
2758                                    const char *m) {
2759     /* We add addrs into peers.  The new entries end up at the front
2760      * and displace entries towards the end (perhaps even off the
2761      * end).  Any existing matching entries are moved up to the front.
2762      *
2763      * Caller must first call transport_peers_expire. */
2764
2765     if (naddrs==1) {
2766         /* avoids debug for uninteresting updates */
2767         int i;
2768         for (i=0; i<peers->npeers; i++) {
2769             if (comm_addr_equal(&addrs[0], &peers->peers[i].addr)) {
2770                 memmove(peers->peers+1, peers->peers,
2771                         sizeof(peers->peers[0]) * i);
2772                 peers->peers[0].addr = addrs[0];
2773                 peers->peers[0].last = *tv_now;
2774                 return;
2775             }
2776         }
2777     }
2778
2779     int old_npeers=peers->npeers;
2780     transport_peer old_peers[old_npeers];
2781     COPY_ARRAY(old_peers,peers->peers,old_npeers);
2782
2783     peers->npeers=0;
2784     int i;
2785     for (i=0; i<naddrs; i++) {
2786         if (!transport_peer_record_one(st,peers, &addrs[i], tv_now))
2787             break;
2788     }
2789     for (i=0; i<old_npeers; i++) {
2790         const transport_peer *old=&old_peers[i];
2791         if (!transport_peer_record_one(st,peers, &old->addr, &old->last))
2792             break;
2793     }
2794
2795     transport_peers_debug(st,peers,m, naddrs,addrs,0);
2796 }
2797
2798 static void transport_expire_record_peers(struct site *st,
2799                                           transport_peers *peers,
2800                                           const struct comm_addr *addrs,
2801                                           int naddrs, const char *m) {
2802     /* Convenience function */
2803     transport_peers_expire(st,peers);
2804     transport_record_peers(st,peers,addrs,naddrs,m);
2805 }
2806
2807 static bool_t transport_compute_setupinit_peers(struct site *st,
2808         const struct comm_addr *configured_addrs /* 0 if none or not found */,
2809         int n_configured_addrs /* 0 if none or not found */,
2810         const struct comm_addr *incoming_packet_addr /* 0 if none */) {
2811     if (!n_configured_addrs && !incoming_packet_addr &&
2812         !transport_peers_valid(&st->peers))
2813         return False;
2814
2815     slog(st,LOG_SETUP_INIT,
2816          "using: %d configured addr(s);%s %d old peer addrs(es)",
2817          n_configured_addrs,
2818          incoming_packet_addr ? " incoming packet address;" : "",
2819          st->peers.npeers);
2820
2821     /* Non-mobile peers try addresses until one is plausible.  The
2822      * effect is that this code always tries first the configured
2823      * address if supplied, or otherwise the address of the incoming
2824      * PROD, or finally the existing data peer if one exists; this is
2825      * as desired. */
2826
2827     transport_peers_copy(st,&st->setup_peers,&st->peers);
2828     transport_peers_expire(st,&st->setup_peers);
2829
2830     if (incoming_packet_addr)
2831         transport_record_peers(st,&st->setup_peers,
2832                                incoming_packet_addr,1, "incoming");
2833
2834     if (n_configured_addrs)
2835         transport_record_peers(st,&st->setup_peers,
2836                               configured_addrs,n_configured_addrs, "setupinit");
2837
2838     assert(transport_peers_valid(&st->setup_peers));
2839     return True;
2840 }
2841
2842 static void transport_setup_msgok(struct site *st, const struct comm_addr *a) {
2843     if (st->peer_mobile)
2844         transport_expire_record_peers(st,&st->setup_peers,a,1,"setupmsg");
2845 }
2846 static void transport_data_msgok(struct site *st, const struct comm_addr *a) {
2847     if (st->peer_mobile)
2848         transport_expire_record_peers(st,&st->peers,a,1,"datamsg");
2849 }
2850
2851 static int transport_peers_valid(transport_peers *peers) {
2852     return peers->npeers;
2853 }
2854 static void transport_peers_clear(struct site *st, transport_peers *peers) {
2855     peers->npeers= 0;
2856     transport_peers_debug(st,peers,"clear",0,0,0);
2857 }
2858 static void transport_peers_copy(struct site *st, transport_peers *dst,
2859                                  const transport_peers *src) {
2860     dst->npeers=src->npeers;
2861     COPY_ARRAY(dst->peers, src->peers, dst->npeers);
2862     transport_peers_debug(st,dst,"copy",
2863                           src->npeers, &src->peers->addr, sizeof(*src->peers));
2864 }
2865
2866 static void transport_resolve_complete(struct site *st,
2867                                        const struct comm_addr *addrs,
2868                                        int naddrs) {
2869     transport_expire_record_peers(st,&st->peers,addrs,naddrs,
2870                                   "resolved data");
2871     transport_expire_record_peers(st,&st->setup_peers,addrs,naddrs,
2872                                   "resolved setup");
2873 }
2874
2875 static void transport_resolve_complete_tardy(struct site *st,
2876                                              const struct comm_addr *addrs,
2877                                              int naddrs) {
2878     transport_expire_record_peers(st,&st->peers,addrs,naddrs,
2879                                   "resolved tardily");
2880 }
2881
2882 static void transport_peers__copy_by_mask(transport_peer *out, int *nout_io,
2883                                           unsigned mask,
2884                                           const transport_peers *inp) {
2885     /* out and in->peers may be the same region, or nonoverlapping */
2886     const transport_peer *in=inp->peers;
2887     int slot;
2888     for (slot=0; slot<inp->npeers; slot++) {
2889         if (!(mask & (1U << slot)))
2890             continue;
2891         if (!(out==in && slot==*nout_io))
2892             COPY_OBJ(out[*nout_io], in[slot]);
2893         (*nout_io)++;
2894     }
2895 }
2896
2897 void transport_xmit(struct site *st, transport_peers *peers,
2898                     struct buffer_if *buf, bool_t candebug) {
2899     int slot;
2900     transport_peers_expire(st, peers);
2901     unsigned failed=0; /* bitmask */
2902     assert(MAX_PEER_ADDRS < sizeof(unsigned)*CHAR_BIT);
2903
2904     int nfailed=0;
2905     for (slot=0; slot<peers->npeers; slot++) {
2906         transport_peer *peer=&peers->peers[slot];
2907         bool_t ok = comm_addr_sendmsg(st, &peer->addr, buf);
2908         if (candebug)
2909             dump_packet(st, buf, &peer->addr, False, ok);
2910         if (!ok) {
2911             failed |= 1U << slot;
2912             nfailed++;
2913         }
2914         if (ok && !st->peer_mobile)
2915             break;
2916     }
2917     /* Now we need to demote/delete failing addrs: if we are mobile we
2918      * merely demote them; otherwise we delete them. */
2919     if (st->local_mobile) {
2920         unsigned expected = ((1U << nfailed)-1) << (peers->npeers-nfailed);
2921         /* `expected' has all the failures at the end already */
2922         if (failed != expected) {
2923             int fslot=0;
2924             transport_peer failedpeers[nfailed];
2925             transport_peers__copy_by_mask(failedpeers, &fslot, failed,peers);
2926             assert(fslot == nfailed);
2927             int wslot=0;
2928             transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers);
2929             assert(wslot+nfailed == peers->npeers);
2930             COPY_ARRAY(peers->peers+wslot, failedpeers, nfailed);
2931             transport_peers_debug(st,peers,"mobile failure reorder",0,0,0);
2932         }
2933     } else {
2934         if (failed && peers->npeers > 1) {
2935             int wslot=0;
2936             transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers);
2937             peers->npeers=wslot;
2938             transport_peers_debug(st,peers,"non-mobile failure cleanup",0,0,0);
2939         }
2940     }
2941 }
2942
2943 /***** END of transport peers declarations *****/