chiark / gitweb /
site: Update peer keys from ~update file
[secnet.git] / site.c
1 /* site.c - manage communication with a remote network site */
2
3 /*
4  * This file is part of secnet.
5  * See README for full list of copyright holders.
6  *
7  * secnet is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  * 
12  * secnet is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  * 
17  * You should have received a copy of the GNU General Public License
18  * version 3 along with secnet; if not, see
19  * https://www.gnu.org/licenses/gpl.html.
20  */
21
22 /* The 'site' code doesn't know anything about the structure of the
23    packets it's transmitting.  In fact, under the new netlink
24    configuration scheme it doesn't need to know anything at all about
25    IP addresses, except how to contact its peer.  This means it could
26    potentially be used to tunnel other protocols too (IPv6, IPX, plain
27    old Ethernet frames) if appropriate netlink code can be written
28    (and that ought not to be too hard, eg. using the TUN/TAP device to
29    pretend to be an Ethernet interface).  */
30
31 /* At some point in the future the netlink code will be asked for
32    configuration information to go in the PING/PONG packets at the end
33    of the key exchange. */
34
35 #include "secnet.h"
36 #include <stdio.h>
37 #include <string.h>
38 #include <limits.h>
39 #include <assert.h>
40 #include <sys/socket.h>
41
42 #include <sys/mman.h>
43 #include "util.h"
44 #include "unaligned.h"
45 #include "magic.h"
46 #include "pubkeys.h"
47
48 #define SETUP_BUFFER_LEN 2048
49
50 #define DEFAULT_KEY_LIFETIME                  (3600*1000) /* [ms] */
51 #define DEFAULT_KEY_RENEGOTIATE_GAP           (5*60*1000) /* [ms] */
52 #define DEFAULT_SETUP_RETRIES 5
53 #define DEFAULT_SETUP_RETRY_INTERVAL             (2*1000) /* [ms] */
54 #define DEFAULT_WAIT_TIME                       (20*1000) /* [ms] */
55
56 #define DEFAULT_MOBILE_KEY_LIFETIME      (2*24*3600*1000) /* [ms] */
57 #define DEFAULT_MOBILE_KEY_RENEGOTIATE_GAP (12*3600*1000) /* [ms] */
58 #define DEFAULT_MOBILE_SETUP_RETRIES 30
59 #define DEFAULT_MOBILE_SETUP_RETRY_INTERVAL      (1*1000) /* [ms] */
60 #define DEFAULT_MOBILE_WAIT_TIME                (10*1000) /* [ms] */
61
62 #define DEFAULT_MOBILE_PEER_EXPIRY            (2*60)      /* [s] */
63
64 #define PEERKEYS_SUFFIX_MAXLEN (sizeof("~incoming")-1)
65
66 /* Each site can be in one of several possible states. */
67
68 /* States:
69    SITE_STOP         - nothing is allowed to happen; tunnel is down;
70                        all session keys have been erased
71      -> SITE_RUN upon external instruction
72    SITE_RUN          - site up, maybe with valid key
73      -> SITE_RESOLVE upon outgoing packet and no valid key
74          we start name resolution for the other end of the tunnel
75      -> SITE_SENTMSG2 upon valid incoming message 1 and suitable time
76          we send an appropriate message 2
77    SITE_RESOLVE      - waiting for name resolution
78      -> SITE_SENTMSG1 upon successful resolution
79          we send an appropriate message 1
80      -> SITE_SENTMSG2 upon valid incoming message 1 (then abort resolution)
81          we abort resolution and 
82      -> SITE_WAIT on timeout or resolution failure
83    SITE_SENTMSG1
84      -> SITE_SENTMSG2 upon valid incoming message 1 from higher priority end
85      -> SITE_SENTMSG3 upon valid incoming message 2
86      -> SITE_WAIT on timeout
87    SITE_SENTMSG2
88      -> SITE_SENTMSG4 upon valid incoming message 3
89      -> SITE_WAIT on timeout
90    SITE_SENTMSG3
91      -> SITE_SENTMSG5 upon valid incoming message 4
92      -> SITE_WAIT on timeout
93    SITE_SENTMSG4
94      -> SITE_RUN upon valid incoming message 5
95      -> SITE_WAIT on timeout
96    SITE_SENTMSG5
97      -> SITE_RUN upon valid incoming message 6
98      -> SITE_WAIT on timeout
99    SITE_WAIT         - failed to establish key; do nothing for a while
100      -> SITE_RUN on timeout
101    */
102
103 #define SITE_STOP     0
104 #define SITE_RUN      1
105 #define SITE_RESOLVE  2
106 #define SITE_SENTMSG1 3
107 #define SITE_SENTMSG2 4
108 #define SITE_SENTMSG3 5
109 #define SITE_SENTMSG4 6
110 #define SITE_SENTMSG5 7
111 #define SITE_WAIT     8
112
113 #define CASES_MSG3_KNOWN LABEL_MSG3: case LABEL_MSG3BIS
114
115 struct msg;
116
117 int32_t site_max_start_pad = 4*4;
118
119 static cstring_t state_name(uint32_t state)
120 {
121     switch (state) {
122     case 0: return "STOP";
123     case 1: return "RUN";
124     case 2: return "RESOLVE";
125     case 3: return "SENTMSG1";
126     case 4: return "SENTMSG2";
127     case 5: return "SENTMSG3";
128     case 6: return "SENTMSG4";
129     case 7: return "SENTMSG5";
130     case 8: return "WAIT";
131     default: return "*bad state*";
132     }
133 }
134
135 #define NONCELEN 8
136
137 #define LOG_UNEXPECTED    0x00000001
138 #define LOG_SETUP_INIT    0x00000002
139 #define LOG_SETUP_TIMEOUT 0x00000004
140 #define LOG_ACTIVATE_KEY  0x00000008
141 #define LOG_TIMEOUT_KEY   0x00000010
142 #define LOG_SEC           0x00000020
143 #define LOG_STATE         0x00000040
144 #define LOG_DROP          0x00000080
145 #define LOG_DUMP          0x00000100
146 #define LOG_ERROR         0x00000400
147 #define LOG_PEER_ADDRS    0x00000800
148 #define LOG_SIGKEYS       0x00001000
149
150 static struct flagstr log_event_table[]={
151     { "unexpected", LOG_UNEXPECTED },
152     { "setup-init", LOG_SETUP_INIT },
153     { "setup-timeout", LOG_SETUP_TIMEOUT },
154     { "activate-key", LOG_ACTIVATE_KEY },
155     { "timeout-key", LOG_TIMEOUT_KEY },
156     { "security", LOG_SEC },
157     { "state-change", LOG_STATE },
158     { "packet-drop", LOG_DROP },
159     { "dump-packets", LOG_DUMP },
160     { "errors", LOG_ERROR },
161     { "peer-addrs", LOG_PEER_ADDRS },
162     { "sigkeys", LOG_SIGKEYS },
163     { "default", LOG_SETUP_INIT|LOG_SETUP_TIMEOUT|
164       LOG_ACTIVATE_KEY|LOG_TIMEOUT_KEY|LOG_SEC|LOG_ERROR|LOG_SIGKEYS },
165     { "all", 0xffffffff },
166     { NULL, 0 }
167 };
168
169
170 /***** TRANSPORT PEERS declarations *****/
171
172 /* Details of "mobile peer" semantics:
173
174    - We use the same data structure for the different configurations,
175      but manage it with different algorithms.
176    
177    - We record up to mobile_peers_max peer address/port numbers
178      ("peers") for key setup, and separately up to mobile_peers_max
179      for data transfer.
180
181    - In general, we make a new set of addrs (see below) when we start
182      a new key exchange; the key setup addrs become the data transport
183      addrs when key setup complets.
184
185    If our peer is mobile:
186
187    - We send to all recent addresses of incoming packets, plus
188      initially all configured addresses (which we also expire).
189
190    - So, we record addrs of good incoming packets, as follows:
191       1. expire any peers last seen >120s ("mobile-peer-expiry") ago
192       2. add the peer of the just received packet to the applicable list
193          (possibly evicting the oldest entries to make room)
194      NB that we do not expire peers until an incoming packet arrives.
195
196    - If the peer has a configured address or name, we record them the
197      same way, but only as a result of our own initiation of key
198      setup.  (We might evict some incoming packet addrs to make room.)
199
200    - The default number of addrs to keep is 3, or 4 if we have a
201      configured name or address.  That's space for two configured
202      addresses (one IPv6 and one IPv4), plus two received addresses.
203
204    - Outgoing packets are sent to every recorded address in the
205      applicable list.  Any unsupported[1] addresses are deleted from
206      the list right away.  (This should only happen to configured
207      addresses, of course, but there is no need to check that.)
208
209    - When we successfully complete a key setup, we merge the key setup
210      peers into the data transfer peers.
211
212    [1] An unsupported address is one for whose AF we don't have a
213      socket (perhaps because we got EAFNOSUPPORT or some such) or for
214      which sendto gives ENETUNREACH.
215
216    If neither end is mobile:
217
218    - When peer initiated the key exchange, we use the incoming packet
219      address.
220
221    - When we initiate the key exchange, we try configured addresses
222      until we get one which isn't unsupported then fixate on that.
223
224    - When we complete a key setup, we replace the data transport peers
225      with those from the key setup.
226
227    If we are mobile:
228
229    - We can't tell when local network setup changes so we can't cache
230      the unsupported addrs and completely remove the spurious calls to
231      sendto, but we can optimise things a bit by deprioritising addrs
232      which seem to be unsupported.
233
234    - Use only configured addresses.  (Except, that if our peer
235      initiated a key exchange we use the incoming packet address until
236      our name resolution completes.)
237
238    - When we send a packet, try each address in turn; if addr
239      supported, put that address to the end of the list for future
240      packets, and go onto the next address.
241
242    - When we complete a key setup, we replace the data transport peers
243      with those from the key setup.
244
245    */
246
247 typedef struct {
248     struct timeval last;
249     struct comm_addr addr;
250 } transport_peer;
251
252 typedef struct {
253 /* configuration information */
254 /* runtime information */
255     int npeers;
256     transport_peer peers[MAX_PEER_ADDRS];
257 } transport_peers;
258
259 /* Basic operations on transport peer address sets */
260 static void transport_peers_clear(struct site *st, transport_peers *peers);
261 static int transport_peers_valid(transport_peers *peers);
262 static void transport_peers_copy(struct site *st, transport_peers *dst,
263                                  const transport_peers *src);
264
265 /* Record address of incoming setup packet; resp. data packet. */
266 static void transport_setup_msgok(struct site *st, const struct comm_addr *a);
267 static void transport_data_msgok(struct site *st, const struct comm_addr *a);
268
269 /* Initialise the setup addresses.  Called before we send the first
270  * packet in a key exchange.  If we are the initiator, as a result of
271  * resolve completing (or being determined not to be relevant) or an
272  * incoming PROD; if we are the responder, as a result of the MSG1. */
273 static bool_t transport_compute_setupinit_peers(struct site *st,
274         const struct comm_addr *configured_addrs /* 0 if none or not found */,
275         int n_configured_addrs /* 0 if none or not found */,
276         const struct comm_addr *incoming_packet_addr /* 0 if none */);
277
278 /* Called if we are the responder in a key setup, when the resolve
279  * completes.  transport_compute_setupinit_peers will hvae been called
280  * earlier.  If _complete is called, we are still doing the key setup
281  * (and we should use the new values for both the rest of the key
282  * setup and the ongoing data exchange); if _tardy is called, the key
283  * setup is done (either completed or not) and only the data peers are
284  * relevant */
285 static void transport_resolve_complete(struct site *st,
286         const struct comm_addr *addrs, int naddrs);
287 static void transport_resolve_complete_tardy(struct site *st,
288         const struct comm_addr *addrs, int naddrs);
289
290 static void transport_xmit(struct site *st, transport_peers *peers,
291                            struct buffer_if *buf, bool_t candebug);
292
293  /***** END of transport peers declarations *****/
294
295
296 struct data_key {
297     struct transform_inst_if *transform;
298     uint64_t key_timeout; /* End of life of current key */
299     uint32_t remote_session_id;
300 };
301
302 struct site {
303     closure_t cl;
304     struct site_if ops;
305 /* configuration information */
306     string_t localname;
307     string_t remotename;
308     bool_t keepalive;
309     bool_t local_mobile, peer_mobile; /* Mobile client support */
310     int32_t transport_peers_max;
311     string_t tunname; /* localname<->remotename by default, used in logs */
312     cstring_t *addresses; /* DNS name or address(es) for bootstrapping, optional */
313     int remoteport; /* Port for bootstrapping, optional */
314     uint32_t mtu_target;
315     struct netlink_if *netlink;
316     struct comm_if **comms;
317     struct comm_clientinfo **commclientinfos;
318     int ncomms;
319     struct resolver_if *resolver;
320     struct log_if *log;
321     struct random_if *random;
322     struct privcache_if *privkeys;
323     struct sigprivkey_if *privkey_fixed;
324     struct transform_if **transforms;
325     int ntransforms;
326     struct dh_if *dh;
327
328     uint32_t index; /* Index of this site */
329     uint32_t early_capabilities;
330     uint32_t local_capabilities;
331     int32_t setup_retries; /* How many times to send setup packets */
332     int32_t setup_retry_interval; /* Initial timeout for setup packets */
333     int32_t wait_timeout_mean; /* How long to wait if setup unsuccessful */
334     int32_t mobile_peer_expiry; /* How long to remember 2ary addresses */
335     int32_t key_lifetime; /* How long a key lasts once set up */
336     int32_t key_renegotiate_time; /* If we see traffic (or a keepalive)
337                                       after this time, initiate a new
338                                       key exchange */
339
340     bool_t our_name_later; /* our name > peer name */
341     uint32_t log_events;
342
343 /* runtime information */
344     uint32_t state;
345     uint64_t now; /* Most recently seen time */
346     bool_t allow_send_prod;
347     bool_t msg1_crossed_logged;
348     int resolving_count;
349     int resolving_n_results_all;
350     int resolving_n_results_stored;
351     struct comm_addr resolving_results[MAX_PEER_ADDRS];
352     const char *peerkeys_path;
353     struct pathprefix_template peerkeys_tmpl;
354     struct peer_keyset *peerkeys_current, *peerkeys_kex;
355
356     /* The currently established session */
357     struct data_key current;
358     struct data_key auxiliary_key;
359     bool_t auxiliary_is_new;
360     uint64_t renegotiate_key_time; /* When we can negotiate a new key */
361     uint64_t auxiliary_renegotiate_key_time;
362     transport_peers peers; /* Current address(es) of peer for data traffic */
363
364     /* The current key setup protocol exchange.  We can only be
365        involved in one of these at a time.  There's a potential for
366        denial of service here (the attacker keeps sending a setup
367        packet; we keep trying to continue the exchange, and have to
368        timeout before we can listen for another setup packet); perhaps
369        we should keep a list of 'bad' sources for setup packets. */
370     uint32_t remote_capabilities;
371     uint16_t remote_adv_mtu;
372     struct transform_if *chosen_transform;
373     uint32_t setup_session_id;
374     transport_peers setup_peers;
375     uint8_t localN[NONCELEN]; /* Nonces for key exchange */
376     uint8_t remoteN[NONCELEN];
377     struct buffer_if buffer; /* Current outgoing key exchange packet */
378     struct buffer_if scratch;
379     int32_t retries; /* Number of retries remaining */
380     uint64_t timeout; /* Timeout for current state */
381     uint8_t *dhsecret;
382     uint8_t *sharedsecret;
383     uint32_t sharedsecretlen, sharedsecretallocd;
384     struct transform_inst_if *new_transform; /* For key setup/verify */
385 };
386
387 static uint32_t event_log_priority(struct site *st, uint32_t event)
388 {
389     if (!(event&st->log_events))
390         return 0;
391     switch(event) {
392     case LOG_UNEXPECTED:    return M_INFO;
393     case LOG_SETUP_INIT:    return M_INFO;
394     case LOG_SETUP_TIMEOUT: return M_NOTICE;
395     case LOG_ACTIVATE_KEY:  return M_INFO;
396     case LOG_TIMEOUT_KEY:   return M_INFO;
397     case LOG_SEC:           return M_SECURITY;
398     case LOG_STATE:         return M_DEBUG;
399     case LOG_DROP:          return M_DEBUG;
400     case LOG_DUMP:          return M_DEBUG;
401     case LOG_ERROR:         return M_ERR;
402     case LOG_PEER_ADDRS:    return M_DEBUG;
403     case LOG_SIGKEYS:       return M_INFO;
404     default:                return M_ERR;
405     }
406 }
407
408 static uint32_t slog_start(struct site *st, uint32_t event)
409 {
410     uint32_t class=event_log_priority(st, event);
411     if (class) {
412         slilog_part(st->log,class,"%s: ",st->tunname);
413     }
414     return class;
415 }
416
417 static void vslog(struct site *st, uint32_t event, cstring_t msg, va_list ap)
418 FORMAT(printf,3,0);
419 static void vslog(struct site *st, uint32_t event, cstring_t msg, va_list ap)
420 {
421     uint32_t class;
422
423     class=slog_start(st,event);
424     if (class) {
425         vslilog_part(st->log,class,msg,ap);
426         slilog_part(st->log,class,"\n");
427     }
428 }
429
430 static void slog(struct site *st, uint32_t event, cstring_t msg, ...)
431 FORMAT(printf,3,4);
432 static void slog(struct site *st, uint32_t event, cstring_t msg, ...)
433 {
434     va_list ap;
435     va_start(ap,msg);
436     vslog(st,event,msg,ap);
437     va_end(ap);
438 }
439
440 static void logtimeout(struct site *st, const char *fmt, ...)
441 FORMAT(printf,2,3);
442 static void logtimeout(struct site *st, const char *fmt, ...)
443 {
444     uint32_t class=event_log_priority(st,LOG_SETUP_TIMEOUT);
445     if (!class)
446         return;
447
448     va_list ap;
449     va_start(ap,fmt);
450
451     slilog_part(st->log,class,"%s: ",st->tunname);
452     vslilog_part(st->log,class,fmt,ap);
453
454     const char *delim;
455     int i;
456     for (i=0, delim=" (tried ";
457          i<st->setup_peers.npeers;
458          i++, delim=", ") {
459         transport_peer *peer=&st->setup_peers.peers[i];
460         const char *s=comm_addr_to_string(&peer->addr);
461         slilog_part(st->log,class,"%s%s",delim,s);
462     }
463
464     slilog_part(st->log,class,")\n");
465     va_end(ap);
466 }
467
468 static void set_link_quality(struct site *st);
469 static void delete_keys(struct site *st, cstring_t reason, uint32_t loglevel);
470 static void delete_one_key(struct site *st, struct data_key *key,
471                            const char *reason /* may be 0 meaning don't log*/,
472                            const char *which /* ignored if !reasonn */,
473                            uint32_t loglevel /* ignored if !reasonn */);
474 static bool_t initiate_key_setup(struct site *st, cstring_t reason,
475                                  const struct comm_addr *prod_hint);
476 static void enter_state_run(struct site *st);
477 static bool_t enter_state_resolve(struct site *st);
478 static void decrement_resolving_count(struct site *st, int by);
479 static bool_t enter_new_state(struct site *st,uint32_t next,
480                               const struct msg *prompt
481                               /* may be 0 for SENTMSG1 */);
482 static void enter_state_wait(struct site *st);
483 static void activate_new_key(struct site *st);
484
485 static bool_t is_transform_valid(struct transform_inst_if *transform)
486 {
487     return transform && transform->valid(transform->st);
488 }
489
490 static bool_t current_valid(struct site *st)
491 {
492     return is_transform_valid(st->current.transform);
493 }
494
495 #define DEFINE_CALL_TRANSFORM(fwdrev)                                   \
496 static transform_apply_return                                           \
497 call_transform_##fwdrev(struct site *st,                                \
498                                    struct transform_inst_if *transform, \
499                                    struct buffer_if *buf,               \
500                                    const char **errmsg)                 \
501 {                                                                       \
502     if (!is_transform_valid(transform)) {                               \
503         *errmsg="transform not set up";                                 \
504         return transform_apply_err;                                     \
505     }                                                                   \
506     return transform->fwdrev(transform->st,buf,errmsg);                 \
507 }
508
509 DEFINE_CALL_TRANSFORM(forwards)
510 DEFINE_CALL_TRANSFORM(reverse)
511
512 static void dispose_transform(struct transform_inst_if **transform_var)
513 {
514     struct transform_inst_if *transform=*transform_var;
515     if (transform) {
516         transform->delkey(transform->st);
517         transform->destroy(transform->st);
518     }
519     *transform_var = 0;
520 }    
521
522 #define CHECK_AVAIL(b,l) do { if ((b)->size<(l)) return False; } while(0)
523 #define CHECK_EMPTY(b) do { if ((b)->size!=0) return False; } while(0)
524 #define CHECK_TYPE(b,t) do { uint32_t type; \
525     CHECK_AVAIL((b),4); \
526     type=buf_unprepend_uint32((b)); \
527     if (type!=(t)) return False; } while(0)
528
529 static _Bool type_is_msg23(uint32_t type)
530 {
531     switch (type) {
532         case LABEL_MSG2: case CASES_MSG3_KNOWN: return True;
533         default: return False;
534     }
535 }
536 static _Bool type_is_msg34(uint32_t type)
537 {
538     switch (type) {
539         case CASES_MSG3_KNOWN: case LABEL_MSG4: return True;
540         default: return False;
541     }
542 }
543
544 struct parsedname {
545     int32_t len;
546     uint8_t *name;
547     struct buffer_if extrainfo;
548 };
549
550 struct msg {
551     uint8_t *hashstart;
552     uint32_t dest;
553     uint32_t source;
554     struct parsedname remote;
555     struct parsedname local;
556     uint32_t remote_capabilities;
557     uint16_t remote_mtu;
558     int capab_transformnum;
559     uint8_t *nR;
560     uint8_t *nL;
561     int32_t pklen;
562     char *pk;
563     int32_t hashlen;
564     struct alg_msg_data sig;
565     int n_pubkeys_accepted_nom; /* may be > MAX_SIG_KEYS ! */
566     const struct sigkeyid *pubkeys_accepted[MAX_SIG_KEYS];
567     int signing_key_index;
568 };
569
570 static const struct sigkeyid keyid_zero;
571
572 static int32_t wait_timeout(struct site *st) {
573     int32_t t = st->wait_timeout_mean;
574     int8_t factor;
575     if (t < INT_MAX/2) {
576         st->random->generate(st->random->st,sizeof(factor),&factor);
577         t += (t / 256) * factor;
578     }
579     return t;
580 }
581
582 static _Bool set_new_transform(struct site *st, char *pk)
583 {
584     _Bool ok;
585
586     /* Make room for the shared key */
587     st->sharedsecretlen=st->chosen_transform->keylen?:st->dh->ceil_len;
588     assert(st->sharedsecretlen);
589     if (st->sharedsecretlen > st->sharedsecretallocd) {
590         st->sharedsecretallocd=st->sharedsecretlen;
591         st->sharedsecret=safe_realloc_ary(st->sharedsecret,1,
592                                           st->sharedsecretallocd,
593                                           "site:sharedsecret");
594     }
595
596     /* Generate the shared key */
597     st->dh->makeshared(st->dh->st,st->dhsecret,st->dh->len,pk,
598                        st->sharedsecret,st->sharedsecretlen);
599
600     /* Set up the transform */
601     struct transform_if *generator=st->chosen_transform;
602     struct transform_inst_if *generated=generator->create(generator->st);
603     ok = generated->setkey(generated->st,st->sharedsecret,
604                            st->sharedsecretlen,st->our_name_later);
605
606     dispose_transform(&st->new_transform);
607     if (!ok) return False;
608     st->new_transform=generated;
609
610     slog(st,LOG_SETUP_INIT,"key exchange negotiated transform"
611          " %d (capabilities ours=%#"PRIx32" theirs=%#"PRIx32")",
612          st->chosen_transform->capab_bit,
613          st->local_capabilities, st->remote_capabilities);
614     return True;
615 }
616
617 struct xinfoadd {
618     int32_t lenpos, afternul;
619 };
620 static void append_string_xinfo_start(struct buffer_if *buf,
621                                       struct xinfoadd *xia,
622                                       const char *str)
623     /* Helps construct one of the names with additional info as found
624      * in MSG1..4.  Call this function first, then append all the
625      * desired extra info (not including the nul byte) to the buffer,
626      * then call append_string_xinfo_done. */
627 {
628     xia->lenpos = buf->size;
629     buf_append_string(buf,str);
630     buf_append_uint8(buf,0);
631     xia->afternul = buf->size;
632 }
633 static void append_string_xinfo_done(struct buffer_if *buf,
634                                      struct xinfoadd *xia)
635 {
636     /* we just need to adjust the string length */
637     if (buf->size == xia->afternul) {
638         /* no extra info, strip the nul too */
639         buf_unappend_uint8(buf);
640     } else {
641         put_uint16(buf->start+xia->lenpos, buf->size-(xia->lenpos+2));
642     }
643 }
644
645 /* Build any of msg1 to msg4. msg5 and msg6 are built from the inside
646    out using a transform of config data supplied by netlink */
647 static bool_t generate_msg(struct site *st, uint32_t type, cstring_t what,
648                            const struct msg *prompt
649                            /* may be 0 for MSG1 */)
650 {
651     string_t dhpub;
652     unsigned minor;
653     int ki;
654
655     st->retries=st->setup_retries;
656     BUF_ALLOC(&st->buffer,what);
657     buffer_init(&st->buffer,0);
658     buf_append_uint32(&st->buffer,
659         (type==LABEL_MSG1?0:st->setup_session_id));
660     buf_append_uint32(&st->buffer,st->index);
661     buf_append_uint32(&st->buffer,type);
662
663     struct xinfoadd xia;
664     append_string_xinfo_start(&st->buffer,&xia,st->localname);
665     if ((st->local_capabilities & st->early_capabilities) ||
666         (type != LABEL_MSG1)) {
667         buf_append_uint32(&st->buffer,st->local_capabilities);
668     }
669     if (type_is_msg34(type)) {
670         buf_append_uint16(&st->buffer,st->mtu_target);
671     }
672     if (type_is_msg23(type)) {
673         buf_append_uint8(&st->buffer,st->peerkeys_kex->nkeys);
674         for (ki=0; ki<st->peerkeys_kex->nkeys; ki++) {
675             struct peer_pubkey *pk = &st->peerkeys_kex->keys[ki];
676             BUF_ADD_OBJ(append,&st->buffer,pk->id);
677         }
678     }
679     struct sigprivkey_if *privkey=0;
680     if (type_is_msg34(type)) {
681         assert(prompt->n_pubkeys_accepted_nom>0);
682         for (ki=0;
683              ki<prompt->n_pubkeys_accepted_nom && ki<MAX_SIG_KEYS;
684              ki++) {
685             const struct sigkeyid *kid=prompt->pubkeys_accepted[ki];
686             if (st->privkeys) {
687                 privkey=st->privkeys->lookup(st->privkeys->st,kid,st->log);
688                 if (privkey) goto privkey_found;
689             } else {
690                 if (sigkeyid_equal(&keyid_zero,kid)) {
691                     privkey=st->privkey_fixed;
692                     goto privkey_found;
693                 }
694             }
695         }
696         uint32_t class = slog_start(st,LOG_ERROR);
697         if (class) {
698             slilog_part(st->log,class,"no suitable private key, peer wanted");
699             for (ki=0;
700                  ki<prompt->n_pubkeys_accepted_nom && ki<MAX_SIG_KEYS;
701                  ki++) {
702                 slilog_part(st->log,class, " " SIGKEYID_PR_FMT,
703                             SIGKEYID_PR_VAL(prompt->pubkeys_accepted[ki]));
704             }
705             if (prompt->n_pubkeys_accepted_nom > MAX_SIG_KEYS)
706                 slilog_part(st->log,class," +%d",
707                             prompt->n_pubkeys_accepted_nom - MAX_SIG_KEYS);
708             slilog_part(st->log,class,"\n");
709         }
710         return False;
711
712     privkey_found:
713         buf_append_uint8(&st->buffer,ki);
714     }
715
716     append_string_xinfo_done(&st->buffer,&xia);
717
718     buf_append_string(&st->buffer,st->remotename);
719     BUF_ADD_OBJ(append,&st->buffer,st->localN);
720     if (type==LABEL_MSG1) return True;
721     BUF_ADD_OBJ(append,&st->buffer,st->remoteN);
722     if (type==LABEL_MSG2) return True;
723
724     if (hacky_par_mid_failnow()) return False;
725
726     if (MSGMAJOR(type) == 3) do {
727         minor = MSGMINOR(type);
728         if (minor < 1) break;
729         buf_append_uint8(&st->buffer,st->chosen_transform->capab_bit);
730     } while (0);
731
732     dhpub=st->dh->makepublic(st->dh->st,st->dhsecret,st->dh->len);
733     buf_append_string(&st->buffer,dhpub);
734     free(dhpub);
735
736     bool_t ok=privkey->sign(privkey->st,
737                             st->buffer.start,
738                             st->buffer.size,
739                             &st->buffer);
740     if (!ok) goto fail;
741     return True;
742
743  fail:
744     return False;
745 }
746
747 static bool_t unpick_name(struct buffer_if *msg, struct parsedname *nm)
748 {
749     CHECK_AVAIL(msg,2);
750     nm->len=buf_unprepend_uint16(msg);
751     CHECK_AVAIL(msg,nm->len);
752     nm->name=buf_unprepend(msg,nm->len);
753     uint8_t *nul=memchr(nm->name,0,nm->len);
754     if (!nul) {
755         buffer_readonly_view(&nm->extrainfo,0,0);
756     } else {
757         buffer_readonly_view(&nm->extrainfo, nul+1, msg->start-(nul+1));
758         nm->len=nul-nm->name;
759     }
760     return True;
761 }
762
763 static bool_t unpick_msg(struct site *st, uint32_t type,
764                          struct buffer_if *msg, struct msg *m)
765 {
766     unsigned minor;
767
768     m->n_pubkeys_accepted_nom=-1;
769     m->capab_transformnum=-1;
770     m->signing_key_index=-1;
771     m->hashstart=msg->start;
772     CHECK_AVAIL(msg,4);
773     m->dest=buf_unprepend_uint32(msg);
774     CHECK_AVAIL(msg,4);
775     m->source=buf_unprepend_uint32(msg);
776     CHECK_TYPE(msg,type);
777     if (!unpick_name(msg,&m->remote)) return False;
778     m->remote_capabilities=0;
779     m->remote_mtu=0;
780     if (m->remote.extrainfo.size) {
781         CHECK_AVAIL(&m->remote.extrainfo,4);
782         m->remote_capabilities=buf_unprepend_uint32(&m->remote.extrainfo);
783     }
784     if (type_is_msg34(type) && m->remote.extrainfo.size) {
785         CHECK_AVAIL(&m->remote.extrainfo,2);
786         m->remote_mtu=buf_unprepend_uint16(&m->remote.extrainfo);
787     }
788     if (type_is_msg23(type) && m->remote.extrainfo.size) {
789         m->n_pubkeys_accepted_nom = buf_unprepend_uint8(&m->remote.extrainfo);
790         if (!m->n_pubkeys_accepted_nom) return False;
791         for (int ki_nom=0; ki_nom<m->n_pubkeys_accepted_nom; ki_nom++) {
792             CHECK_AVAIL(&m->remote.extrainfo,KEYIDSZ);
793             struct sigkeyid *kid = buf_unprepend(&m->remote.extrainfo,KEYIDSZ);
794             if (ki_nom<MAX_SIG_KEYS) m->pubkeys_accepted[ki_nom] = kid;
795         }
796     } else {
797         m->n_pubkeys_accepted_nom = 1;
798         m->pubkeys_accepted[0] = &keyid_zero;
799     }
800     if (type_is_msg34(type) && m->remote.extrainfo.size) {
801         m->signing_key_index=buf_unprepend_uint8(&m->remote.extrainfo);
802     } else {
803         m->signing_key_index=0;
804     }
805     if (!unpick_name(msg,&m->local)) return False;
806     if (type==LABEL_PROD) {
807         CHECK_EMPTY(msg);
808         return True;
809     }
810     CHECK_AVAIL(msg,NONCELEN);
811     m->nR=buf_unprepend(msg,NONCELEN);
812     if (type==LABEL_MSG1) {
813         CHECK_EMPTY(msg);
814         return True;
815     }
816     CHECK_AVAIL(msg,NONCELEN);
817     m->nL=buf_unprepend(msg,NONCELEN);
818     if (type==LABEL_MSG2) {
819         CHECK_EMPTY(msg);
820         return True;
821     }
822     if (MSGMAJOR(type) == 3) do {
823         minor = MSGMINOR(type);
824 #define MAYBE_READ_CAP(minminor, kind, dflt) do {                       \
825     if (minor < (minminor))                                             \
826         m->capab_##kind##num = (dflt);                                  \
827     else {                                                              \
828         CHECK_AVAIL(msg, 1);                                            \
829         m->capab_##kind##num = buf_unprepend_uint8(msg);                \
830     }                                                                   \
831 } while (0)
832         MAYBE_READ_CAP(1, transform, CAPAB_BIT_ANCIENTTRANSFORM);
833 #undef MAYBE_READ_CAP
834     } while (0);
835     CHECK_AVAIL(msg,2);
836     m->pklen=buf_unprepend_uint16(msg);
837     CHECK_AVAIL(msg,m->pklen);
838     m->pk=buf_unprepend(msg,m->pklen);
839     m->hashlen=msg->start-m->hashstart;
840
841     if (m->signing_key_index < 0 ||
842         m->signing_key_index >= st->peerkeys_kex->nkeys) {
843         return False;
844     }
845     struct sigpubkey_if *pubkey=
846         st->peerkeys_kex->keys[m->signing_key_index].pubkey;
847     if (!pubkey->unpick(pubkey->st,msg,&m->sig)) {
848         return False;
849     }
850
851     CHECK_EMPTY(msg);
852
853     return True;
854 }
855
856 static bool_t name_matches(const struct parsedname *nm, const char *expected)
857 {
858     int expected_len=strlen(expected);
859     return
860         nm->len == expected_len &&
861         !memcmp(nm->name, expected, expected_len);
862 }    
863
864 static bool_t check_msg(struct site *st, uint32_t type, struct msg *m,
865                         cstring_t *error)
866 {
867     if (type==LABEL_MSG1) return True;
868
869     /* Check that the site names and our nonce have been sent
870        back correctly, and then store our peer's nonce. */ 
871     if (!name_matches(&m->remote,st->remotename)) {
872         *error="wrong remote site name";
873         return False;
874     }
875     if (!name_matches(&m->local,st->localname)) {
876         *error="wrong local site name";
877         return False;
878     }
879     if (memcmp(m->nL,st->localN,NONCELEN)!=0) {
880         *error="wrong locally-generated nonce";
881         return False;
882     }
883     if (type==LABEL_MSG2) return True;
884     if (!consttime_memeq(m->nR,st->remoteN,NONCELEN)) {
885         *error="wrong remotely-generated nonce";
886         return False;
887     }
888     /* MSG3 has complicated rules about capabilities, which are
889      * handled in process_msg3. */
890     if (MSGMAJOR(type) == 3) return True;
891     if (m->remote_capabilities!=st->remote_capabilities) {
892         *error="remote capabilities changed";
893         return False;
894     }
895     if (type==LABEL_MSG4) return True;
896     *error="unknown message type";
897     return False;
898 }
899
900 static void peerkeys_maybe_incorporate(struct site *st, const char *file,
901                                        const char *whatmore,
902                                        int logcl_enoent)
903 {
904     struct peer_keyset *atsuffix=
905         keyset_load(file,&st->scratch,st->log,logcl_enoent);
906     if (!atsuffix) return;
907
908     if (st->peerkeys_current &&
909         serial_cmp(atsuffix->serial,st->peerkeys_current->serial) <= 0) {
910         slog(st,LOG_SIGKEYS,"keys from %s%s are older, discarding",
911              file,whatmore);
912         keyset_dispose(&atsuffix);
913         int r=unlink(file);
914         if (r) slog(st,LOG_ERROR,"failed to remove old key update %s: %s\n",
915                     st->peerkeys_tmpl.buffer,strerror(errno));
916         return;
917     } else {
918         slog(st,LOG_SIGKEYS,"keys from %s%s are newer, installing",
919              file,whatmore);
920         keyset_dispose(&st->peerkeys_current);
921         st->peerkeys_current=atsuffix;
922         int r=rename(file,st->peerkeys_path);
923         if (r) slog(st,LOG_ERROR,"failed to install key update %s as %s: %s\n",
924                     st->peerkeys_tmpl.buffer,st->peerkeys_path,
925                     strerror(errno));
926     }
927 }
928
929 static void peerkeys_check_for_update(struct site *st)
930 {
931     /* peerkeys files
932      *
933      *  <F>            live file, loaded on startup, updated by secnet
934      *                  (only).  * in-memory peerkeys_current is kept
935      *                  synced with this file
936      *
937      *  <F>~update     update file from config manager, checked before
938      *                  every key exchange.  config manager must rename
939      *                  this file into place; it will be renamed and
940      *                  then removed by secnet.
941      *
942      *  <F>~proc       update file being processed by secnet.
943      *                  only secnet may write or remove.
944      *
945      *  <F>~incoming   update file from peer, being received by secnet
946      *                  may be incomplete, unverified, or even malicious
947      *                  only secnet may write or remove.
948      */
949     if (!st->peerkeys_path) return;
950
951     pathprefix_template_setsuffix(&st->peerkeys_tmpl,"~proc");
952     peerkeys_maybe_incorporate(st,st->peerkeys_tmpl.buffer,
953                                " (found old update)",
954                                M_DEBUG);
955
956     pathprefix_template_setsuffix(&st->peerkeys_tmpl,"~update");
957     const char *inputp=st->peerkeys_tmpl.buffer;
958     if (access(inputp,R_OK)) {
959         if (errno!=ENOENT)
960             slog(st,LOG_ERROR,"cannot access peer key update file %s\n",
961                  inputp);
962         return;
963     }
964
965     buffer_init(&st->scratch,0);
966     BUF_ADD_BYTES(append,&st->scratch,
967                   st->peerkeys_tmpl.buffer,
968                   strlen(st->peerkeys_tmpl.buffer)+1);
969     inputp=st->scratch.start;
970
971     pathprefix_template_setsuffix(&st->peerkeys_tmpl,"~proc");
972     const char *oursp=st->peerkeys_tmpl.buffer;
973
974     int r=rename(inputp,oursp);
975     if (r) {
976         slog(st,LOG_ERROR,"failed to claim key update file %s as %s: %s\n",
977              inputp,oursp,strerror(errno));
978         return;
979     }
980
981     peerkeys_maybe_incorporate(st,oursp," (update)",M_ERR);
982 }
983
984
985 static bool_t kex_init(struct site *st)
986 {
987     keyset_dispose(&st->peerkeys_kex);
988     peerkeys_check_for_update(st);
989     if (!st->peerkeys_current) {
990         slog(st,LOG_SETUP_INIT,"no peer public keys, abandoning key setup");
991         return False;
992     }
993     st->peerkeys_kex = keyset_dup(st->peerkeys_current);
994     st->random->generate(st->random->st,NONCELEN,st->localN);
995     return True;
996 }
997
998 static bool_t generate_msg1(struct site *st, const struct msg *prompt_maybe_0)
999 {
1000     return
1001         generate_msg(st,LABEL_MSG1,"site:MSG1",prompt_maybe_0);
1002 }
1003
1004 static bool_t process_msg1(struct site *st, struct buffer_if *msg1,
1005                            const struct comm_addr *src,
1006                            const struct msg *m)
1007 {
1008     /* We've already determined we're in an appropriate state to
1009        process an incoming MSG1, and that the MSG1 has correct values
1010        of A and B. */
1011
1012     st->setup_session_id=m->source;
1013     st->remote_capabilities=m->remote_capabilities;
1014     memcpy(st->remoteN,m->nR,NONCELEN);
1015     return True;
1016 }
1017
1018 static bool_t generate_msg2(struct site *st,
1019                             const struct msg *prompt_may_be_null)
1020 {
1021     return
1022         generate_msg(st,LABEL_MSG2,"site:MSG2",prompt_may_be_null);
1023 }
1024
1025 static bool_t process_msg2(struct site *st, struct buffer_if *msg2,
1026                            const struct comm_addr *src,
1027                            struct msg *m /* returned */)
1028 {
1029     cstring_t err;
1030
1031     if (!unpick_msg(st,LABEL_MSG2,msg2,m)) return False;
1032     if (!check_msg(st,LABEL_MSG2,m,&err)) {
1033         slog(st,LOG_SEC,"msg2: %s",err);
1034         return False;
1035     }
1036     st->setup_session_id=m->source;
1037     st->remote_capabilities=m->remote_capabilities;
1038
1039     /* Select the transform to use */
1040
1041     uint32_t remote_crypto_caps = st->remote_capabilities & CAPAB_TRANSFORM_MASK;
1042     if (!remote_crypto_caps)
1043         /* old secnets only had this one transform */
1044         remote_crypto_caps = 1UL << CAPAB_BIT_ANCIENTTRANSFORM;
1045
1046 #define CHOOSE_CRYPTO(kind, whats) do {                                 \
1047     struct kind##_if *iface;                                            \
1048     uint32_t bit, ours = 0;                                             \
1049     int i;                                                              \
1050     for (i= 0; i < st->n##kind##s; i++) {                               \
1051         iface=st->kind##s[i];                                           \
1052         bit = 1UL << iface->capab_bit;                                  \
1053         if (bit & remote_crypto_caps) goto kind##_found;                \
1054         ours |= bit;                                                    \
1055     }                                                                   \
1056     slog(st,LOG_ERROR,"no " whats " in common"                          \
1057          " (us %#"PRIx32"; them: %#"PRIx32")",                          \
1058          st->local_capabilities & ours, remote_crypto_caps);            \
1059     return False;                                                       \
1060 kind##_found:                                                           \
1061     st->chosen_##kind = iface;                                          \
1062 } while (0)
1063
1064     CHOOSE_CRYPTO(transform, "transforms");
1065
1066 #undef CHOOSE_CRYPTO
1067
1068     memcpy(st->remoteN,m->nR,NONCELEN);
1069     return True;
1070 }
1071
1072 static bool_t generate_msg3(struct site *st, const struct msg *prompt)
1073 {
1074     /* Now we have our nonce and their nonce. Think of a secret key,
1075        and create message number 3. */
1076     st->random->generate(st->random->st,st->dh->len,st->dhsecret);
1077     return generate_msg(st,
1078                         (st->remote_capabilities & CAPAB_TRANSFORM_MASK)
1079                         ? LABEL_MSG3BIS
1080                         : LABEL_MSG3,
1081                         "site:MSG3",prompt);
1082 }
1083
1084 static bool_t process_msg3_msg4(struct site *st, struct msg *m)
1085 {
1086     /* Check signature and store g^x mod m */
1087     int ki;
1088
1089     if (m->signing_key_index >= 0) {
1090         if (m->signing_key_index >= st->peerkeys_kex->nkeys)
1091             return False;
1092         ki=m->signing_key_index;
1093     } else {
1094         for (ki=0; ki<st->peerkeys_kex->nkeys; ki++)
1095             if (sigkeyid_equal(&keyid_zero,&st->peerkeys_kex->keys[ki].id))
1096                 goto found;
1097         /* not found */
1098         slog(st,LOG_ERROR,
1099              "peer signed with keyid zero, which we do not accept");
1100         return False;
1101     found:;
1102     }
1103     struct sigpubkey_if *pubkey=st->peerkeys_kex->keys[ki].pubkey;
1104
1105     if (!pubkey->check(pubkey->st,
1106                        m->hashstart,m->hashlen,
1107                        &m->sig)) {
1108         slog(st,LOG_SEC,"msg3/msg4 signature failed check!");
1109         return False;
1110     }
1111
1112     st->remote_adv_mtu=m->remote_mtu;
1113
1114     return True;
1115 }
1116
1117 static bool_t process_msg3(struct site *st, struct buffer_if *msg3,
1118                            const struct comm_addr *src, uint32_t msgtype,
1119                            struct msg *m /* returned */)
1120 {
1121     cstring_t err;
1122
1123     switch (msgtype) {
1124         case CASES_MSG3_KNOWN: break;
1125         default: assert(0);
1126     }
1127
1128     if (!unpick_msg(st,msgtype,msg3,m)) return False;
1129     if (!check_msg(st,msgtype,m,&err)) {
1130         slog(st,LOG_SEC,"msg3: %s",err);
1131         return False;
1132     }
1133     uint32_t capab_adv_late = m->remote_capabilities
1134         & ~st->remote_capabilities & st->early_capabilities;
1135     if (capab_adv_late) {
1136         slog(st,LOG_SEC,"msg3 impermissibly adds early capability flag(s)"
1137              " %#"PRIx32" (was %#"PRIx32", now %#"PRIx32")",
1138              capab_adv_late, st->remote_capabilities, m->remote_capabilities);
1139         return False;
1140     }
1141
1142 #define CHOSE_CRYPTO(kind, what) do {                                   \
1143     struct kind##_if *iface;                                            \
1144     int i;                                                              \
1145     for (i=0; i<st->n##kind##s; i++) {                                  \
1146         iface=st->kind##s[i];                                           \
1147         if (iface->capab_bit == m->capab_##kind##num)                   \
1148             goto kind##_found;                                          \
1149     }                                                                   \
1150     slog(st,LOG_SEC,"peer chose unknown-to-us " what " %d!",            \
1151          m->capab_##kind##num);                                                 \
1152     return False;                                                       \
1153 kind##_found:                                                           \
1154     st->chosen_##kind=iface;                                            \
1155 } while (0)
1156
1157     CHOSE_CRYPTO(transform, "transform");
1158
1159 #undef CHOSE_CRYPTO
1160
1161     if (!process_msg3_msg4(st,m))
1162         return False;
1163
1164     /* Update our idea of the remote site's capabilities, now that we've
1165      * verified that its message was authentic.
1166      *
1167      * Our previous idea of the remote site's capabilities came from the
1168      * unauthenticated MSG1.  We've already checked that this new message
1169      * doesn't change any of the bits we relied upon in the past, but it may
1170      * also have set additional capability bits.  We simply throw those away
1171      * now, and use the authentic capabilities from this MSG3. */
1172     st->remote_capabilities=m->remote_capabilities;
1173
1174     /* Terminate their DH public key with a '0' */
1175     m->pk[m->pklen]=0;
1176     /* Invent our DH secret key */
1177     st->random->generate(st->random->st,st->dh->len,st->dhsecret);
1178
1179     /* Generate the shared key and set up the transform */
1180     if (!set_new_transform(st,m->pk)) return False;
1181
1182     return True;
1183 }
1184
1185 static bool_t generate_msg4(struct site *st, const struct msg *prompt)
1186 {
1187     /* We have both nonces, their public key and our private key. Generate
1188        our public key, sign it and send it to them. */
1189     return generate_msg(st,LABEL_MSG4,"site:MSG4",prompt);
1190 }
1191
1192 static bool_t process_msg4(struct site *st, struct buffer_if *msg4,
1193                            const struct comm_addr *src,
1194                            struct msg *m /* returned */)
1195 {
1196     cstring_t err;
1197
1198     if (!unpick_msg(st,LABEL_MSG4,msg4,m)) return False;
1199     if (!check_msg(st,LABEL_MSG4,m,&err)) {
1200         slog(st,LOG_SEC,"msg4: %s",err);
1201         return False;
1202     }
1203     
1204     if (!process_msg3_msg4(st,m))
1205         return False;
1206
1207     /* Terminate their DH public key with a '0' */
1208     m->pk[m->pklen]=0;
1209
1210     /* Generate the shared key and set up the transform */
1211     if (!set_new_transform(st,m->pk)) return False;
1212
1213     return True;
1214 }
1215
1216 struct msg0 {
1217     uint32_t dest;
1218     uint32_t source;
1219     uint32_t type;
1220 };
1221
1222 static bool_t unpick_msg0(struct site *st, struct buffer_if *msg0,
1223                           struct msg0 *m)
1224 {
1225     CHECK_AVAIL(msg0,4);
1226     m->dest=buf_unprepend_uint32(msg0);
1227     CHECK_AVAIL(msg0,4);
1228     m->source=buf_unprepend_uint32(msg0);
1229     CHECK_AVAIL(msg0,4);
1230     m->type=buf_unprepend_uint32(msg0);
1231     return True;
1232     /* Leaves transformed part of buffer untouched */
1233 }
1234
1235 static bool_t generate_msg5(struct site *st, const struct msg *prompt)
1236 {
1237     cstring_t transform_err;
1238
1239     BUF_ALLOC(&st->buffer,"site:MSG5");
1240     /* We are going to add four words to the message */
1241     buffer_init(&st->buffer,calculate_max_start_pad());
1242     /* Give the netlink code an opportunity to put its own stuff in the
1243        message (configuration information, etc.) */
1244     buf_prepend_uint32(&st->buffer,LABEL_MSG5);
1245     if (call_transform_forwards(st,st->new_transform,
1246                                 &st->buffer,&transform_err))
1247         return False;
1248     buf_prepend_uint32(&st->buffer,LABEL_MSG5);
1249     buf_prepend_uint32(&st->buffer,st->index);
1250     buf_prepend_uint32(&st->buffer,st->setup_session_id);
1251
1252     st->retries=st->setup_retries;
1253     return True;
1254 }
1255
1256 static bool_t process_msg5(struct site *st, struct buffer_if *msg5,
1257                            const struct comm_addr *src,
1258                            struct transform_inst_if *transform)
1259 {
1260     struct msg0 m;
1261     cstring_t transform_err;
1262
1263     if (!unpick_msg0(st,msg5,&m)) return False;
1264
1265     if (call_transform_reverse(st,transform,msg5,&transform_err)) {
1266         /* There's a problem */
1267         slog(st,LOG_SEC,"process_msg5: transform: %s",transform_err);
1268         return False;
1269     }
1270     /* Buffer should now contain untransformed PING packet data */
1271     CHECK_AVAIL(msg5,4);
1272     if (buf_unprepend_uint32(msg5)!=LABEL_MSG5) {
1273         slog(st,LOG_SEC,"MSG5/PING packet contained wrong label");
1274         return False;
1275     }
1276     /* Older versions of secnet used to write some config data here
1277      * which we ignore.  So we don't CHECK_EMPTY */
1278     return True;
1279 }
1280
1281 static void create_msg6(struct site *st, struct transform_inst_if *transform,
1282                         uint32_t session_id)
1283 {
1284     cstring_t transform_err;
1285
1286     BUF_ALLOC(&st->buffer,"site:MSG6");
1287     /* We are going to add four words to the message */
1288     buffer_init(&st->buffer,calculate_max_start_pad());
1289     /* Give the netlink code an opportunity to put its own stuff in the
1290        message (configuration information, etc.) */
1291     buf_prepend_uint32(&st->buffer,LABEL_MSG6);
1292     transform_apply_return problem =
1293         call_transform_forwards(st,transform,
1294                                 &st->buffer,&transform_err);
1295     assert(!problem);
1296     buf_prepend_uint32(&st->buffer,LABEL_MSG6);
1297     buf_prepend_uint32(&st->buffer,st->index);
1298     buf_prepend_uint32(&st->buffer,session_id);
1299 }
1300
1301 static bool_t generate_msg6(struct site *st, const struct msg *prompt)
1302 {
1303     if (!is_transform_valid(st->new_transform))
1304         return False;
1305     create_msg6(st,st->new_transform,st->setup_session_id);
1306     st->retries=1; /* Peer will retransmit MSG5 if this packet gets lost */
1307     return True;
1308 }
1309
1310 static bool_t process_msg6(struct site *st, struct buffer_if *msg6,
1311                            const struct comm_addr *src)
1312 {
1313     struct msg0 m;
1314     cstring_t transform_err;
1315
1316     if (!unpick_msg0(st,msg6,&m)) return False;
1317
1318     if (call_transform_reverse(st,st->new_transform,msg6,&transform_err)) {
1319         /* There's a problem */
1320         slog(st,LOG_SEC,"process_msg6: transform: %s",transform_err);
1321         return False;
1322     }
1323     /* Buffer should now contain untransformed PING packet data */
1324     CHECK_AVAIL(msg6,4);
1325     if (buf_unprepend_uint32(msg6)!=LABEL_MSG6) {
1326         slog(st,LOG_SEC,"MSG6/PONG packet contained invalid data");
1327         return False;
1328     }
1329     /* Older versions of secnet used to write some config data here
1330      * which we ignore.  So we don't CHECK_EMPTY */
1331     return True;
1332 }
1333
1334 static transform_apply_return
1335 decrypt_msg0(struct site *st, struct buffer_if *msg0,
1336                            const struct comm_addr *src)
1337 {
1338     cstring_t transform_err, auxkey_err, newkey_err="n/a";
1339     struct msg0 m;
1340     transform_apply_return problem;
1341
1342     if (!unpick_msg0(st,msg0,&m)) return False;
1343
1344     /* Keep a copy so we can try decrypting it with multiple keys */
1345     buffer_copy(&st->scratch, msg0);
1346
1347     problem = call_transform_reverse(st,st->current.transform,
1348                                      msg0,&transform_err);
1349     if (!problem) {
1350         if (!st->auxiliary_is_new)
1351             delete_one_key(st,&st->auxiliary_key,
1352                            "peer has used new key","auxiliary key",LOG_SEC);
1353         return 0;
1354     }
1355     if (transform_apply_return_badseq(problem))
1356         goto badseq;
1357
1358     buffer_copy(msg0, &st->scratch);
1359     problem = call_transform_reverse(st,st->auxiliary_key.transform,
1360                                      msg0,&auxkey_err);
1361     if (!problem) {
1362         slog(st,LOG_DROP,"processing packet which uses auxiliary key");
1363         if (st->auxiliary_is_new) {
1364             /* We previously timed out in state SENTMSG5 but it turns
1365              * out that our peer did in fact get our MSG5 and is
1366              * using the new key.  So we should switch to it too. */
1367             /* This is a bit like activate_new_key. */
1368             struct data_key t;
1369             t=st->current;
1370             st->current=st->auxiliary_key;
1371             st->auxiliary_key=t;
1372
1373             delete_one_key(st,&st->auxiliary_key,"peer has used new key",
1374                            "previous key",LOG_SEC);
1375             st->auxiliary_is_new=0;
1376             st->renegotiate_key_time=st->auxiliary_renegotiate_key_time;
1377         }
1378         return 0;
1379     }
1380     if (transform_apply_return_badseq(problem))
1381         goto badseq;
1382
1383     if (st->state==SITE_SENTMSG5) {
1384         buffer_copy(msg0, &st->scratch);
1385         problem = call_transform_reverse(st,st->new_transform,
1386                                          msg0,&newkey_err);
1387         if (!problem) {
1388             /* It looks like we didn't get the peer's MSG6 */
1389             /* This is like a cut-down enter_new_state(SITE_RUN) */
1390             slog(st,LOG_STATE,"will enter state RUN (MSG0 with new key)");
1391             BUF_FREE(&st->buffer);
1392             st->timeout=0;
1393             activate_new_key(st);
1394             return 0; /* do process the data in this packet */
1395         }
1396         if (transform_apply_return_badseq(problem))
1397             goto badseq;
1398     }
1399
1400     slog(st,LOG_SEC,"transform: %s (aux: %s, new: %s)",
1401          transform_err,auxkey_err,newkey_err);
1402     initiate_key_setup(st,"incoming message would not decrypt",0);
1403     send_nak(src,m.dest,m.source,m.type,msg0,"message would not decrypt");
1404     assert(problem);
1405     return problem;
1406
1407  badseq:
1408     slog(st,LOG_DROP,"transform: %s (bad seq.)",transform_err);
1409     assert(problem);
1410     return problem;
1411 }
1412
1413 static bool_t process_msg0(struct site *st, struct buffer_if *msg0,
1414                            const struct comm_addr *src)
1415 {
1416     uint32_t type;
1417     transform_apply_return problem;
1418
1419     problem = decrypt_msg0(st,msg0,src);
1420     if (problem==transform_apply_seqdupe) {
1421         /* We recently received another copy of this packet, maybe due
1422          * to polypath.  That's not a problem; indeed, for the
1423          * purposes of transport address management it is a success.
1424          * But we don't want to process the packet. */
1425         transport_data_msgok(st,src);
1426         return False;
1427     }
1428     if (problem)
1429         return False;
1430
1431     CHECK_AVAIL(msg0,4);
1432     type=buf_unprepend_uint32(msg0);
1433     switch(type) {
1434     case LABEL_MSG7:
1435         /* We must forget about the current session. */
1436         delete_keys(st,"request from peer",LOG_SEC);
1437         /* probably, the peer is shutting down, and this is going to fail,
1438          * but we need to be trying to bring the link up again */
1439         if (st->keepalive)
1440             initiate_key_setup(st,"peer requested key teardown",0);
1441         return True;
1442     case LABEL_MSG9:
1443         /* Deliver to netlink layer */
1444         st->netlink->deliver(st->netlink->st,msg0);
1445         transport_data_msgok(st,src);
1446         /* See whether we should start negotiating a new key */
1447         if (st->now > st->renegotiate_key_time)
1448             initiate_key_setup(st,"incoming packet in renegotiation window",0);
1449         return True;
1450     default:
1451         slog(st,LOG_SEC,"incoming encrypted message of type %08x "
1452              "(unknown)",type);
1453         break;
1454     }
1455     return False;
1456 }
1457
1458 static void dump_packet(struct site *st, struct buffer_if *buf,
1459                         const struct comm_addr *addr, bool_t incoming,
1460                         bool_t ok)
1461 {
1462     uint32_t dest=get_uint32(buf->start);
1463     uint32_t source=get_uint32(buf->start+4);
1464     uint32_t msgtype=get_uint32(buf->start+8);
1465
1466     if (st->log_events & LOG_DUMP)
1467         slilog(st->log,M_DEBUG,"%s: %s: %08x<-%08x: %08x: %s%s",
1468                st->tunname,incoming?"incoming":"outgoing",
1469                dest,source,msgtype,comm_addr_to_string(addr),
1470                ok?"":" - fail");
1471 }
1472
1473 static bool_t comm_addr_sendmsg(struct site *st,
1474                                 const struct comm_addr *dest,
1475                                 struct buffer_if *buf)
1476 {
1477     int i;
1478     struct comm_clientinfo *commclientinfo = 0;
1479
1480     for (i=0; i < st->ncomms; i++) {
1481         if (st->comms[i] == dest->comm) {
1482             commclientinfo = st->commclientinfos[i];
1483             break;
1484         }
1485     }
1486     return dest->comm->sendmsg(dest->comm->st, buf, dest, commclientinfo);
1487 }
1488
1489 static uint32_t site_status(void *st)
1490 {
1491     return 0;
1492 }
1493
1494 static bool_t send_msg(struct site *st)
1495 {
1496     if (st->retries>0) {
1497         transport_xmit(st, &st->setup_peers, &st->buffer, True);
1498         st->timeout=st->now+st->setup_retry_interval;
1499         st->retries--;
1500         return True;
1501     } else if (st->state==SITE_SENTMSG5) {
1502         logtimeout(st,"timed out sending MSG5, stashing new key");
1503         /* We stash the key we have produced, in case it turns out that
1504          * our peer did see our MSG5 after all and starts using it. */
1505         /* This is a bit like some of activate_new_key */
1506         struct transform_inst_if *t;
1507         t=st->auxiliary_key.transform;
1508         st->auxiliary_key.transform=st->new_transform;
1509         st->new_transform=t;
1510         dispose_transform(&st->new_transform);
1511
1512         st->auxiliary_is_new=1;
1513         st->auxiliary_key.key_timeout=st->now+st->key_lifetime;
1514         st->auxiliary_renegotiate_key_time=st->now+st->key_renegotiate_time;
1515         st->auxiliary_key.remote_session_id=st->setup_session_id;
1516
1517         enter_state_wait(st);
1518         return False;
1519     } else {
1520         logtimeout(st,"timed out sending key setup packet "
1521             "(in state %s)",state_name(st->state));
1522         enter_state_wait(st);
1523         return False;
1524     }
1525 }
1526
1527 static void site_resolve_callback(void *sst, const struct comm_addr *addrs,
1528                                   int stored_naddrs, int all_naddrs,
1529                                   const char *address, const char *failwhy)
1530 {
1531     struct site *st=sst;
1532
1533     if (!stored_naddrs) {
1534         slog(st,LOG_ERROR,"resolution of %s failed: %s",address,failwhy);
1535     } else {
1536         slog(st,LOG_PEER_ADDRS,"resolution of %s completed, %d addrs, eg: %s",
1537              address, all_naddrs, comm_addr_to_string(&addrs[0]));;
1538
1539         int space=st->transport_peers_max-st->resolving_n_results_stored;
1540         int n_tocopy=MIN(stored_naddrs,space);
1541         COPY_ARRAY(st->resolving_results + st->resolving_n_results_stored,
1542                    addrs,
1543                    n_tocopy);
1544         st->resolving_n_results_stored += n_tocopy;
1545         st->resolving_n_results_all += all_naddrs;
1546     }
1547
1548     decrement_resolving_count(st,1);
1549 }
1550
1551 static void decrement_resolving_count(struct site *st, int by)
1552 {
1553     assert(st->resolving_count>0);
1554     st->resolving_count-=by;
1555
1556     if (st->resolving_count)
1557         return;
1558
1559     /* OK, we are done with them all.  Handle combined results. */
1560
1561     const struct comm_addr *addrs=st->resolving_results;
1562     int naddrs=st->resolving_n_results_stored;
1563     assert(naddrs<=st->transport_peers_max);
1564
1565     if (naddrs) {
1566         if (naddrs != st->resolving_n_results_all) {
1567             slog(st,LOG_SETUP_INIT,"resolution of supplied addresses/names"
1568                  " yielded too many results (%d > %d), some ignored",
1569                  st->resolving_n_results_all, naddrs);
1570         }
1571         slog(st,LOG_STATE,"resolution completed, %d addrs, eg: %s",
1572              naddrs, iaddr_to_string(&addrs[0].ia));;
1573     }
1574
1575     switch (st->state) {
1576     case SITE_RESOLVE:
1577         if (transport_compute_setupinit_peers(st,addrs,naddrs,0)) {
1578             enter_new_state(st,SITE_SENTMSG1,0);
1579         } else {
1580             /* Can't figure out who to try to to talk to */
1581             slog(st,LOG_SETUP_INIT,
1582                  "key exchange failed: cannot find peer address");
1583             enter_state_run(st);
1584         }
1585         break;
1586     case SITE_SENTMSG1: case SITE_SENTMSG2:
1587     case SITE_SENTMSG3: case SITE_SENTMSG4:
1588     case SITE_SENTMSG5:
1589         if (naddrs) {
1590             /* We start using the address immediately for data too.
1591              * It's best to store it in st->peers now because we might
1592              * go via SENTMSG5, WAIT, and a MSG0, straight into using
1593              * the new key (without updating the data peer addrs). */
1594             transport_resolve_complete(st,addrs,naddrs);
1595         } else if (st->local_mobile) {
1596             /* We can't let this rest because we may have a peer
1597              * address which will break in the future. */
1598             slog(st,LOG_SETUP_INIT,"resolution failed: "
1599                  "abandoning key exchange");
1600             enter_state_wait(st);
1601         } else {
1602             slog(st,LOG_SETUP_INIT,"resolution failed: "
1603                  " continuing to use source address of peer's packets"
1604                  " for key exchange and ultimately data");
1605         }
1606         break;
1607     case SITE_RUN:
1608         if (naddrs) {
1609             slog(st,LOG_SETUP_INIT,"resolution completed tardily,"
1610                  " updating peer address(es)");
1611             transport_resolve_complete_tardy(st,addrs,naddrs);
1612         } else if (st->local_mobile) {
1613             /* Not very good.  We should queue (another) renegotiation
1614              * so that we can update the peer address. */
1615             st->key_renegotiate_time=st->now+wait_timeout(st);
1616         } else {
1617             slog(st,LOG_SETUP_INIT,"resolution failed: "
1618                  " continuing to use source address of peer's packets");
1619         }
1620         break;
1621     case SITE_WAIT:
1622     case SITE_STOP:
1623         /* oh well */
1624         break;
1625     }
1626 }
1627
1628 static bool_t initiate_key_setup(struct site *st, cstring_t reason,
1629                                  const struct comm_addr *prod_hint)
1630 {
1631     /* Reentrancy hazard: can call enter_new_state/enter_state_* */
1632     if (st->state!=SITE_RUN) return False;
1633     slog(st,LOG_SETUP_INIT,"initiating key exchange (%s)",reason);
1634     if (st->addresses) {
1635         slog(st,LOG_SETUP_INIT,"resolving peer address(es)");
1636         return enter_state_resolve(st);
1637     } else if (transport_compute_setupinit_peers(st,0,0,prod_hint)) {
1638         return enter_new_state(st,SITE_SENTMSG1,0);
1639     }
1640     slog(st,LOG_SETUP_INIT,"key exchange failed: no address for peer");
1641     return False;
1642 }
1643
1644 static void activate_new_key(struct site *st)
1645 {
1646     struct transform_inst_if *t;
1647
1648     /* We have three transform instances, which we swap between old,
1649        active and setup */
1650     t=st->auxiliary_key.transform;
1651     st->auxiliary_key.transform=st->current.transform;
1652     st->current.transform=st->new_transform;
1653     st->new_transform=t;
1654     dispose_transform(&st->new_transform);
1655
1656     st->timeout=0;
1657     st->auxiliary_is_new=0;
1658     st->auxiliary_key.key_timeout=st->current.key_timeout;
1659     st->current.key_timeout=st->now+st->key_lifetime;
1660     st->renegotiate_key_time=st->now+st->key_renegotiate_time;
1661     transport_peers_copy(st,&st->peers,&st->setup_peers);
1662     st->current.remote_session_id=st->setup_session_id;
1663
1664     /* Compute the inter-site MTU.  This is min( our_mtu, their_mtu ).
1665      * But their mtu be unspecified, in which case we just use ours. */
1666     uint32_t intersite_mtu=
1667         MIN(st->mtu_target, st->remote_adv_mtu ?: ~(uint32_t)0);
1668     st->netlink->set_mtu(st->netlink->st,intersite_mtu);
1669
1670     slog(st,LOG_ACTIVATE_KEY,"new key activated"
1671          " (mtu ours=%"PRId32" theirs=%"PRId32" intersite=%"PRId32")",
1672          st->mtu_target, st->remote_adv_mtu, intersite_mtu);
1673     enter_state_run(st);
1674 }
1675
1676 static void delete_one_key(struct site *st, struct data_key *key,
1677                            cstring_t reason, cstring_t which, uint32_t loglevel)
1678 {
1679     if (!is_transform_valid(key->transform)) return;
1680     if (reason) slog(st,loglevel,"%s deleted (%s)",which,reason);
1681     dispose_transform(&key->transform);
1682     key->key_timeout=0;
1683 }
1684
1685 static void delete_keys(struct site *st, cstring_t reason, uint32_t loglevel)
1686 {
1687     if (current_valid(st)) {
1688         slog(st,loglevel,"session closed (%s)",reason);
1689
1690         delete_one_key(st,&st->current,0,0,0);
1691         set_link_quality(st);
1692     }
1693     delete_one_key(st,&st->auxiliary_key,0,0,0);
1694 }
1695
1696 static void state_assert(struct site *st, bool_t ok)
1697 {
1698     if (!ok) fatal("site:state_assert");
1699 }
1700
1701 static void enter_state_stop(struct site *st)
1702 {
1703     st->state=SITE_STOP;
1704     st->timeout=0;
1705     delete_keys(st,"entering state STOP",LOG_TIMEOUT_KEY);
1706     dispose_transform(&st->new_transform);
1707 }
1708
1709 static void set_link_quality(struct site *st)
1710 {
1711     uint32_t quality;
1712     if (current_valid(st))
1713         quality=LINK_QUALITY_UP;
1714     else if (st->state==SITE_WAIT || st->state==SITE_STOP)
1715         quality=LINK_QUALITY_DOWN;
1716     else if (st->addresses)
1717         quality=LINK_QUALITY_DOWN_CURRENT_ADDRESS;
1718     else if (transport_peers_valid(&st->peers))
1719         quality=LINK_QUALITY_DOWN_STALE_ADDRESS;
1720     else
1721         quality=LINK_QUALITY_DOWN;
1722
1723     st->netlink->set_quality(st->netlink->st,quality);
1724 }
1725
1726 static void enter_state_run(struct site *st)
1727 {
1728     slog(st,LOG_STATE,"entering state RUN%s",
1729          current_valid(st) ? " (keyed)" : " (unkeyed)");
1730     st->state=SITE_RUN;
1731     st->timeout=0;
1732
1733     st->setup_session_id=0;
1734     transport_peers_clear(st,&st->setup_peers);
1735     keyset_dispose(&st->peerkeys_kex);
1736     FILLZERO(st->localN);
1737     FILLZERO(st->remoteN);
1738     dispose_transform(&st->new_transform);
1739     memset(st->dhsecret,0,st->dh->len);
1740     if (st->sharedsecret) memset(st->sharedsecret,0,st->sharedsecretlen);
1741     set_link_quality(st);
1742
1743     if (st->keepalive && !current_valid(st))
1744         initiate_key_setup(st, "keepalive", 0);
1745 }
1746
1747 static bool_t ensure_resolving(struct site *st)
1748 {
1749     /* Reentrancy hazard: may call site_resolve_callback and hence
1750      * enter_new_state, enter_state_* and generate_msg*. */
1751     if (st->resolving_count)
1752         return True;
1753
1754     assert(st->addresses);
1755
1756     /* resolver->request might reentrantly call site_resolve_callback
1757      * which will decrement st->resolving, so we need to increment it
1758      * twice beforehand to prevent decrement from thinking we're
1759      * finished, and decrement it ourselves.  Alternatively if
1760      * everything fails then there are no callbacks due and we simply
1761      * set it to 0 and return false.. */
1762     st->resolving_n_results_stored=0;
1763     st->resolving_n_results_all=0;
1764     st->resolving_count+=2;
1765     const char **addrp=st->addresses;
1766     const char *address;
1767     bool_t anyok=False;
1768     for (; (address=*addrp++); ) {
1769         bool_t ok = st->resolver->request(st->resolver->st,address,
1770                                           st->remoteport,st->comms[0],
1771                                           site_resolve_callback,st);
1772         if (ok)
1773             st->resolving_count++;
1774         anyok|=ok;
1775     }
1776     if (!anyok) {
1777         st->resolving_count=0;
1778         return False;
1779     }
1780     decrement_resolving_count(st,2);
1781     return True;
1782 }
1783
1784 static bool_t enter_state_resolve(struct site *st)
1785 {
1786     /* Reentrancy hazard!  See ensure_resolving. */
1787     state_assert(st,st->state==SITE_RUN);
1788     slog(st,LOG_STATE,"entering state RESOLVE");
1789     st->state=SITE_RESOLVE;
1790     return ensure_resolving(st);
1791 }
1792
1793 static bool_t enter_new_state(struct site *st, uint32_t next,
1794                               const struct msg *prompt
1795                               /* may be 0 for SENTMSG1 */)
1796 {
1797     bool_t (*gen)(struct site *st, const struct msg *prompt);
1798     int r;
1799
1800     slog(st,LOG_STATE,"entering state %s",state_name(next));
1801     switch(next) {
1802     case SITE_SENTMSG1:
1803         state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE);
1804         if (!kex_init(st)) return False;
1805         gen=generate_msg1;
1806         st->msg1_crossed_logged = False;
1807         break;
1808     case SITE_SENTMSG2:
1809         state_assert(st,st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1810                      st->state==SITE_SENTMSG1 || st->state==SITE_WAIT);
1811         if (!kex_init(st)) return False;
1812         gen=generate_msg2;
1813         break;
1814     case SITE_SENTMSG3:
1815         state_assert(st,st->state==SITE_SENTMSG1);
1816         BUF_FREE(&st->buffer);
1817         gen=generate_msg3;
1818         break;
1819     case SITE_SENTMSG4:
1820         state_assert(st,st->state==SITE_SENTMSG2);
1821         BUF_FREE(&st->buffer);
1822         gen=generate_msg4;
1823         break;
1824     case SITE_SENTMSG5:
1825         state_assert(st,st->state==SITE_SENTMSG3);
1826         BUF_FREE(&st->buffer);
1827         gen=generate_msg5;
1828         break;
1829     case SITE_RUN:
1830         state_assert(st,st->state==SITE_SENTMSG4);
1831         BUF_FREE(&st->buffer);
1832         gen=generate_msg6;
1833         break;
1834     default:
1835         gen=NULL;
1836         fatal("enter_new_state(%s): invalid new state",state_name(next));
1837         break;
1838     }
1839
1840     if (hacky_par_start_failnow()) return False;
1841
1842     r= gen(st,prompt) && send_msg(st);
1843
1844     hacky_par_end(&r,
1845                   st->setup_retries, st->setup_retry_interval,
1846                   send_msg, st);
1847     
1848     if (r) {
1849         st->state=next;
1850         if (next==SITE_RUN) {
1851             BUF_FREE(&st->buffer); /* Never reused */
1852             st->timeout=0; /* Never retransmit */
1853             activate_new_key(st);
1854         }
1855         return True;
1856     }
1857     slog(st,LOG_ERROR,"error entering state %s",state_name(next));
1858     st->buffer.free=False; /* Unconditionally use the buffer; it may be
1859                               in either state, and enter_state_wait() will
1860                               do a BUF_FREE() */
1861     enter_state_wait(st);
1862     return False;
1863 }
1864
1865 /* msg7 tells our peer that we're about to forget our key */
1866 static bool_t send_msg7(struct site *st, cstring_t reason)
1867 {
1868     cstring_t transform_err;
1869
1870     if (current_valid(st) && st->buffer.free
1871         && transport_peers_valid(&st->peers)) {
1872         BUF_ALLOC(&st->buffer,"site:MSG7");
1873         buffer_init(&st->buffer,calculate_max_start_pad());
1874         buf_append_uint32(&st->buffer,LABEL_MSG7);
1875         buf_append_string(&st->buffer,reason);
1876         if (call_transform_forwards(st, st->current.transform,
1877                                     &st->buffer, &transform_err))
1878             goto free_out;
1879         buf_prepend_uint32(&st->buffer,LABEL_MSG0);
1880         buf_prepend_uint32(&st->buffer,st->index);
1881         buf_prepend_uint32(&st->buffer,st->current.remote_session_id);
1882         transport_xmit(st,&st->peers,&st->buffer,True);
1883         BUF_FREE(&st->buffer);
1884     free_out:
1885         return True;
1886     }
1887     return False;
1888 }
1889
1890 /* We go into this state if our peer becomes uncommunicative. Similar to
1891    the "stop" state, we forget all session keys for a while, before
1892    re-entering the "run" state. */
1893 static void enter_state_wait(struct site *st)
1894 {
1895     slog(st,LOG_STATE,"entering state WAIT");
1896     st->timeout=st->now+wait_timeout(st);
1897     st->state=SITE_WAIT;
1898     set_link_quality(st);
1899     BUF_FREE(&st->buffer); /* will have had an outgoing packet in it */
1900     /* XXX Erase keys etc. */
1901 }
1902
1903 static void generate_prod(struct site *st, struct buffer_if *buf)
1904 {
1905     buffer_init(buf,0);
1906     buf_append_uint32(buf,0);
1907     buf_append_uint32(buf,0);
1908     buf_append_uint32(buf,LABEL_PROD);
1909     buf_append_string(buf,st->localname);
1910     buf_append_string(buf,st->remotename);
1911 }
1912
1913 static void generate_send_prod(struct site *st,
1914                                const struct comm_addr *source)
1915 {
1916     if (!st->allow_send_prod) return; /* too soon */
1917     if (!(st->state==SITE_RUN || st->state==SITE_RESOLVE ||
1918           st->state==SITE_WAIT)) return; /* we'd ignore peer's MSG1 */
1919
1920     slog(st,LOG_SETUP_INIT,"prodding peer for key exchange");
1921     st->allow_send_prod=0;
1922     generate_prod(st,&st->scratch);
1923     bool_t ok = comm_addr_sendmsg(st, source, &st->scratch);
1924     dump_packet(st,&st->scratch,source,False,ok);
1925 }
1926
1927 static inline void site_settimeout(uint64_t timeout, int *timeout_io)
1928 {
1929     if (timeout) {
1930         int64_t offset=timeout-*now;
1931         if (offset<0) offset=0;
1932         if (offset>INT_MAX) offset=INT_MAX;
1933         if (*timeout_io<0 || offset<*timeout_io)
1934             *timeout_io=offset;
1935     }
1936 }
1937
1938 static int site_beforepoll(void *sst, struct pollfd *fds, int *nfds_io,
1939                            int *timeout_io)
1940 {
1941     struct site *st=sst;
1942
1943     BEFOREPOLL_WANT_FDS(0); /* We don't use any file descriptors */
1944     st->now=*now;
1945
1946     /* Work out when our next timeout is. The earlier of 'timeout' or
1947        'current.key_timeout'. A stored value of '0' indicates no timeout
1948        active. */
1949     site_settimeout(st->timeout, timeout_io);
1950     site_settimeout(st->current.key_timeout, timeout_io);
1951     site_settimeout(st->auxiliary_key.key_timeout, timeout_io);
1952
1953     return 0; /* success */
1954 }
1955
1956 static void check_expiry(struct site *st, struct data_key *key,
1957                          const char *which)
1958 {
1959     if (key->key_timeout && *now>key->key_timeout) {
1960         delete_one_key(st,key,"maximum life exceeded",which,LOG_TIMEOUT_KEY);
1961     }
1962 }
1963
1964 /* NB site_afterpoll will be called before site_beforepoll is ever called */
1965 static void site_afterpoll(void *sst, struct pollfd *fds, int nfds)
1966 {
1967     struct site *st=sst;
1968
1969     st->now=*now;
1970     if (st->timeout && *now>st->timeout) {
1971         st->timeout=0;
1972         if (st->state>=SITE_SENTMSG1 && st->state<=SITE_SENTMSG5) {
1973             if (!hacky_par_start_failnow())
1974                 send_msg(st);
1975         } else if (st->state==SITE_WAIT) {
1976             enter_state_run(st);
1977         } else {
1978             slog(st,LOG_ERROR,"site_afterpoll: unexpected timeout, state=%d",
1979                  st->state);
1980         }
1981     }
1982     check_expiry(st,&st->current,"current key");
1983     check_expiry(st,&st->auxiliary_key,"auxiliary key");
1984 }
1985
1986 /* This function is called by the netlink device to deliver packets
1987    intended for the remote network. The packet is in "raw" wire
1988    format, but is guaranteed to be word-aligned. */
1989 static void site_outgoing(void *sst, struct buffer_if *buf)
1990 {
1991     struct site *st=sst;
1992     cstring_t transform_err;
1993     
1994     if (st->state==SITE_STOP) {
1995         BUF_FREE(buf);
1996         return;
1997     }
1998
1999     st->allow_send_prod=1;
2000
2001     /* In all other states we consider delivering the packet if we have
2002        a valid key and a valid address to send it to. */
2003     if (current_valid(st) && transport_peers_valid(&st->peers)) {
2004         /* Transform it and send it */
2005         if (buf->size>0) {
2006             buf_prepend_uint32(buf,LABEL_MSG9);
2007             if (call_transform_forwards(st, st->current.transform,
2008                                         buf, &transform_err))
2009                 goto free_out;
2010             buf_prepend_uint32(buf,LABEL_MSG0);
2011             buf_prepend_uint32(buf,st->index);
2012             buf_prepend_uint32(buf,st->current.remote_session_id);
2013             transport_xmit(st,&st->peers,buf,False);
2014         }
2015     free_out:
2016         BUF_FREE(buf);
2017         return;
2018     }
2019
2020     slog(st,LOG_DROP,"discarding outgoing packet of size %d",buf->size);
2021     BUF_FREE(buf);
2022     initiate_key_setup(st,"outgoing packet",0);
2023 }
2024
2025 static bool_t named_for_us(struct site *st, const struct buffer_if *buf_in,
2026                            uint32_t type, struct msg *m,
2027                            struct priomsg *whynot)
2028     /* For packets which are identified by the local and remote names.
2029      * If it has our name and our peer's name in it it's for us. */
2030 {
2031     struct buffer_if buf[1];
2032     buffer_readonly_clone(buf,buf_in);
2033
2034     if (!unpick_msg(st,type,buf,m)) {
2035         priomsg_update_fixed(whynot, comm_notify_whynot_unpick, "malformed");
2036         return False;
2037     }
2038 #define NAME_MATCHES(lr)                                                \
2039     if (!name_matches(&m->lr, st->lr##name)) {                          \
2040         if (priomsg_update_fixed(whynot, comm_notify_whynot_name_##lr,  \
2041                                  "unknown " #lr " name: ")) {           \
2042             truncmsg_add_packet_string(&whynot->m, m->lr.len, m->lr.name); \
2043         }                                                               \
2044         return False;                                                   \
2045     }
2046     NAME_MATCHES(remote);
2047     NAME_MATCHES(local );
2048 #undef NAME_MATCHES
2049
2050     return True;
2051 }
2052
2053 static bool_t we_have_priority(struct site *st, const struct msg *m) {
2054     if (st->local_capabilities & m->remote_capabilities &
2055         CAPAB_PRIORITY_MOBILE) {
2056         if (st->local_mobile) return True;
2057         if (st-> peer_mobile) return False;
2058     }
2059     return st->our_name_later;
2060 }
2061
2062 static bool_t setup_late_msg_ok(struct site *st, 
2063                                 const struct buffer_if *buf_in,
2064                                 uint32_t msgtype,
2065                                 const struct comm_addr *source,
2066                                 struct msg *m /* returned */) {
2067     /* For setup packets which seem from their type like they are
2068      * late.  Maybe they came via a different path.  All we do is make
2069      * a note of the sending address, iff they look like they are part
2070      * of the current key setup attempt. */
2071     if (!named_for_us(st,buf_in,msgtype,m,0))
2072         /* named_for_us calls unpick_msg which gets the nonces */
2073         return False;
2074     if (!consttime_memeq(m->nR,st->remoteN,NONCELEN) ||
2075         !consttime_memeq(m->nL,st->localN, NONCELEN))
2076         /* spoof ?  from stale run ?  who knows */
2077         return False;
2078     transport_setup_msgok(st,source);
2079     return True;
2080 }
2081
2082 /* This function is called by the communication device to deliver
2083    packets from our peers.
2084    It should return True if the packet is recognised as being for
2085    this current site instance (and should therefore not be processed
2086    by other sites), even if the packet was otherwise ignored. */
2087 static bool_t site_incoming(void *sst, struct buffer_if *buf,
2088                             const struct comm_addr *source,
2089                             struct priomsg *whynot)
2090 {
2091     struct site *st=sst;
2092
2093     if (buf->size < 12) return False;
2094
2095     uint32_t dest=get_uint32(buf->start);
2096     uint32_t msgtype=get_uint32(buf->start+8);
2097     struct msg msg;
2098       /* initialised by named_for_us, or process_msgN for N!=1 */
2099
2100     if (msgtype==LABEL_MSG1) {
2101         if (!named_for_us(st,buf,msgtype,&msg,whynot))
2102             return False;
2103         /* It's a MSG1 addressed to us. Decide what to do about it. */
2104         dump_packet(st,buf,source,True,True);
2105         if (st->state==SITE_RUN || st->state==SITE_RESOLVE ||
2106             st->state==SITE_WAIT) {
2107             /* We should definitely process it */
2108             transport_compute_setupinit_peers(st,0,0,source);
2109             if (process_msg1(st,buf,source,&msg)) {
2110                 slog(st,LOG_SETUP_INIT,"key setup initiated by peer");
2111                 bool_t entered=enter_new_state(st,SITE_SENTMSG2,&msg);
2112                 if (entered && st->addresses && st->local_mobile)
2113                     /* We must do this as the very last thing, because
2114                        the resolver callback might reenter us. */
2115                     ensure_resolving(st);
2116             } else {
2117                 slog(st,LOG_ERROR,"failed to process incoming msg1");
2118             }
2119             BUF_FREE(buf);
2120             return True;
2121         } else if (st->state==SITE_SENTMSG1) {
2122             /* We've just sent a message 1! They may have crossed on
2123                the wire. If we have priority then we ignore the
2124                incoming one, otherwise we process it as usual. */
2125             if (we_have_priority(st,&msg)) {
2126                 BUF_FREE(buf);
2127                 if (!st->msg1_crossed_logged++)
2128                     slog(st,LOG_SETUP_INIT,"crossed msg1s; we are higher "
2129                          "priority => ignore incoming msg1");
2130                 return True;
2131             } else {
2132                 slog(st,LOG_SETUP_INIT,"crossed msg1s; we are lower "
2133                      "priority => use incoming msg1");
2134                 if (process_msg1(st,buf,source,&msg)) {
2135                     BUF_FREE(&st->buffer); /* Free our old message 1 */
2136                     transport_setup_msgok(st,source);
2137                     enter_new_state(st,SITE_SENTMSG2,&msg);
2138                 } else {
2139                     slog(st,LOG_ERROR,"failed to process an incoming "
2140                          "crossed msg1 (we have low priority)");
2141                 }
2142                 BUF_FREE(buf);
2143                 return True;
2144             }
2145         } else if (st->state==SITE_SENTMSG2 ||
2146                    st->state==SITE_SENTMSG4) {
2147             if (consttime_memeq(msg.nR,st->remoteN,NONCELEN)) {
2148                 /* We are ahead in the protocol, but that msg1 had the
2149                  * peer's nonce so presumably it is from this key
2150                  * exchange run, via a slower route */
2151                 transport_setup_msgok(st,source);
2152             } else {
2153                 slog(st,LOG_UNEXPECTED,"competing incoming message 1");
2154             }
2155             BUF_FREE(buf);
2156             return True;
2157         }
2158         /* The message 1 was received at an unexpected stage of the
2159            key setup.  Well, they lost the race. */
2160         slog(st,LOG_UNEXPECTED,"unexpected incoming message 1");
2161         BUF_FREE(buf);
2162         return True;
2163     }
2164     if (msgtype==LABEL_PROD) {
2165         if (!named_for_us(st,buf,msgtype,&msg,whynot))
2166             return False;
2167         dump_packet(st,buf,source,True,True);
2168         if (st->state!=SITE_RUN) {
2169             slog(st,LOG_DROP,"ignoring PROD when not in state RUN");
2170         } else if (current_valid(st)) {
2171             slog(st,LOG_DROP,"ignoring PROD when we think we have a key");
2172         } else {
2173             initiate_key_setup(st,"peer sent PROD packet",source);
2174         }
2175         BUF_FREE(buf);
2176         return True;
2177     }
2178     if (dest==st->index) {
2179         /* Explicitly addressed to us */
2180         if (msgtype!=LABEL_MSG0) dump_packet(st,buf,source,True,True);
2181         switch (msgtype) {
2182         case LABEL_NAK:
2183             /* If the source is our current peer then initiate a key setup,
2184                because our peer's forgotten the key */
2185             if (get_uint32(buf->start+4)==st->current.remote_session_id) {
2186                 bool_t initiated;
2187                 initiated = initiate_key_setup(st,"received a NAK",source);
2188                 if (!initiated) generate_send_prod(st,source);
2189             } else {
2190                 slog(st,LOG_SEC,"bad incoming NAK");
2191             }
2192             break;
2193         case LABEL_MSG0:
2194             process_msg0(st,buf,source);
2195             break;
2196         case LABEL_MSG1:
2197             /* Setup packet: should not have been explicitly addressed
2198                to us */
2199             slog(st,LOG_SEC,"incoming explicitly addressed msg1");
2200             break;
2201         case LABEL_MSG2:
2202             /* Setup packet: expected only in state SENTMSG1 */
2203             if (st->state!=SITE_SENTMSG1) {
2204                 if ((st->state==SITE_SENTMSG3 ||
2205                      st->state==SITE_SENTMSG5) &&
2206                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2207                     break;
2208                 slog(st,LOG_UNEXPECTED,"unexpected MSG2");
2209             } else if (process_msg2(st,buf,source,&msg)) {
2210                 transport_setup_msgok(st,source);
2211                 enter_new_state(st,SITE_SENTMSG3,&msg);
2212             } else {
2213                 slog(st,LOG_SEC,"invalid MSG2");
2214             }
2215             break;
2216         case CASES_MSG3_KNOWN:
2217             /* Setup packet: expected only in state SENTMSG2 */
2218             if (st->state!=SITE_SENTMSG2) {
2219                 if ((st->state==SITE_SENTMSG4) &&
2220                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2221                     break;
2222                 slog(st,LOG_UNEXPECTED,"unexpected MSG3");
2223             } else if (process_msg3(st,buf,source,msgtype,&msg)) {
2224                 transport_setup_msgok(st,source);
2225                 enter_new_state(st,SITE_SENTMSG4,&msg);
2226             } else {
2227                 slog(st,LOG_SEC,"invalid MSG3");
2228             }
2229             break;
2230         case LABEL_MSG4:
2231             /* Setup packet: expected only in state SENTMSG3 */
2232             if (st->state!=SITE_SENTMSG3) {
2233                 if ((st->state==SITE_SENTMSG5) &&
2234                     setup_late_msg_ok(st,buf,msgtype,source,&msg))
2235                     break;
2236                 slog(st,LOG_UNEXPECTED,"unexpected MSG4");
2237             } else if (process_msg4(st,buf,source,&msg)) {
2238                 transport_setup_msgok(st,source);
2239                 enter_new_state(st,SITE_SENTMSG5,&msg);
2240             } else {
2241                 slog(st,LOG_SEC,"invalid MSG4");
2242             }
2243             break;
2244         case LABEL_MSG5:
2245             /* Setup packet: expected only in state SENTMSG4 */
2246             /* (may turn up in state RUN if our return MSG6 was lost
2247                and the new key has already been activated. In that
2248                case we discard it. The peer will realise that we
2249                are using the new key when they see our data packets.
2250                Until then the peer's data packets to us get discarded. */
2251             if (st->state==SITE_SENTMSG4) {
2252                 if (process_msg5(st,buf,source,st->new_transform)) {
2253                     transport_setup_msgok(st,source);
2254                     enter_new_state(st,SITE_RUN,&msg);
2255                 } else {
2256                     slog(st,LOG_SEC,"invalid MSG5");
2257                 }
2258             } else if (st->state==SITE_RUN) {
2259                 if (process_msg5(st,buf,source,st->current.transform)) {
2260                     slog(st,LOG_DROP,"got MSG5, retransmitting MSG6");
2261                     transport_setup_msgok(st,source);
2262                     create_msg6(st,st->current.transform,
2263                                 st->current.remote_session_id);
2264                     transport_xmit(st,&st->peers,&st->buffer,True);
2265                     BUF_FREE(&st->buffer);
2266                 } else {
2267                     slog(st,LOG_SEC,"invalid MSG5 (in state RUN)");
2268                 }
2269             } else {
2270                 slog(st,LOG_UNEXPECTED,"unexpected MSG5");
2271             }
2272             break;
2273         case LABEL_MSG6:
2274             /* Setup packet: expected only in state SENTMSG5 */
2275             if (st->state!=SITE_SENTMSG5) {
2276                 slog(st,LOG_UNEXPECTED,"unexpected MSG6");
2277             } else if (process_msg6(st,buf,source)) {
2278                 BUF_FREE(&st->buffer); /* Free message 5 */
2279                 transport_setup_msgok(st,source);
2280                 activate_new_key(st);
2281             } else {
2282                 slog(st,LOG_SEC,"invalid MSG6");
2283             }
2284             break;
2285         default:
2286             slog(st,LOG_SEC,"received message of unknown type 0x%08x",
2287                  msgtype);
2288             break;
2289         }
2290         BUF_FREE(buf);
2291         return True;
2292     }
2293
2294     priomsg_update_fixed(whynot, comm_notify_whynot_general,
2295                          "not MSG1 or PROD; unknown dest index");
2296     return False;
2297 }
2298
2299 static void site_control(void *vst, bool_t run)
2300 {
2301     struct site *st=vst;
2302     if (run) enter_state_run(st);
2303     else enter_state_stop(st);
2304 }
2305
2306 static void site_phase_hook(void *sst, uint32_t newphase)
2307 {
2308     struct site *st=sst;
2309
2310     /* The program is shutting down; tell our peer */
2311     send_msg7(st,"shutting down");
2312 }
2313
2314 static void site_childpersist_clearkeys(void *sst, uint32_t newphase)
2315 {
2316     struct site *st=sst;
2317     dispose_transform(&st->current.transform);
2318     dispose_transform(&st->auxiliary_key.transform);
2319     dispose_transform(&st->new_transform);
2320     /* Not much point overwiting the signing key, since we loaded it
2321        from disk, and it is only valid prospectively if at all,
2322        anyway. */
2323     /* XXX it would be best to overwrite the DH state, because that
2324        _is_ relevant to forward secrecy.  However we have no
2325        convenient interface for doing that and in practice gmp has
2326        probably dribbled droppings all over the malloc arena.  A good
2327        way to fix this would be to have a privsep child for asymmetric
2328        crypto operations, but that's a task for another day. */
2329 }
2330
2331 static void setup_sethash(struct site *st, dict_t *dict,
2332                           struct hash_if **hash, struct cloc loc,
2333                           sig_sethash_fn *sethash, void *sigkey_st) {
2334     if (!*hash) *hash=find_cl_if(dict,"hash",CL_HASH,True,"site",loc);
2335     sethash(sigkey_st,*hash);
2336 }
2337 #define SETUP_SETHASH(k) do{                                            \
2338     if ((k)->sethash)                                                   \
2339         setup_sethash(st,dict, &hash,loc, (k)->sethash,(k)->st);        \
2340 }while(0)
2341
2342 static list_t *site_apply(closure_t *self, struct cloc loc, dict_t *context,
2343                           list_t *args)
2344 {
2345     static uint32_t index_sequence;
2346     struct site *st;
2347     item_t *item;
2348     dict_t *dict;
2349     int i;
2350
2351     NEW(st);
2352
2353     st->cl.description="site";
2354     st->cl.type=CL_SITE;
2355     st->cl.apply=NULL;
2356     st->cl.interface=&st->ops;
2357     st->ops.st=st;
2358     st->ops.control=site_control;
2359     st->ops.status=site_status;
2360     st->peerkeys_path=0;
2361     st->peerkeys_tmpl.buffer=0;
2362     st->peerkeys_current=st->peerkeys_kex=0;
2363
2364     /* First parameter must be a dict */
2365     item=list_elem(args,0);
2366     if (!item || item->type!=t_dict)
2367         cfgfatal(loc,"site","parameter must be a dictionary\n");
2368     
2369     dict=item->data.dict;
2370     st->localname=dict_read_string(dict, "local-name", True, "site", loc);
2371     st->remotename=dict_read_string(dict, "name", True, "site", loc);
2372
2373     st->keepalive=dict_read_bool(dict,"keepalive",False,"site",loc,False);
2374
2375     st->peer_mobile=dict_read_bool(dict,"mobile",False,"site",loc,False);
2376     st->local_mobile=
2377         dict_read_bool(dict,"local-mobile",False,"site",loc,False);
2378
2379     /* Sanity check (which also allows the 'sites' file to include
2380        site() closures for all sites including our own): refuse to
2381        talk to ourselves */
2382     if (strcmp(st->localname,st->remotename)==0) {
2383         Message(M_DEBUG,"site %s: local-name==name -> ignoring this site\n",
2384                 st->localname);
2385         if (st->peer_mobile != st->local_mobile)
2386             cfgfatal(loc,"site","site %s's peer-mobile=%d"
2387                     " but our local-mobile=%d\n",
2388                     st->localname, st->peer_mobile, st->local_mobile);
2389         free(st);
2390         return NULL;
2391     }
2392     if (st->peer_mobile && st->local_mobile) {
2393         Message(M_WARNING,"site %s: site is mobile but so are we"
2394                 " -> ignoring this site\n", st->remotename);
2395         free(st);
2396         return NULL;
2397     }
2398
2399     assert(index_sequence < 0xffffffffUL);
2400     st->index = ++index_sequence;
2401     st->local_capabilities = 0;
2402     st->early_capabilities = CAPAB_PRIORITY_MOBILE;
2403     st->netlink=find_cl_if(dict,"link",CL_NETLINK,True,"site",loc);
2404
2405 #define GET_CLOSURE_LIST(dictkey,things,nthings,CL_TYPE) do{            \
2406     list_t *things##_cfg=dict_lookup(dict,dictkey);                     \
2407     if (!things##_cfg)                                                  \
2408         cfgfatal(loc,"site","closure list \"%s\" not found\n",dictkey); \
2409     st->nthings=list_length(things##_cfg);                              \
2410     NEW_ARY(st->things,st->nthings);                                    \
2411     assert(st->nthings);                                                \
2412     for (i=0; i<st->nthings; i++) {                                     \
2413         item_t *item=list_elem(things##_cfg,i);                         \
2414         if (item->type!=t_closure)                                      \
2415             cfgfatal(loc,"site","%s is not a closure\n",dictkey);       \
2416         closure_t *cl=item->data.closure;                               \
2417         if (cl->type!=CL_TYPE)                                          \
2418             cfgfatal(loc,"site","%s closure wrong type\n",dictkey);     \
2419         st->things[i]=cl->interface;                                    \
2420     }                                                                   \
2421 }while(0)
2422
2423     GET_CLOSURE_LIST("comm",comms,ncomms,CL_COMM);
2424
2425     NEW_ARY(st->commclientinfos, st->ncomms);
2426     dict_t *comminfo = dict_read_dict(dict,"comm-info",False,"site",loc);
2427     for (i=0; i<st->ncomms; i++) {
2428         st->commclientinfos[i] =
2429             !comminfo ? 0 :
2430             st->comms[i]->clientinfo(st->comms[i],comminfo,loc);
2431     }
2432
2433     st->resolver=find_cl_if(dict,"resolver",CL_RESOLVER,True,"site",loc);
2434     st->log=find_cl_if(dict,"log",CL_LOG,True,"site",loc);
2435     st->random=find_cl_if(dict,"random",CL_RANDOMSRC,True,"site",loc);
2436
2437     struct hash_if *hash=0;
2438
2439     st->privkeys=find_cl_if(dict,"key-cache",CL_PRIVCACHE,False,"site",loc);
2440     if (!st->privkeys) {
2441         st->privkey_fixed=
2442             find_cl_if(dict,"local-key",CL_SIGPRIVKEY,True,"site",loc);
2443         SETUP_SETHASH(st->privkey_fixed);
2444     }
2445
2446     struct sigpubkey_if *fixed_pubkey
2447         =find_cl_if(dict,"key",CL_SIGPUBKEY,False,"site",loc);
2448     st->peerkeys_path=dict_read_string(dict,"peer-keys",fixed_pubkey==0,
2449                                        "site",loc);
2450     if (st->peerkeys_path) {
2451         pathprefix_template_init(&st->peerkeys_tmpl,st->peerkeys_path,
2452                                  PEERKEYS_SUFFIX_MAXLEN + 1 /* nul */);
2453         st->peerkeys_current=keyset_load(st->peerkeys_path,
2454                                          &st->scratch,st->log,M_ERR);
2455         if (fixed_pubkey) {
2456             fixed_pubkey->dispose(fixed_pubkey->st);
2457         }
2458     } else {
2459         assert(fixed_pubkey);
2460         SETUP_SETHASH(fixed_pubkey);
2461         NEW(st->peerkeys_current);
2462         st->peerkeys_current->refcount=1;
2463         st->peerkeys_current->nkeys=1;
2464         st->peerkeys_current->keys[0].id=keyid_zero;
2465         st->peerkeys_current->keys[0].pubkey=fixed_pubkey;
2466         slog(st,LOG_SIGKEYS,
2467              "using old-style fixed peer public key (no `peer-keys')");
2468     }
2469
2470     st->addresses=dict_read_string_array(dict,"address",False,"site",loc,0);
2471     if (st->addresses)
2472         st->remoteport=dict_read_number(dict,"port",True,"site",loc,0);
2473     else st->remoteport=0;
2474
2475     GET_CLOSURE_LIST("transform",transforms,ntransforms,CL_TRANSFORM);
2476
2477     st->dh=find_cl_if(dict,"dh",CL_DH,True,"site",loc);
2478
2479 #define DEFAULT(D) (st->peer_mobile || st->local_mobile \
2480                     ? DEFAULT_MOBILE_##D : DEFAULT_##D)
2481 #define CFG_NUMBER(k,D) dict_read_number(dict,(k),False,"site",loc,DEFAULT(D));
2482
2483     st->key_lifetime=         CFG_NUMBER("key-lifetime",  KEY_LIFETIME);
2484     st->setup_retries=        CFG_NUMBER("setup-retries", SETUP_RETRIES);
2485     st->setup_retry_interval= CFG_NUMBER("setup-timeout", SETUP_RETRY_INTERVAL);
2486     st->wait_timeout_mean=    CFG_NUMBER("wait-time",     WAIT_TIME);
2487     st->mtu_target= dict_read_number(dict,"mtu-target",False,"site",loc,0);
2488
2489     st->mobile_peer_expiry= dict_read_number(
2490        dict,"mobile-peer-expiry",False,"site",loc,DEFAULT_MOBILE_PEER_EXPIRY);
2491
2492     const char *peerskey= st->peer_mobile
2493         ? "mobile-peers-max" : "static-peers-max";
2494     st->transport_peers_max= dict_read_number(
2495         dict,peerskey,False,"site",loc, st->addresses ? 4 : 3);
2496     if (st->transport_peers_max<1 ||
2497         st->transport_peers_max>MAX_PEER_ADDRS) {
2498         cfgfatal(loc,"site", "%s must be in range 1.."
2499                  STRING(MAX_PEER_ADDRS) "\n", peerskey);
2500     }
2501
2502     if (st->key_lifetime < DEFAULT(KEY_RENEGOTIATE_GAP)*2)
2503         st->key_renegotiate_time=st->key_lifetime/2;
2504     else
2505         st->key_renegotiate_time=st->key_lifetime-DEFAULT(KEY_RENEGOTIATE_GAP);
2506     st->key_renegotiate_time=dict_read_number(
2507         dict,"renegotiate-time",False,"site",loc,st->key_renegotiate_time);
2508     if (st->key_renegotiate_time > st->key_lifetime) {
2509         cfgfatal(loc,"site",
2510                  "renegotiate-time must be less than key-lifetime\n");
2511     }
2512
2513     st->log_events=string_list_to_word(dict_lookup(dict,"log-events"),
2514                                        log_event_table,"site");
2515
2516     st->resolving_count=0;
2517     st->allow_send_prod=0;
2518
2519     st->tunname=safe_malloc(strlen(st->localname)+strlen(st->remotename)+5,
2520                             "site_apply");
2521     sprintf(st->tunname,"%s<->%s",st->localname,st->remotename);
2522
2523     /* The information we expect to see in incoming messages of type 1 */
2524     /* fixme: lots of unchecked overflows here, but the results are only
2525        corrupted packets rather than undefined behaviour */
2526     st->our_name_later=(strcmp(st->localname,st->remotename)>0);
2527
2528     buffer_new(&st->buffer,SETUP_BUFFER_LEN);
2529
2530     buffer_new(&st->scratch,SETUP_BUFFER_LEN);
2531     BUF_ALLOC(&st->scratch,"site:scratch");
2532
2533     /* We are interested in poll(), but only for timeouts. We don't have
2534        any fds of our own. */
2535     register_for_poll(st, site_beforepoll, site_afterpoll, "site");
2536     st->timeout=0;
2537
2538     st->remote_capabilities=0;
2539     st->chosen_transform=0;
2540     st->current.key_timeout=0;
2541     st->auxiliary_key.key_timeout=0;
2542     transport_peers_clear(st,&st->peers);
2543     transport_peers_clear(st,&st->setup_peers);
2544     /* XXX mlock these */
2545     st->dhsecret=safe_malloc(st->dh->len,"site:dhsecret");
2546     st->sharedsecretlen=st->sharedsecretallocd=0;
2547     st->sharedsecret=0;
2548
2549 #define SET_CAPBIT(bit) do {                                            \
2550     uint32_t capflag = 1UL << (bit);                                    \
2551     if (st->local_capabilities & capflag)                               \
2552         slog(st,LOG_ERROR,"capability bit"                              \
2553              " %d (%#"PRIx32") reused", (bit), capflag);                \
2554     st->local_capabilities |= capflag;                                  \
2555 } while (0)
2556
2557     for (i=0; i<st->ntransforms; i++)
2558         SET_CAPBIT(st->transforms[i]->capab_bit);
2559
2560 #undef SET_CAPBIT
2561
2562     if (st->local_mobile || st->peer_mobile)
2563         st->local_capabilities |= CAPAB_PRIORITY_MOBILE;
2564
2565     /* We need to register the remote networks with the netlink device */
2566     uint32_t netlink_mtu; /* local virtual interface mtu */
2567     st->netlink->reg(st->netlink->st, site_outgoing, st, &netlink_mtu);
2568     if (!st->mtu_target)
2569         st->mtu_target=netlink_mtu;
2570     
2571     for (i=0; i<st->ncomms; i++)
2572         st->comms[i]->request_notify(st->comms[i]->st, st, site_incoming);
2573
2574     st->current.transform=0;
2575     st->auxiliary_key.transform=0;
2576     st->new_transform=0;
2577     st->auxiliary_is_new=0;
2578
2579     enter_state_stop(st);
2580
2581     add_hook(PHASE_SHUTDOWN,site_phase_hook,st);
2582     add_hook(PHASE_CHILDPERSIST,site_childpersist_clearkeys,st);
2583
2584     return new_closure(&st->cl);
2585 }
2586
2587 void site_module(dict_t *dict)
2588 {
2589     add_closure(dict,"site",site_apply);
2590 }
2591
2592
2593 /***** TRANSPORT PEERS definitions *****/
2594
2595 static void transport_peers_debug(struct site *st, transport_peers *dst,
2596                                   const char *didwhat,
2597                                   int nargs, const struct comm_addr *args,
2598                                   size_t stride) {
2599     int i;
2600     char *argp;
2601
2602     if (!(st->log_events & LOG_PEER_ADDRS))
2603         return; /* an optimisation */
2604
2605     slog(st, LOG_PEER_ADDRS, "peers (%s) %s nargs=%d => npeers=%d",
2606          (dst==&st->peers ? "data" :
2607           dst==&st->setup_peers ? "setup" : "UNKNOWN"),
2608          didwhat, nargs, dst->npeers);
2609
2610     for (i=0, argp=(void*)args;
2611          i<nargs;
2612          i++, (argp+=stride?stride:sizeof(*args))) {
2613         const struct comm_addr *ca=(void*)argp;
2614         slog(st, LOG_PEER_ADDRS, " args: addrs[%d]=%s",
2615              i, comm_addr_to_string(ca));
2616     }
2617     for (i=0; i<dst->npeers; i++) {
2618         struct timeval diff;
2619         timersub(tv_now,&dst->peers[i].last,&diff);
2620         const struct comm_addr *ca=&dst->peers[i].addr;
2621         slog(st, LOG_PEER_ADDRS, " peers: addrs[%d]=%s T-%ld.%06ld",
2622              i, comm_addr_to_string(ca),
2623              (unsigned long)diff.tv_sec, (unsigned long)diff.tv_usec);
2624     }
2625 }
2626
2627 static void transport_peers_expire(struct site *st, transport_peers *peers) {
2628     /* peers must be sorted first */
2629     int previous_peers=peers->npeers;
2630     struct timeval oldest;
2631     oldest.tv_sec  = tv_now->tv_sec - st->mobile_peer_expiry;
2632     oldest.tv_usec = tv_now->tv_usec;
2633     while (peers->npeers>1 &&
2634            timercmp(&peers->peers[peers->npeers-1].last, &oldest, <))
2635         peers->npeers--;
2636     if (peers->npeers != previous_peers)
2637         transport_peers_debug(st,peers,"expire", 0,0,0);
2638 }
2639
2640 static bool_t transport_peer_record_one(struct site *st, transport_peers *peers,
2641                                         const struct comm_addr *ca,
2642                                         const struct timeval *tv) {
2643     /* returns false if output is full */
2644     int search;
2645
2646     if (peers->npeers >= st->transport_peers_max)
2647         return 0;
2648
2649     for (search=0; search<peers->npeers; search++)
2650         if (comm_addr_equal(&peers->peers[search].addr, ca))
2651             return 1;
2652
2653     peers->peers[peers->npeers].addr = *ca;
2654     peers->peers[peers->npeers].last = *tv;
2655     peers->npeers++;
2656     return 1;
2657 }
2658
2659 static void transport_record_peers(struct site *st, transport_peers *peers,
2660                                    const struct comm_addr *addrs, int naddrs,
2661                                    const char *m) {
2662     /* We add addrs into peers.  The new entries end up at the front
2663      * and displace entries towards the end (perhaps even off the
2664      * end).  Any existing matching entries are moved up to the front.
2665      *
2666      * Caller must first call transport_peers_expire. */
2667
2668     if (naddrs==1) {
2669         /* avoids debug for uninteresting updates */
2670         int i;
2671         for (i=0; i<peers->npeers; i++) {
2672             if (comm_addr_equal(&addrs[0], &peers->peers[i].addr)) {
2673                 memmove(peers->peers+1, peers->peers,
2674                         sizeof(peers->peers[0]) * i);
2675                 peers->peers[0].addr = addrs[0];
2676                 peers->peers[0].last = *tv_now;
2677                 return;
2678             }
2679         }
2680     }
2681
2682     int old_npeers=peers->npeers;
2683     transport_peer old_peers[old_npeers];
2684     COPY_ARRAY(old_peers,peers->peers,old_npeers);
2685
2686     peers->npeers=0;
2687     int i;
2688     for (i=0; i<naddrs; i++) {
2689         if (!transport_peer_record_one(st,peers, &addrs[i], tv_now))
2690             break;
2691     }
2692     for (i=0; i<old_npeers; i++) {
2693         const transport_peer *old=&old_peers[i];
2694         if (!transport_peer_record_one(st,peers, &old->addr, &old->last))
2695             break;
2696     }
2697
2698     transport_peers_debug(st,peers,m, naddrs,addrs,0);
2699 }
2700
2701 static void transport_expire_record_peers(struct site *st,
2702                                           transport_peers *peers,
2703                                           const struct comm_addr *addrs,
2704                                           int naddrs, const char *m) {
2705     /* Convenience function */
2706     transport_peers_expire(st,peers);
2707     transport_record_peers(st,peers,addrs,naddrs,m);
2708 }
2709
2710 static bool_t transport_compute_setupinit_peers(struct site *st,
2711         const struct comm_addr *configured_addrs /* 0 if none or not found */,
2712         int n_configured_addrs /* 0 if none or not found */,
2713         const struct comm_addr *incoming_packet_addr /* 0 if none */) {
2714     if (!n_configured_addrs && !incoming_packet_addr &&
2715         !transport_peers_valid(&st->peers))
2716         return False;
2717
2718     slog(st,LOG_SETUP_INIT,
2719          "using: %d configured addr(s);%s %d old peer addrs(es)",
2720          n_configured_addrs,
2721          incoming_packet_addr ? " incoming packet address;" : "",
2722          st->peers.npeers);
2723
2724     /* Non-mobile peers try addresses until one is plausible.  The
2725      * effect is that this code always tries first the configured
2726      * address if supplied, or otherwise the address of the incoming
2727      * PROD, or finally the existing data peer if one exists; this is
2728      * as desired. */
2729
2730     transport_peers_copy(st,&st->setup_peers,&st->peers);
2731     transport_peers_expire(st,&st->setup_peers);
2732
2733     if (incoming_packet_addr)
2734         transport_record_peers(st,&st->setup_peers,
2735                                incoming_packet_addr,1, "incoming");
2736
2737     if (n_configured_addrs)
2738         transport_record_peers(st,&st->setup_peers,
2739                               configured_addrs,n_configured_addrs, "setupinit");
2740
2741     assert(transport_peers_valid(&st->setup_peers));
2742     return True;
2743 }
2744
2745 static void transport_setup_msgok(struct site *st, const struct comm_addr *a) {
2746     if (st->peer_mobile)
2747         transport_expire_record_peers(st,&st->setup_peers,a,1,"setupmsg");
2748 }
2749 static void transport_data_msgok(struct site *st, const struct comm_addr *a) {
2750     if (st->peer_mobile)
2751         transport_expire_record_peers(st,&st->peers,a,1,"datamsg");
2752 }
2753
2754 static int transport_peers_valid(transport_peers *peers) {
2755     return peers->npeers;
2756 }
2757 static void transport_peers_clear(struct site *st, transport_peers *peers) {
2758     peers->npeers= 0;
2759     transport_peers_debug(st,peers,"clear",0,0,0);
2760 }
2761 static void transport_peers_copy(struct site *st, transport_peers *dst,
2762                                  const transport_peers *src) {
2763     dst->npeers=src->npeers;
2764     COPY_ARRAY(dst->peers, src->peers, dst->npeers);
2765     transport_peers_debug(st,dst,"copy",
2766                           src->npeers, &src->peers->addr, sizeof(*src->peers));
2767 }
2768
2769 static void transport_resolve_complete(struct site *st,
2770                                        const struct comm_addr *addrs,
2771                                        int naddrs) {
2772     transport_expire_record_peers(st,&st->peers,addrs,naddrs,
2773                                   "resolved data");
2774     transport_expire_record_peers(st,&st->setup_peers,addrs,naddrs,
2775                                   "resolved setup");
2776 }
2777
2778 static void transport_resolve_complete_tardy(struct site *st,
2779                                              const struct comm_addr *addrs,
2780                                              int naddrs) {
2781     transport_expire_record_peers(st,&st->peers,addrs,naddrs,
2782                                   "resolved tardily");
2783 }
2784
2785 static void transport_peers__copy_by_mask(transport_peer *out, int *nout_io,
2786                                           unsigned mask,
2787                                           const transport_peers *inp) {
2788     /* out and in->peers may be the same region, or nonoverlapping */
2789     const transport_peer *in=inp->peers;
2790     int slot;
2791     for (slot=0; slot<inp->npeers; slot++) {
2792         if (!(mask & (1U << slot)))
2793             continue;
2794         if (!(out==in && slot==*nout_io))
2795             COPY_OBJ(out[*nout_io], in[slot]);
2796         (*nout_io)++;
2797     }
2798 }
2799
2800 void transport_xmit(struct site *st, transport_peers *peers,
2801                     struct buffer_if *buf, bool_t candebug) {
2802     int slot;
2803     transport_peers_expire(st, peers);
2804     unsigned failed=0; /* bitmask */
2805     assert(MAX_PEER_ADDRS < sizeof(unsigned)*CHAR_BIT);
2806
2807     int nfailed=0;
2808     for (slot=0; slot<peers->npeers; slot++) {
2809         transport_peer *peer=&peers->peers[slot];
2810         bool_t ok = comm_addr_sendmsg(st, &peer->addr, buf);
2811         if (candebug)
2812             dump_packet(st, buf, &peer->addr, False, ok);
2813         if (!ok) {
2814             failed |= 1U << slot;
2815             nfailed++;
2816         }
2817         if (ok && !st->peer_mobile)
2818             break;
2819     }
2820     /* Now we need to demote/delete failing addrs: if we are mobile we
2821      * merely demote them; otherwise we delete them. */
2822     if (st->local_mobile) {
2823         unsigned expected = ((1U << nfailed)-1) << (peers->npeers-nfailed);
2824         /* `expected' has all the failures at the end already */
2825         if (failed != expected) {
2826             int fslot=0;
2827             transport_peer failedpeers[nfailed];
2828             transport_peers__copy_by_mask(failedpeers, &fslot, failed,peers);
2829             assert(fslot == nfailed);
2830             int wslot=0;
2831             transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers);
2832             assert(wslot+nfailed == peers->npeers);
2833             COPY_ARRAY(peers->peers+wslot, failedpeers, nfailed);
2834             transport_peers_debug(st,peers,"mobile failure reorder",0,0,0);
2835         }
2836     } else {
2837         if (failed && peers->npeers > 1) {
2838             int wslot=0;
2839             transport_peers__copy_by_mask(peers->peers,&wslot,~failed,peers);
2840             peers->npeers=wslot;
2841             transport_peers_debug(st,peers,"non-mobile failure cleanup",0,0,0);
2842         }
2843     }
2844 }
2845
2846 /***** END of transport peers declarations *****/