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