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