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