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