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