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