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