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