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