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