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