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