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