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