ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.C
Revision: 1.104
Committed: Fri Jul 19 18:18:27 2013 UTC (10 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.103: +19 -25 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     connection.C -- manage a single connection
3 root 1.98 Copyright (C) 2003-2008,2010,2011,2013 Marc Lehmann <gvpe@schmorp.de>
4 pcg 1.1
5 pcg 1.42 This file is part of GVPE.
6    
7 pcg 1.69 GVPE is free software; you can redistribute it and/or modify it
8     under the terms of the GNU General Public License as published by the
9     Free Software Foundation; either version 3 of the License, or (at your
10     option) any later version.
11    
12     This program 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 General
15     Public License for more details.
16    
17     You should have received a copy of the GNU General Public License along
18     with this program; if not, see <http://www.gnu.org/licenses/>.
19    
20     Additional permission under GNU GPL version 3 section 7
21    
22     If you modify this Program, or any covered work, by linking or
23     combining it with the OpenSSL project's OpenSSL library (or a modified
24     version of that library), containing parts covered by the terms of the
25     OpenSSL or SSLeay licenses, the licensors of this Program grant you
26     additional permission to convey the resulting work. Corresponding
27     Source for a non-source form of such a combination shall include the
28     source code for the parts of OpenSSL used as well as that of the
29     covered work.
30 pcg 1.1 */
31    
32     #include "config.h"
33    
34     #include <list>
35 pcg 1.70 #include <queue>
36     #include <utility>
37 pcg 1.1
38 pcg 1.2 #include <openssl/rand.h>
39     #include <openssl/evp.h>
40     #include <openssl/rsa.h>
41     #include <openssl/err.h>
42    
43 pcg 1.1 #include "conf.h"
44     #include "slog.h"
45     #include "device.h"
46 pcg 1.2 #include "vpn.h"
47 pcg 1.1 #include "connection.h"
48 root 1.98 #include "hkdf.h"
49 pcg 1.1
50 pcg 1.20 #include "netcompat.h"
51 pcg 1.19
52 root 1.98 #define MAGIC "gvpe\xbd\xc6\xdb\x82" // 8 bytes of magic
53 root 1.102 #define MAGIC "HUHN\xbd\xc6\xdb\x82" // 8 bytes of magic//D
54 pcg 1.30
55     #define ULTRA_FAST 1
56     #define HLOG 15
57     #include "lzf/lzf.h"
58     #include "lzf/lzf_c.c"
59     #include "lzf/lzf_d.c"
60 pcg 1.1
61 pcg 1.70 //////////////////////////////////////////////////////////////////////////////
62    
63     static std::queue< std::pair<run_script_cb *, const char *> > rs_queue;
64     static ev::child rs_child_ev;
65    
66 root 1.90 namespace
67 pcg 1.70 {
68 root 1.90 void // c++ requires external linkage here, apparently :(
69     rs_child_cb (ev::child &w, int revents)
70     {
71     w.stop ();
72 pcg 1.70
73 root 1.90 if (rs_queue.empty ())
74     return;
75 pcg 1.70
76 root 1.90 pid_t pid = run_script (*rs_queue.front ().first, false);
77     if (pid)
78     {
79     w.set (pid);
80     w.start ();
81     }
82     else
83     slog (L_WARN, rs_queue.front ().second);
84 pcg 1.70
85 root 1.90 delete rs_queue.front ().first;
86     rs_queue.pop ();
87     }
88     };
89 pcg 1.70
90     // despite the fancy name, this is quite a hack
91     static void
92     run_script_queued (run_script_cb *cb, const char *warnmsg)
93     {
94     rs_queue.push (std::make_pair (cb, warnmsg));
95    
96     if (!rs_child_ev.is_active ())
97     {
98     rs_child_ev.set<rs_child_cb> ();
99     rs_child_ev ();
100     }
101     }
102    
103     //////////////////////////////////////////////////////////////////////////////
104    
105 pcg 1.1 struct crypto_ctx
106     {
107     EVP_CIPHER_CTX cctx;
108     HMAC_CTX hctx;
109    
110 root 1.98 crypto_ctx (const auth_data &auth1, const auth_data &auth2, const ecdh_key &a, const ecdh_key &b, int enc);
111 pcg 1.1 ~crypto_ctx ();
112     };
113    
114 root 1.98 crypto_ctx::crypto_ctx (const auth_data &auth1, const auth_data &auth2, const ecdh_key &a, const ecdh_key &b, int enc)
115 pcg 1.1 {
116 root 1.98 ecdh_key s;
117    
118     curve25519_combine (a, b, s);
119    
120     {
121     u8 mac_key[MAC_KEYSIZE];
122     static const unsigned char mac_info[] = "gvpe mac key";
123    
124 root 1.99 hkdf kdf (auth2.rsa.hkdf_salt, sizeof (auth2.rsa.hkdf_salt), HKDF_XTR_HASH ());
125 root 1.98 kdf.extract (auth1.rsa.mac_key, sizeof (auth1.rsa.mac_key));
126     kdf.extract (s, sizeof (s));
127 root 1.99 kdf.extract_done (HKDF_PRF_HASH ());
128 root 1.98 kdf.expand (mac_key, sizeof (mac_key), mac_info, sizeof (mac_info));
129    
130     HMAC_CTX_init (&hctx);
131     require (HMAC_Init_ex (&hctx, mac_key, MAC_KEYSIZE, MAC_DIGEST (), 0));
132     }
133    
134     {
135     u8 cipher_key[CIPHER_KEYSIZE];
136     static const unsigned char cipher_info[] = "gvpe cipher key";
137    
138 root 1.99 hkdf kdf (auth2.rsa.hkdf_salt, sizeof (auth2.rsa.hkdf_salt), HKDF_XTR_HASH ());
139 root 1.98 kdf.extract (auth1.rsa.cipher_key, sizeof (auth1.rsa.cipher_key));
140     kdf.extract (s, sizeof (s));
141 root 1.99 kdf.extract_done (HKDF_PRF_HASH ());
142 root 1.98 kdf.expand (cipher_key, sizeof (cipher_key), cipher_info, sizeof (cipher_info));
143    
144     EVP_CIPHER_CTX_init (&cctx);
145     require (EVP_CipherInit_ex (&cctx, CIPHER (), 0, cipher_key, 0, enc));
146     }
147 pcg 1.1 }
148    
149     crypto_ctx::~crypto_ctx ()
150     {
151 pcg 1.29 require (EVP_CIPHER_CTX_cleanup (&cctx));
152 pcg 1.1 HMAC_CTX_cleanup (&hctx);
153     }
154    
155 root 1.98 static inline void
156     auth_encrypt (RSA *key, const auth_data &auth, auth_encr &encr)
157 pcg 1.1 {
158 root 1.98 if (RSA_public_encrypt (sizeof (auth.rsa),
159     (unsigned char *)&auth.rsa, (unsigned char *)&encr.rsa,
160     key, RSA_PKCS1_OAEP_PADDING) < 0)
161     fatal ("RSA_public_encrypt error");
162 root 1.100
163     memcpy (&encr.ecdh, &auth.ecdh, sizeof (encr.ecdh));
164 pcg 1.1 }
165    
166 root 1.98 static inline bool
167     auth_decrypt (RSA *key, const auth_encr &encr, auth_data &auth)
168 pcg 1.63 {
169 root 1.98 u8 rsa_decrypt[RSA_KEYLEN];
170 pcg 1.1
171 root 1.98 if (RSA_private_decrypt (sizeof (encr.rsa),
172     (const unsigned char *)&encr.rsa, (unsigned char *)rsa_decrypt,
173     key, RSA_PKCS1_OAEP_PADDING) != sizeof (auth.rsa))
174     return 0;
175 pcg 1.1
176 root 1.98 memcpy (&auth.rsa, rsa_decrypt, sizeof (auth.rsa));
177 root 1.100 memcpy (&auth.ecdh, &encr.ecdh, sizeof (auth.ecdh));
178 pcg 1.1
179 root 1.98 return 1;
180     }
181 pcg 1.1
182 root 1.98 static void
183 root 1.104 auth_hash (const auth_data &auth, const ecdh_key &b, auth_mac &mac)
184 root 1.98 {
185 root 1.104 hkdf kdf (&auth.ecdh, sizeof (auth.ecdh), AUTH_DIGEST ()); // use remote ecdh b as salt
186     kdf.extract (&auth.rsa, sizeof (auth.rsa));
187     kdf.extract_done ();
188     kdf.expand (mac, sizeof mac, b, sizeof b); // use response ecdh b as info
189 root 1.98 }
190 pcg 1.1
191 root 1.90 void
192 root 1.98 connection::generate_auth_data ()
193 pcg 1.1 {
194 root 1.98 if (auth_expire < ev_now ())
195 pcg 1.1 {
196 root 1.98 // request data
197 root 1.101 rand_fill (snd_auth.rsa);
198 root 1.98 curve25519_generate (snd_ecdh_a, snd_auth.ecdh);
199    
200     // eventual response data
201     curve25519_generate (rcv_ecdh_a, rcv_ecdh_b);
202 pcg 1.1 }
203 root 1.98
204     // every use prolongs the expiry
205     auth_expire = ev_now () + AUTH_TTL;
206 pcg 1.1 }
207    
208     //////////////////////////////////////////////////////////////////////////////
209    
210 pcg 1.67 pkt_queue::pkt_queue (double max_ttl, int max_queue)
211     : max_ttl (max_ttl), max_queue (max_queue)
212 pcg 1.1 {
213 pcg 1.67 queue = new pkt [max_queue];
214    
215     i = 0;
216     j = 0;
217    
218     expire.set<pkt_queue, &pkt_queue::expire_cb> (this);
219     }
220 pcg 1.1
221 pcg 1.67 pkt_queue::~pkt_queue ()
222     {
223     while (net_packet *p = get ())
224     delete p;
225 pcg 1.1
226 pcg 1.67 delete [] queue;
227 pcg 1.1 }
228    
229 root 1.90 void
230     pkt_queue::expire_cb (ev::timer &w, int revents)
231 pcg 1.1 {
232 pcg 1.67 ev_tstamp expire = ev_now () - max_ttl;
233 pcg 1.1
234 pcg 1.67 for (;;)
235 pcg 1.1 {
236 pcg 1.67 if (empty ())
237     break;
238    
239     double diff = queue[j].tstamp - expire;
240    
241     if (diff >= 0.)
242     {
243     w.start (diff > 0.5 ? diff : 0.5);
244     break;
245     }
246    
247     delete get ();
248 pcg 1.1 }
249     }
250    
251 root 1.90 void
252     pkt_queue::put (net_packet *p)
253 pcg 1.1 {
254 pcg 1.67 ev_tstamp now = ev_now ();
255    
256     // start expiry timer
257     if (empty ())
258     expire.start (max_ttl);
259    
260     int ni = i + 1 == max_queue ? 0 : i + 1;
261    
262     if (ni == j)
263     delete get ();
264    
265     queue[i].pkt = p;
266     queue[i].tstamp = now;
267    
268     i = ni;
269 pcg 1.1 }
270    
271 root 1.90 net_packet *
272     pkt_queue::get ()
273 pcg 1.1 {
274 pcg 1.67 if (empty ())
275     return 0;
276    
277     net_packet *p = queue[j].pkt;
278     queue[j].pkt = 0;
279    
280     j = j + 1 == max_queue ? 0 : j + 1;
281    
282     return p;
283 pcg 1.1 }
284    
285 pcg 1.63 struct net_rateinfo
286     {
287 pcg 1.1 u32 host;
288     double pcnt, diff;
289     tstamp last;
290     };
291    
292     // only do action once every x seconds per host whole allowing bursts.
293     // this implementation ("splay list" ;) is inefficient,
294     // but low on resources.
295     struct net_rate_limiter : list<net_rateinfo>
296     {
297 pcg 1.35 # define NRL_ALPHA (1. - 1. / 600.) // allow bursts
298     # define NRL_CUTOFF 10. // one event every CUTOFF seconds
299     # define NRL_EXPIRE (NRL_CUTOFF * 30.) // expire entries after this time
300     # define NRL_MAXDIF (NRL_CUTOFF * (1. / (1. - NRL_ALPHA))) // maximum diff /count value
301 pcg 1.1
302 pcg 1.16 bool can (const sockinfo &si) { return can((u32)si.host); }
303 pcg 1.1 bool can (u32 host);
304     };
305    
306 root 1.90 static net_rate_limiter auth_rate_limiter, reset_rate_limiter;
307 pcg 1.1
308 root 1.90 bool
309     net_rate_limiter::can (u32 host)
310 pcg 1.1 {
311     iterator i;
312    
313     for (i = begin (); i != end (); )
314     if (i->host == host)
315     break;
316 pcg 1.62 else if (i->last < ev_now () - NRL_EXPIRE)
317 pcg 1.1 i = erase (i);
318     else
319     i++;
320    
321     if (i == end ())
322     {
323     net_rateinfo ri;
324    
325     ri.host = host;
326     ri.pcnt = 1.;
327 pcg 1.34 ri.diff = NRL_MAXDIF;
328 pcg 1.62 ri.last = ev_now ();
329 pcg 1.1
330     push_front (ri);
331    
332     return true;
333     }
334     else
335     {
336     net_rateinfo ri (*i);
337     erase (i);
338    
339 pcg 1.34 ri.pcnt = ri.pcnt * NRL_ALPHA;
340 pcg 1.62 ri.diff = ri.diff * NRL_ALPHA + (ev_now () - ri.last);
341 pcg 1.1
342 pcg 1.62 ri.last = ev_now ();
343 pcg 1.1
344 pcg 1.10 double dif = ri.diff / ri.pcnt;
345 pcg 1.1
346 pcg 1.34 bool send = dif > NRL_CUTOFF;
347 pcg 1.10
348 pcg 1.34 if (dif > NRL_MAXDIF)
349 pcg 1.10 {
350     ri.pcnt = 1.;
351 pcg 1.34 ri.diff = NRL_MAXDIF;
352 pcg 1.10 }
353     else if (send)
354 pcg 1.1 ri.pcnt++;
355    
356     push_front (ri);
357    
358     return send;
359     }
360     }
361    
362     /////////////////////////////////////////////////////////////////////////////
363    
364 root 1.90 void
365 root 1.104 hmac_packet::hmac_gen (crypto_ctx *ctx, u8 *hmac_digest)
366 pcg 1.1 {
367     HMAC_CTX *hctx = &ctx->hctx;
368    
369 root 1.98 require (HMAC_Init_ex (hctx, 0, 0, 0, 0));
370 root 1.104 require (HMAC_Update (hctx, ((unsigned char *) this) + sizeof (hmac_packet), len - sizeof (hmac_packet)));
371     require (HMAC_Final (hctx, hmac_digest, 0));
372 pcg 1.1 }
373    
374     void
375     hmac_packet::hmac_set (crypto_ctx *ctx)
376     {
377 root 1.104 unsigned char hmac_digest[EVP_MAX_MD_SIZE];
378     hmac_gen (ctx, hmac_digest);
379 pcg 1.1 memcpy (hmac, hmac_digest, HMACLENGTH);
380     }
381    
382     bool
383     hmac_packet::hmac_chk (crypto_ctx *ctx)
384     {
385 root 1.104 unsigned char hmac_digest[EVP_MAX_MD_SIZE];
386     hmac_gen (ctx, hmac_digest);
387 pcg 1.1 return !memcmp (hmac, hmac_digest, HMACLENGTH);
388     }
389    
390 root 1.90 void
391     vpn_packet::set_hdr (ptype type_, unsigned int dst)
392 pcg 1.1 {
393 pcg 1.6 type = type_;
394 pcg 1.1
395     int src = THISNODE->id;
396    
397     src1 = src;
398     srcdst = ((src >> 8) << 4) | (dst >> 8);
399     dst1 = dst;
400     }
401    
402     #define MAXVPNDATA (MAX_MTU - 6 - 6)
403     #define DATAHDR (sizeof (u32) + RAND_SIZE)
404    
405 pcg 1.28 struct vpndata_packet : vpn_packet
406 root 1.90 {
407     u8 data[MAXVPNDATA + DATAHDR]; // seqno
408    
409     void setup (connection *conn, int dst, u8 *d, u32 len, u32 seqno);
410     tap_packet *unpack (connection *conn, u32 &seqno);
411 pcg 1.1
412     private:
413 root 1.90 const u32 data_hdr_size () const
414     {
415     return sizeof (vpndata_packet) - sizeof (net_packet) - MAXVPNDATA - DATAHDR;
416     }
417     };
418 pcg 1.1
419     void
420     vpndata_packet::setup (connection *conn, int dst, u8 *d, u32 l, u32 seqno)
421     {
422     EVP_CIPHER_CTX *cctx = &conn->octx->cctx;
423     int outl = 0, outl2;
424     ptype type = PT_DATA_UNCOMPRESSED;
425    
426     #if ENABLE_COMPRESSION
427     u8 cdata[MAX_MTU];
428    
429 pcg 1.86 if (conn->features & FEATURE_COMPRESSION)
430 pcg 1.1 {
431 pcg 1.31 u32 cl = lzf_compress (d, l, cdata + 2, (l - 2) & ~7);
432 pcg 1.1
433 pcg 1.31 if (cl)
434     {
435     type = PT_DATA_COMPRESSED;
436     d = cdata;
437     l = cl + 2;
438    
439     d[0] = cl >> 8;
440     d[1] = cl;
441     }
442 pcg 1.1 }
443     #endif
444    
445 root 1.98 require (EVP_CipherInit_ex (cctx, 0, 0, 0, 0, 1));
446 pcg 1.1
447     struct {
448     #if RAND_SIZE
449     u8 rnd[RAND_SIZE];
450     #endif
451     u32 seqno;
452     } datahdr;
453    
454     datahdr.seqno = ntohl (seqno);
455     #if RAND_SIZE
456 root 1.102 // NB: a constant (per session) random prefix
457     // is likely enough, but we don't take any chances.
458     conn->oiv.get (datahdr.rnd, RAND_SIZE);
459 pcg 1.1 #endif
460    
461 pcg 1.29 require (EVP_EncryptUpdate (cctx,
462 pcg 1.1 (unsigned char *) data + outl, &outl2,
463 pcg 1.29 (unsigned char *) &datahdr, DATAHDR));
464 pcg 1.1 outl += outl2;
465    
466 pcg 1.29 require (EVP_EncryptUpdate (cctx,
467 pcg 1.1 (unsigned char *) data + outl, &outl2,
468 pcg 1.29 (unsigned char *) d, l));
469 pcg 1.1 outl += outl2;
470    
471 pcg 1.29 require (EVP_EncryptFinal_ex (cctx, (unsigned char *) data + outl, &outl2));
472 pcg 1.1 outl += outl2;
473    
474     len = outl + data_hdr_size ();
475    
476     set_hdr (type, dst);
477    
478     hmac_set (conn->octx);
479     }
480    
481     tap_packet *
482     vpndata_packet::unpack (connection *conn, u32 &seqno)
483     {
484     EVP_CIPHER_CTX *cctx = &conn->ictx->cctx;
485     int outl = 0, outl2;
486     tap_packet *p = new tap_packet;
487     u8 *d;
488     u32 l = len - data_hdr_size ();
489    
490 root 1.98 require (EVP_CipherInit_ex (cctx, 0, 0, 0, 0, 0));
491 pcg 1.1
492     #if ENABLE_COMPRESSION
493     u8 cdata[MAX_MTU];
494    
495     if (type == PT_DATA_COMPRESSED)
496     d = cdata;
497     else
498     #endif
499 root 1.101 d = &(*p)[6 + 6] - DATAHDR;
500 pcg 1.1
501 root 1.101 // we play do evil games with the struct layout atm.
502     // pending better solutions, we at least do some verification.
503     // this is fine, as we left ISO territory long ago.
504     require (DATAHDR <= 16);
505     require ((u8 *)(&p->len + 1) == &(*p)[0]);
506    
507     // this can overwrite the len/dst/src fields
508 pcg 1.29 require (EVP_DecryptUpdate (cctx,
509 pcg 1.1 d, &outl2,
510 pcg 1.29 (unsigned char *)&data, len - data_hdr_size ()));
511 pcg 1.1 outl += outl2;
512    
513 pcg 1.29 require (EVP_DecryptFinal_ex (cctx, (unsigned char *)d + outl, &outl2));
514 pcg 1.1 outl += outl2;
515    
516     seqno = ntohl (*(u32 *)(d + RAND_SIZE));
517    
518     id2mac (dst () ? dst() : THISNODE->id, p->dst);
519     id2mac (src (), p->src);
520    
521     #if ENABLE_COMPRESSION
522     if (type == PT_DATA_COMPRESSED)
523     {
524     u32 cl = (d[DATAHDR] << 8) | d[DATAHDR + 1];
525    
526     p->len = lzf_decompress (d + DATAHDR + 2, cl < MAX_MTU ? cl : 0,
527     &(*p)[6 + 6], MAX_MTU)
528     + 6 + 6;
529     }
530     else
531     p->len = outl + (6 + 6 - DATAHDR);
532     #endif
533    
534     return p;
535     }
536    
537     struct ping_packet : vpn_packet
538     {
539     void setup (int dst, ptype type)
540     {
541     set_hdr (type, dst);
542     len = sizeof (*this) - sizeof (net_packet);
543     }
544     };
545    
546     struct config_packet : vpn_packet
547     {
548 root 1.103 u8 serial[SERIAL_SIZE];
549 root 1.98 u8 prot_major, prot_minor, randsize;
550     u8 flags, features, pad6, pad7, pad8;
551     u32 cipher_nid, mac_nid, auth_nid;
552 pcg 1.1
553     void setup (ptype type, int dst);
554 root 1.103 bool chk_config (const conf_node *conf, const sockinfo &rsi) const;
555 pcg 1.32
556     static u8 get_features ()
557     {
558     u8 f = 0;
559     #if ENABLE_COMPRESSION
560     f |= FEATURE_COMPRESSION;
561     #endif
562     #if ENABLE_ROHC
563     f |= FEATURE_ROHC;
564     #endif
565 pcg 1.59 #if ENABLE_BRIDGING
566     f |= FEATURE_BRIDGING;
567     #endif
568 pcg 1.32 return f;
569     }
570 pcg 1.1 };
571    
572 root 1.90 void
573     config_packet::setup (ptype type, int dst)
574 pcg 1.1 {
575     prot_major = PROTOCOL_MAJOR;
576     prot_minor = PROTOCOL_MINOR;
577     randsize = RAND_SIZE;
578 pcg 1.48 flags = 0;
579 pcg 1.32 features = get_features ();
580 pcg 1.1
581 root 1.103 strncpy ((char *)serial, conf.serial, sizeof (serial));
582    
583 root 1.98 cipher_nid = htonl (EVP_CIPHER_nid (CIPHER ()));
584     mac_nid = htonl (EVP_MD_type (MAC_DIGEST ()));
585     auth_nid = htonl (EVP_MD_type (AUTH_DIGEST ()));
586 pcg 1.1
587     len = sizeof (*this) - sizeof (net_packet);
588     set_hdr (type, dst);
589     }
590    
591 root 1.90 bool
592 root 1.103 config_packet::chk_config (const conf_node *conf, const sockinfo &rsi) const
593 pcg 1.1 {
594 pcg 1.15 if (prot_major != PROTOCOL_MAJOR)
595 root 1.103 slog (L_WARN, _("%s(%s): major version mismatch (remote %d <=> local %d)"),
596     conf->nodename, (const char *)rsi, prot_major, PROTOCOL_MAJOR);
597 pcg 1.15 else if (randsize != RAND_SIZE)
598 root 1.103 slog (L_WARN, _("%s(%s): rand size mismatch (remote %d <=> local %d)"),
599     conf->nodename, (const char *)rsi, randsize, RAND_SIZE);
600 root 1.98 else if (cipher_nid != htonl (EVP_CIPHER_nid (CIPHER ())))
601 root 1.103 slog (L_WARN, _("%s(%s): cipher algo mismatch (remote %x <=> local %x)"),
602     conf->nodename, (const char *)rsi, ntohl (cipher_nid), EVP_CIPHER_nid (CIPHER ()));
603 root 1.98 else if (mac_nid != htonl (EVP_MD_type (MAC_DIGEST ())))
604 root 1.103 slog (L_WARN, _("%s(%s): mac algo mismatch (remote %x <=> local %x)"),
605     conf->nodename, (const char *)rsi, ntohl (mac_nid), EVP_MD_type (MAC_DIGEST ()));
606 root 1.98 else if (auth_nid != htonl (EVP_MD_type (AUTH_DIGEST ())))
607 root 1.103 slog (L_WARN, _("%s(%s): auth algo mismatch (remote %x <=> local %x)"),
608     conf->nodename, (const char *)rsi, ntohl (auth_nid), EVP_MD_type (AUTH_DIGEST ()));
609 pcg 1.15 else
610 root 1.103 {
611     int cmp = memcmp (serial, ::conf.serial, sizeof (serial));
612    
613     if (cmp > 0)
614     slog (L_WARN, _("%s(%s): remote serial newer than local serial - outdated config?"),
615     conf->nodename, (const char *)rsi);
616     else if (cmp == 0)
617     return true;
618     }
619 pcg 1.15
620     return false;
621 pcg 1.1 }
622    
623 root 1.98 struct auth_req_packet : config_packet // UNPROTECTED
624 pcg 1.1 {
625     char magic[8];
626     u8 initiate; // false if this is just an automatic reply
627 pcg 1.28 u8 protocols; // supported protocols (will be patched on forward)
628 pcg 1.1 u8 pad2, pad3;
629 root 1.98 auth_encr encr;
630 pcg 1.1
631     auth_req_packet (int dst, bool initiate_, u8 protocols_)
632     {
633     config_packet::setup (PT_AUTH_REQ, dst);
634 root 1.98 memcpy (magic, MAGIC, 8);
635 pcg 1.1 initiate = !!initiate_;
636     protocols = protocols_;
637    
638     len = sizeof (*this) - sizeof (net_packet);
639     }
640     };
641    
642 root 1.103 struct auth_res_packet : vpn_packet // UNPROTECTED
643 pcg 1.1 {
644 root 1.98 auth_response response;
645 pcg 1.1
646     auth_res_packet (int dst)
647     {
648 root 1.103 set_hdr (PT_AUTH_RES, dst);
649 pcg 1.1
650     len = sizeof (*this) - sizeof (net_packet);
651     }
652     };
653    
654     struct connect_req_packet : vpn_packet
655     {
656     u8 id, protocols;
657     u8 pad1, pad2;
658    
659     connect_req_packet (int dst, int id_, u8 protocols_)
660     : id(id_)
661     , protocols(protocols_)
662     {
663     set_hdr (PT_CONNECT_REQ, dst);
664     len = sizeof (*this) - sizeof (net_packet);
665     }
666     };
667    
668     struct connect_info_packet : vpn_packet
669     {
670     u8 id, protocols;
671     u8 pad1, pad2;
672     sockinfo si;
673    
674     connect_info_packet (int dst, int id_, const sockinfo &si_, u8 protocols_)
675     : id(id_)
676     , protocols(protocols_)
677     , si(si_)
678     {
679     set_hdr (PT_CONNECT_INFO, dst);
680    
681     len = sizeof (*this) - sizeof (net_packet);
682     }
683     };
684    
685     /////////////////////////////////////////////////////////////////////////////
686    
687     void
688 root 1.98 connection::connection_established (const sockinfo &rsi)
689 pcg 1.10 {
690 root 1.98 if (!have_snd_auth || !have_rcv_auth)
691     return;
692    
693     si = rsi;
694     protocol = rsi.prot;
695    
696     slog (L_INFO, _("%s(%s): connection established (%s), protocol version %d.%d."),
697     conf->nodename, (const char *)rsi,
698     is_direct ? "direct" : "forwarded",
699     PROTOCOL_MAJOR, prot_minor);
700    
701     if (::conf.script_node_up)
702     {
703     run_script_cb *cb = new run_script_cb;
704     cb->set<connection, &connection::script_node_up> (this);
705     run_script_queued (cb, _("node-up command execution failed, continuing."));
706     }
707    
708     delete ictx; ictx = new crypto_ctx (rcv_auth, snd_auth, rcv_ecdh_a, rcv_auth.ecdh, 0);
709     iseqno.reset (ntohl (rcv_auth.rsa.seqno) & 0x7fffffff);
710    
711     delete octx; octx = new crypto_ctx (snd_auth, rcv_auth, snd_ecdh_a, snd_ecdh_b , 1);
712     oseqno = ntohl (snd_auth.rsa.seqno) & 0x7fffffff;
713 pcg 1.61
714 root 1.102 oiv.reset ();
715    
716     // make sure rekeying timeouts are slightly asymmetric
717     ev::tstamp rekey_interval = ::conf.rekey + (conf->id > THISNODE->id ? 10 : 0);
718     rekey.start (rekey_interval, rekey_interval);
719    
720     keepalive.start (::conf.keepalive);
721    
722     // send queued packets
723 pcg 1.10 if (ictx && octx)
724     {
725 root 1.102 while (tap_packet *p = (tap_packet *)data_queue.get ())
726     {
727     if (p->len) send_data_packet (p);
728     delete p;
729     }
730 root 1.97
731 root 1.102 while (vpn_packet *p = (vpn_packet *)vpn_queue.get ())
732 pcg 1.12 {
733 root 1.102 if (p->len) send_vpn_packet (p, si, IPTOS_RELIABILITY);
734     delete p;
735 pcg 1.12 }
736 root 1.102 }
737 pcg 1.73
738 root 1.102 vpn->connection_established (this);
739 pcg 1.10 }
740    
741     void
742 pcg 1.8 connection::reset_si ()
743 pcg 1.1 {
744 pcg 1.73 if (vpn->can_direct (THISNODE, conf))
745     protocol = best_protocol (THISNODE->protocols & conf->connectable_protocols ());
746     else
747 pcg 1.59 {
748 pcg 1.73 slog (L_TRACE, _("%s: direct connection denied by config."), conf->nodename);
749 pcg 1.59 protocol = 0;
750     }
751 pcg 1.6
752     si.set (conf, protocol);
753 pcg 1.73
754     is_direct = si.valid ();
755 pcg 1.1 }
756    
757 pcg 1.8 // ensure sockinfo is valid, forward if necessary
758     const sockinfo &
759     connection::forward_si (const sockinfo &si) const
760     {
761     if (!si.valid ())
762     {
763 pcg 1.73 connection *r = vpn->find_router_for (this);
764 pcg 1.8
765     if (r)
766     {
767 pcg 1.73 slog (L_DEBUG, _("%s: no common protocol, trying to route through %s."),
768     conf->nodename, r->conf->nodename);
769 pcg 1.8 return r->si;
770     }
771     else
772 pcg 1.73 slog (L_DEBUG, _("%s: node unreachable, no common protocol or no router available."),
773 pcg 1.8 conf->nodename);
774     }
775    
776     return si;
777     }
778    
779 pcg 1.1 void
780 pcg 1.10 connection::send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos)
781     {
782 pcg 1.46 if (!vpn->send_vpn_packet (pkt, si, tos))
783 pcg 1.10 reset_connection ();
784     }
785    
786     void
787 pcg 1.1 connection::send_ping (const sockinfo &si, u8 pong)
788     {
789     ping_packet *pkt = new ping_packet;
790    
791     pkt->setup (conf->id, pong ? ping_packet::PT_PONG : ping_packet::PT_PING);
792 pcg 1.73
793 pcg 1.79 slog (L_TRACE, "%s << %s [%s]", conf->nodename, pong ? "PT_PONG" : "PT_PING", (const char *)si);
794 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_LOWDELAY);
795 pcg 1.1
796     delete pkt;
797     }
798    
799     void
800     connection::send_reset (const sockinfo &si)
801     {
802     if (reset_rate_limiter.can (si) && connectmode != conf_node::C_DISABLED)
803     {
804     config_packet *pkt = new config_packet;
805    
806     pkt->setup (vpn_packet::PT_RESET, conf->id);
807 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_MINCOST);
808 pcg 1.1
809     delete pkt;
810     }
811     }
812    
813     void
814     connection::send_auth_request (const sockinfo &si, bool initiate)
815     {
816     auth_req_packet *pkt = new auth_req_packet (conf->id, initiate, THISNODE->protocols);
817    
818 root 1.98 generate_auth_data ();
819     auth_encrypt (conf->rsa_key, snd_auth, pkt->encr);
820 pcg 1.1
821 pcg 1.81 slog (L_TRACE, "%s << PT_AUTH_REQ [%s]", conf->nodename, (const char *)si);
822 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_RELIABILITY | IPTOS_LOWDELAY); // rsa is very very costly
823 pcg 1.1
824 pcg 1.6 delete pkt;
825 pcg 1.1 }
826    
827     void
828 root 1.98 connection::send_auth_response (const sockinfo &si)
829 pcg 1.1 {
830     auth_res_packet *pkt = new auth_res_packet (conf->id);
831    
832 root 1.104 memcpy (pkt->response.ecdh, rcv_ecdh_b, sizeof rcv_ecdh_b);
833     auth_hash (rcv_auth, rcv_ecdh_b, pkt->response.mac);
834 pcg 1.1
835 pcg 1.80 slog (L_TRACE, "%s << PT_AUTH_RES [%s]", conf->nodename, (const char *)si);
836 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_RELIABILITY); // rsa is very very costly
837 pcg 1.1
838     delete pkt;
839     }
840    
841     void
842     connection::send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols)
843     {
844 root 1.93 slog (L_TRACE, "%s << PT_CONNECT_INFO(%s,%s,p%02x)", conf->nodename,
845     vpn->conns[rid - 1]->conf->nodename, (const char *)rsi,
846     conf->protocols);
847 pcg 1.1
848     connect_info_packet *r = new connect_info_packet (conf->id, rid, rsi, rprotocols);
849    
850     r->hmac_set (octx);
851 pcg 1.10 send_vpn_packet (r, si);
852 pcg 1.1
853     delete r;
854     }
855    
856 pcg 1.66 inline void
857 pcg 1.60 connection::establish_connection_cb (ev::timer &w, int revents)
858 pcg 1.1 {
859 root 1.92 if (!(ictx && octx)
860 pcg 1.25 && conf != THISNODE
861     && connectmode != conf_node::C_NEVER
862     && connectmode != conf_node::C_DISABLED
863 pcg 1.60 && !w.is_active ())
864 pcg 1.1 {
865 pcg 1.67 // a bit hacky, if ondemand, and packets are no longer queued, then reset the connection
866     // and stop trying. should probably be handled by a per-connection expire handler.
867     if (connectmode == conf_node::C_ONDEMAND && vpn_queue.empty () && data_queue.empty ())
868     {
869     reset_connection ();
870     return;
871     }
872    
873 pcg 1.68 last_establish_attempt = ev_now ();
874    
875 pcg 1.60 ev::tstamp retry_int = ev::tstamp (retry_cnt & 3
876     ? (retry_cnt & 3) + 1
877     : 1 << (retry_cnt >> 2));
878 pcg 1.1
879 pcg 1.47 reset_si ();
880 pcg 1.1
881 pcg 1.47 bool slow = si.prot & PROT_SLOW;
882 pcg 1.8
883 pcg 1.73 if (si.prot && !si.host && vpn->can_direct (THISNODE, conf))
884 pcg 1.60 {
885     /*TODO*/ /* start the timer so we don't recurse endlessly */
886     w.start (1);
887 pcg 1.74 vpn->send_connect_request (this);
888 pcg 1.60 }
889 pcg 1.8 else
890 pcg 1.1 {
891 pcg 1.73 if (si.valid ())
892     slog (L_DEBUG, _("%s: sending direct connection request to %s."),
893     conf->nodename, (const char *)si);
894 pcg 1.61
895 pcg 1.8 const sockinfo &dsi = forward_si (si);
896 pcg 1.6
897 pcg 1.47 slow = slow || (dsi.prot & PROT_SLOW);
898    
899 pcg 1.8 if (dsi.valid () && auth_rate_limiter.can (dsi))
900     {
901     if (retry_cnt < 4)
902     send_auth_request (dsi, true);
903     else
904     send_ping (dsi, 0);
905     }
906 pcg 1.1 }
907 pcg 1.47
908 pcg 1.68 retry_int *= slow ? 8. : 0.9;
909 pcg 1.47
910     if (retry_int < conf->max_retry)
911     retry_cnt++;
912     else
913     retry_int = conf->max_retry;
914    
915 pcg 1.60 w.start (retry_int);
916 pcg 1.1 }
917     }
918    
919     void
920     connection::reset_connection ()
921     {
922     if (ictx && octx)
923     {
924     slog (L_INFO, _("%s(%s): connection lost"),
925     conf->nodename, (const char *)si);
926    
927     if (::conf.script_node_down)
928 pcg 1.64 {
929 pcg 1.70 run_script_cb *cb = new run_script_cb;
930     cb->set<connection, &connection::script_node_down> (this);
931     run_script_queued (cb, _("node-down command execution failed, continuing."));
932 pcg 1.64 }
933 pcg 1.1 }
934    
935     delete ictx; ictx = 0;
936     delete octx; octx = 0;
937    
938 pcg 1.38 si.host = 0;
939 pcg 1.1
940 root 1.98 have_snd_auth = false;
941     have_rcv_auth = false;
942     auth_expire = 0.;
943    
944 pcg 1.73 last_activity = 0.;
945     //last_si_change = 0.;
946 pcg 1.1 retry_cnt = 0;
947    
948 pcg 1.25 rekey.stop ();
949     keepalive.stop ();
950     establish_connection.stop ();
951 pcg 1.1 }
952    
953     void
954     connection::shutdown ()
955     {
956     if (ictx && octx)
957     send_reset (si);
958    
959     reset_connection ();
960     }
961    
962 pcg 1.73 // poor-man's rekeying
963 pcg 1.66 inline void
964 pcg 1.60 connection::rekey_cb (ev::timer &w, int revents)
965 pcg 1.1 {
966     reset_connection ();
967     establish_connection ();
968     }
969    
970     void
971 pcg 1.21 connection::send_data_packet (tap_packet *pkt)
972 pcg 1.1 {
973     vpndata_packet *p = new vpndata_packet;
974     int tos = 0;
975    
976 pcg 1.12 // I am not hilarious about peeking into packets, but so be it.
977 pcg 1.21 if (conf->inherit_tos && pkt->is_ipv4 ())
978 pcg 1.1 tos = (*pkt)[15] & IPTOS_TOS_MASK;
979    
980 pcg 1.21 p->setup (this, conf->id, &((*pkt)[6 + 6]), pkt->len - 6 - 6, ++oseqno); // skip 2 macs
981 pcg 1.10 send_vpn_packet (p, si, tos);
982 pcg 1.1
983     delete p;
984    
985     if (oseqno > MAX_SEQNO)
986     rekey ();
987     }
988    
989     void
990 pcg 1.68 connection::post_inject_queue ()
991     {
992     // force a connection every now and when when packets are sent (max 1/s)
993     if (ev_now () - last_establish_attempt >= 0.95) // arbitrary
994     establish_connection.stop ();
995    
996     establish_connection ();
997     }
998    
999     void
1000     connection::inject_data_packet (tap_packet *pkt)
1001 pcg 1.1 {
1002     if (ictx && octx)
1003 pcg 1.21 send_data_packet (pkt);
1004 pcg 1.1 else
1005     {
1006 pcg 1.68 data_queue.put (new tap_packet (*pkt));
1007     post_inject_queue ();
1008 pcg 1.1 }
1009     }
1010    
1011 root 1.90 void
1012     connection::inject_vpn_packet (vpn_packet *pkt, int tos)
1013 pcg 1.8 {
1014     if (ictx && octx)
1015 pcg 1.10 send_vpn_packet (pkt, si, tos);
1016 pcg 1.8 else
1017 pcg 1.12 {
1018 pcg 1.28 vpn_queue.put ((vpn_packet *)new data_packet (*(data_packet *)pkt));
1019 pcg 1.68 post_inject_queue ();
1020 pcg 1.12 }
1021 pcg 1.8 }
1022    
1023 pcg 1.1 void
1024     connection::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi)
1025     {
1026 pcg 1.62 last_activity = ev_now ();
1027 pcg 1.1
1028 root 1.91 slog (L_NOISE, "%s >> received packet type %d from %d to %d.",
1029 pcg 1.79 conf->nodename, pkt->typ (), pkt->src (), pkt->dst ());
1030 pcg 1.1
1031 pcg 1.61 if (connectmode == conf_node::C_DISABLED)
1032     return;
1033    
1034 pcg 1.1 switch (pkt->typ ())
1035     {
1036 pcg 1.3 case vpn_packet::PT_PING:
1037 pcg 1.79 slog (L_TRACE, "%s >> PT_PING", conf->nodename);
1038    
1039 pcg 1.3 // we send pings instead of auth packets after some retries,
1040     // so reset the retry counter and establish a connection
1041     // when we receive a ping.
1042 root 1.89 if (!ictx)
1043 pcg 1.3 {
1044     if (auth_rate_limiter.can (rsi))
1045     send_auth_request (rsi, true);
1046     }
1047     else
1048 root 1.89 // we would love to change the socket address here, but ping's aren't
1049 pcg 1.73 // authenticated, so we best ignore it.
1050 pcg 1.3 send_ping (rsi, 1); // pong
1051    
1052     break;
1053    
1054     case vpn_packet::PT_PONG:
1055 pcg 1.79 slog (L_TRACE, "%s >> PT_PONG", conf->nodename);
1056 root 1.89
1057     // a PONG might mean that the other side doesn't really know
1058     // about our desire for communication.
1059     establish_connection ();
1060 pcg 1.3 break;
1061    
1062     case vpn_packet::PT_RESET:
1063 pcg 1.1 {
1064 pcg 1.3 reset_connection ();
1065    
1066     config_packet *p = (config_packet *) pkt;
1067    
1068 root 1.103 if (p->chk_config (conf, rsi) && connectmode == conf_node::C_ALWAYS)
1069 pcg 1.3 establish_connection ();
1070 pcg 1.1 }
1071 pcg 1.3 break;
1072    
1073     case vpn_packet::PT_AUTH_REQ:
1074     if (auth_rate_limiter.can (rsi))
1075     {
1076 root 1.93 auth_req_packet *p = (auth_req_packet *)pkt;
1077 pcg 1.3
1078 root 1.93 slog (L_TRACE, "%s >> PT_AUTH_REQ(%s,p%02x,f%02x)",
1079     conf->nodename, p->initiate ? "initiate" : "reply",
1080     p->protocols, p->features);
1081 pcg 1.1
1082 root 1.103 if (memcmp (p->magic, MAGIC, 8))
1083     {
1084     slog (L_WARN, _("%s(%s): protocol magic mismatch - stray packet?"),
1085     conf->nodename, (const char *)rsi);
1086     }
1087     else if (p->chk_config (conf, rsi))
1088 pcg 1.3 {
1089     if (p->prot_minor != PROTOCOL_MINOR)
1090     slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
1091     conf->nodename, (const char *)rsi,
1092     PROTOCOL_MINOR, conf->nodename, p->prot_minor);
1093    
1094     if (p->initiate)
1095     send_auth_request (rsi, false);
1096    
1097 root 1.98 auth_data auth;
1098 pcg 1.3
1099 root 1.98 if (!auth_decrypt (::conf.rsa_key, p->encr, auth))
1100 pcg 1.23 {
1101     slog (L_ERR, _("%s(%s): challenge illegal or corrupted (%s). mismatched key or config file?"),
1102     conf->nodename, (const char *)rsi, ERR_error_string (ERR_get_error (), 0));
1103     }
1104 pcg 1.3 else
1105     {
1106 root 1.98 bool chg = !have_rcv_auth || memcmp (&rcv_auth, &auth, sizeof auth);
1107 pcg 1.1
1108 root 1.98 rcv_auth = auth;
1109     have_rcv_auth = true;
1110 pcg 1.1
1111 root 1.98 send_auth_response (rsi);
1112 pcg 1.10
1113 root 1.98 if (chg)
1114     {
1115     conf->protocols = p->protocols;
1116     features = p->features & config_packet::get_features ();
1117 pcg 1.3
1118 root 1.98 connection_established (rsi);
1119     }
1120     }
1121 pcg 1.10
1122 root 1.98 break;
1123 pcg 1.3 }
1124    
1125     send_reset (rsi);
1126 pcg 1.1 }
1127    
1128 pcg 1.3 break;
1129    
1130     case vpn_packet::PT_AUTH_RES:
1131 pcg 1.1 {
1132 pcg 1.79 auth_res_packet *p = (auth_res_packet *)pkt;
1133 pcg 1.1
1134 pcg 1.81 slog (L_TRACE, "%s >> PT_AUTH_RES", conf->nodename);
1135 pcg 1.1
1136 root 1.104 auth_mac local_mac;
1137     auth_hash (snd_auth, p->response.ecdh, local_mac);
1138    
1139     if (memcmp (&p->response.mac, local_mac, sizeof local_mac))
1140 pcg 1.1 {
1141 root 1.103 slog (L_ERR, _("%s(%s): unrequested or outdated auth response, ignoring."),
1142     conf->nodename, (const char *)rsi);
1143     }
1144     else if (!have_snd_auth)
1145     {
1146 root 1.104 memcpy (snd_ecdh_b, p->response.ecdh, sizeof snd_ecdh_b);
1147 root 1.98
1148 root 1.103 have_snd_auth = true;
1149     connection_established (rsi);
1150 pcg 1.1 }
1151 root 1.103
1152     break;
1153 pcg 1.1 }
1154    
1155 pcg 1.3 send_reset (rsi);
1156     break;
1157 pcg 1.1
1158 pcg 1.3 case vpn_packet::PT_DATA_COMPRESSED:
1159     #if !ENABLE_COMPRESSION
1160     send_reset (rsi);
1161     break;
1162     #endif
1163 pcg 1.1
1164 pcg 1.3 case vpn_packet::PT_DATA_UNCOMPRESSED:
1165 pcg 1.1
1166 pcg 1.3 if (ictx && octx)
1167 pcg 1.1 {
1168 pcg 1.3 vpndata_packet *p = (vpndata_packet *)pkt;
1169 pcg 1.1
1170 pcg 1.10 if (!p->hmac_chk (ictx))
1171     slog (L_ERR, _("%s(%s): hmac authentication error, received invalid packet\n"
1172 pcg 1.73 "could be an attack, or just corruption or a synchronization error."),
1173 pcg 1.10 conf->nodename, (const char *)rsi);
1174     else
1175 pcg 1.1 {
1176 pcg 1.10 u32 seqno;
1177     tap_packet *d = p->unpack (this, seqno);
1178 pcg 1.73 int seqclass = iseqno.seqno_classify (seqno);
1179 pcg 1.10
1180 pcg 1.73 if (seqclass == 0) // ok
1181 pcg 1.1 {
1182 pcg 1.10 vpn->tap->send (d);
1183 pcg 1.1
1184 pcg 1.10 if (si != rsi)
1185 pcg 1.1 {
1186 pcg 1.56 // fast re-sync on source address changes, useful especially for tcp/ip
1187 pcg 1.73 //if (last_si_change < ev_now () + 5.)
1188     // {
1189 pcg 1.78 slog (L_INFO, _("%s(%s): changing socket address to %s."),
1190     conf->nodename, (const char *)si, (const char *)rsi);
1191    
1192 pcg 1.73 si = rsi;
1193 pcg 1.84
1194     if (::conf.script_node_change)
1195     {
1196     run_script_cb *cb = new run_script_cb;
1197     cb->set<connection, &connection::script_node_change> (this);
1198     run_script_queued (cb, _("node-change command execution failed, continuing."));
1199     }
1200    
1201 pcg 1.73 // }
1202     //else
1203     // slog (L_INFO, _("%s(%s): accepted packet from %s, not (yet) redirecting traffic."),
1204     // conf->nodename, (const char *)si, (const char *)rsi);
1205 pcg 1.10 }
1206 pcg 1.32 }
1207 pcg 1.75 else if (seqclass == 1) // far history
1208     slog (L_ERR, _("received very old packet (received %08lx, expected %08lx). "
1209     "possible replay attack, or just packet duplication/delay, ignoring."), seqno, iseqno.seq + 1);
1210     else if (seqclass == 2) // in-window duplicate, happens often on wireless
1211     slog (L_DEBUG, _("received recent duplicated packet (received %08lx, expected %08lx). "
1212     "possible replay attack, or just packet duplication, ignoring."), seqno, iseqno.seq + 1);
1213     else if (seqclass == 3) // reset
1214 pcg 1.73 {
1215 pcg 1.75 slog (L_ERR, _("received out-of-sync (far future) packet (received %08lx, expected %08lx). "
1216     "probably just massive packet loss, sending reset."), seqno, iseqno.seq + 1);
1217 pcg 1.73 send_reset (rsi);
1218     }
1219 pcg 1.3
1220 pcg 1.32 delete d;
1221     break;
1222 pcg 1.1 }
1223     }
1224    
1225 pcg 1.3 send_reset (rsi);
1226     break;
1227 pcg 1.1
1228 pcg 1.3 case vpn_packet::PT_CONNECT_REQ:
1229     if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1230     {
1231 pcg 1.84 connect_req_packet *p = (connect_req_packet *)pkt;
1232 pcg 1.1
1233 pcg 1.57 if (p->id > 0 && p->id <= vpn->conns.size ())
1234     {
1235     connection *c = vpn->conns[p->id - 1];
1236     conf->protocols = p->protocols;
1237 pcg 1.1
1238 root 1.93 slog (L_TRACE, "%s >> PT_CONNECT_REQ(%s,p%02x) [%d]",
1239     conf->nodename, vpn->conns[p->id - 1]->conf->nodename,
1240     p->protocols,
1241     c->ictx && c->octx);
1242 pcg 1.1
1243 pcg 1.57 if (c->ictx && c->octx)
1244     {
1245     // send connect_info packets to both sides, in case one is
1246     // behind a nat firewall (or both ;)
1247     c->send_connect_info (conf->id, si, conf->protocols);
1248     send_connect_info (c->conf->id, c->si, c->conf->protocols);
1249     }
1250     else
1251     c->establish_connection ();
1252 pcg 1.3 }
1253 pcg 1.11 else
1254 pcg 1.57 slog (L_WARN,
1255     _("received authenticated connection request from unknown node #%d, config file mismatch?"),
1256     p->id);
1257 pcg 1.3 }
1258 pcg 1.1
1259 pcg 1.3 break;
1260 pcg 1.1
1261 pcg 1.3 case vpn_packet::PT_CONNECT_INFO:
1262     if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1263     {
1264 pcg 1.39 connect_info_packet *p = (connect_info_packet *)pkt;
1265 pcg 1.1
1266 pcg 1.57 if (p->id > 0 && p->id <= vpn->conns.size ())
1267 pcg 1.39 {
1268     connection *c = vpn->conns[p->id - 1];
1269 pcg 1.7
1270 pcg 1.39 c->conf->protocols = p->protocols;
1271     protocol = best_protocol (c->conf->protocols & THISNODE->protocols & p->si.supported_protocols (c->conf));
1272     p->si.upgrade_protocol (protocol, c->conf);
1273 pcg 1.1
1274 root 1.96 slog (L_TRACE, "%s >> PT_CONNECT_INFO(%s,%s,protocols=%02x,protocol=%02x,upgradable=%02x) [%d]",
1275 root 1.93 conf->nodename,
1276     vpn->conns[p->id - 1]->conf->nodename,
1277     (const char *)p->si,
1278     p->protocols,
1279 root 1.96 protocol,
1280     p->si.supported_protocols (c->conf),
1281 root 1.93 !c->ictx && !c->octx);
1282 pcg 1.7
1283 pcg 1.39 const sockinfo &dsi = forward_si (p->si);
1284 pcg 1.1
1285 pcg 1.39 if (dsi.valid ())
1286     c->send_auth_request (dsi, true);
1287 root 1.96 else
1288     slog (L_INFO, "connect info for %s received (%s), but still unable to contact.",
1289     vpn->conns[p->id - 1]->conf->nodename,
1290     (const char *)p->si);
1291 pcg 1.39 }
1292 pcg 1.57 else
1293     slog (L_WARN,
1294     _("received authenticated connection request from unknown node #%d, config file mismatch?"),
1295     p->id);
1296 pcg 1.3 }
1297 pcg 1.1
1298 pcg 1.3 break;
1299 pcg 1.1
1300 pcg 1.3 default:
1301     send_reset (rsi);
1302     break;
1303 pcg 1.1 }
1304     }
1305    
1306 pcg 1.66 inline void
1307     connection::keepalive_cb (ev::timer &w, int revents)
1308 pcg 1.1 {
1309 root 1.97 ev_tstamp when = last_activity + ::conf.keepalive - ev::now ();
1310    
1311     if (when >= 0)
1312     w.start (when);
1313     else if (when < -15)
1314 pcg 1.1 {
1315     reset_connection ();
1316     establish_connection ();
1317     }
1318     else if (conf->connectmode != conf_node::C_ONDEMAND
1319     || THISNODE->connectmode != conf_node::C_ONDEMAND)
1320     {
1321 root 1.97 w.start (3);
1322 pcg 1.1 send_ping (si);
1323     }
1324 root 1.97 else if (when >= -10)
1325 pcg 1.12 // hold ondemand connections implicitly a few seconds longer
1326     // should delete octx, though, or something like that ;)
1327 root 1.97 w.start (when + 10);
1328 pcg 1.1 else
1329     reset_connection ();
1330     }
1331    
1332 root 1.90 void
1333     connection::send_connect_request (int id)
1334 pcg 1.1 {
1335 root 1.93 connect_req_packet *p = new connect_req_packet (conf->id, id, THISNODE->protocols);
1336 pcg 1.1
1337 root 1.93 slog (L_TRACE, "%s << PT_CONNECT_REQ(%s,p%02x)",
1338     conf->nodename, vpn->conns[id - 1]->conf->nodename,
1339     THISNODE->protocols);
1340 pcg 1.1 p->hmac_set (octx);
1341 pcg 1.10 send_vpn_packet (p, si);
1342 pcg 1.1
1343     delete p;
1344     }
1345    
1346 root 1.90 void
1347     connection::script_init_env (const char *ext)
1348 pcg 1.53 {
1349     char *env;
1350     asprintf (&env, "IFUPDATA%s=%s", ext, conf->if_up_data); putenv (env);
1351 pcg 1.84 asprintf (&env, "NODENAME%s=%s", ext, conf->nodename); putenv (env);
1352 pcg 1.53 asprintf (&env, "MAC%s=%02x:%02x:%02x:%02x:%02x:%02x", ext,
1353     0xfe, 0xfd, 0x80, 0x00, conf->id >> 8,
1354 pcg 1.84 conf->id & 0xff); putenv (env);
1355 pcg 1.53 }
1356    
1357 root 1.90 void
1358     connection::script_init_connect_env ()
1359 pcg 1.1 {
1360 pcg 1.52 vpn->script_init_env ();
1361 pcg 1.1
1362     char *env;
1363 pcg 1.84 asprintf (&env, "DESTID=%d", conf->id); putenv (env);
1364     asprintf (&env, "DESTSI=%s", (const char *)si); putenv (env);
1365     asprintf (&env, "DESTNODE=%s", conf->nodename); putenv (env);
1366     asprintf (&env, "DESTIP=%s", si.ntoa ()); putenv (env);
1367     asprintf (&env, "DESTPORT=%d", ntohs (si.port)); putenv (env);
1368 pcg 1.1 }
1369    
1370 pcg 1.66 inline const char *
1371     connection::script_node_up ()
1372 pcg 1.1 {
1373 pcg 1.53 script_init_connect_env ();
1374 pcg 1.1
1375 pcg 1.60 putenv ((char *)"STATE=up");
1376 pcg 1.1
1377 pcg 1.52 char *filename;
1378     asprintf (&filename,
1379     "%s/%s",
1380     confbase,
1381     ::conf.script_node_up ? ::conf.script_node_up : "node-up");
1382 pcg 1.54
1383     return filename;
1384 pcg 1.1 }
1385    
1386 pcg 1.66 inline const char *
1387 pcg 1.84 connection::script_node_change ()
1388     {
1389     script_init_connect_env ();
1390    
1391     putenv ((char *)"STATE=change");
1392    
1393     char *filename;
1394     asprintf (&filename,
1395     "%s/%s",
1396     confbase,
1397     ::conf.script_node_change ? ::conf.script_node_change : "node-change");
1398    
1399     return filename;
1400     }
1401    
1402     inline const char *
1403 pcg 1.66 connection::script_node_down ()
1404 pcg 1.1 {
1405 pcg 1.53 script_init_connect_env ();
1406 pcg 1.1
1407 pcg 1.60 putenv ((char *)"STATE=down");
1408 pcg 1.1
1409 pcg 1.52 char *filename;
1410     asprintf (&filename,
1411     "%s/%s",
1412     confbase,
1413     ::conf.script_node_down ? ::conf.script_node_down : "node-down");
1414 pcg 1.54
1415     return filename;
1416 pcg 1.1 }
1417    
1418 pcg 1.40 connection::connection (struct vpn *vpn, conf_node *conf)
1419 pcg 1.67 : vpn(vpn), conf(conf),
1420 pcg 1.40 #if ENABLE_DNS
1421 pcg 1.67 dns (0),
1422 pcg 1.40 #endif
1423 pcg 1.72 data_queue(conf->max_ttl, conf->max_queue + 1),
1424     vpn_queue(conf->max_ttl, conf->max_queue + 1)
1425 pcg 1.1 {
1426 pcg 1.65 rekey .set<connection, &connection::rekey_cb > (this);
1427     keepalive .set<connection, &connection::keepalive_cb > (this);
1428     establish_connection.set<connection, &connection::establish_connection_cb> (this);
1429    
1430 pcg 1.68 last_establish_attempt = 0.;
1431 pcg 1.1 octx = ictx = 0;
1432    
1433 pcg 1.67 connectmode = conf->connectmode;
1434    
1435     // queue a dummy packet to force an initial connection attempt
1436     if (connectmode != conf_node::C_ALWAYS && connectmode != conf_node::C_DISABLED)
1437 pcg 1.68 vpn_queue.put (new net_packet);
1438 pcg 1.67
1439 pcg 1.1 reset_connection ();
1440     }
1441    
1442     connection::~connection ()
1443     {
1444     shutdown ();
1445     }
1446    
1447 root 1.90 void
1448     connection_init ()
1449 pcg 1.1 {
1450     auth_rate_limiter.clear ();
1451     reset_rate_limiter.clear ();
1452     }
1453