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