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