ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.C
Revision: 1.109
Committed: Fri Oct 11 07:56:07 2013 UTC (10 years, 7 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.108: +7 -4 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 root 1.109 bool slow = (si.prot & PROT_SLOW) || (conf->low_power || THISNODE->low_power);
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 root 1.109 // use ping after the first few retries
907     // TODO: on rekeys, the other node might not interpret ping correctly,
908     // TODO: as it will still have a valid connection
909     if (retry_cnt < 4 && (!conf->low_power || THISNODE->low_power))
910 pcg 1.8 send_auth_request (dsi, true);
911     else
912     send_ping (dsi, 0);
913     }
914 pcg 1.1 }
915 pcg 1.47
916 root 1.109 retry_int *= slow ? 4. : 0.9;
917 pcg 1.47
918     if (retry_int < conf->max_retry)
919     retry_cnt++;
920     else
921     retry_int = conf->max_retry;
922    
923 pcg 1.60 w.start (retry_int);
924 pcg 1.1 }
925     }
926    
927     void
928 root 1.108 connection::reset_connection (const char *reason)
929 pcg 1.1 {
930     if (ictx && octx)
931     {
932 root 1.108 slog (L_INFO, _("%s(%s): connection lost (%s)"),
933     conf->nodename, (const char *)si, reason);
934 pcg 1.1
935     if (::conf.script_node_down)
936 pcg 1.64 {
937 pcg 1.70 run_script_cb *cb = new run_script_cb;
938     cb->set<connection, &connection::script_node_down> (this);
939     run_script_queued (cb, _("node-down command execution failed, continuing."));
940 pcg 1.64 }
941 pcg 1.1 }
942    
943     delete ictx; ictx = 0;
944     delete octx; octx = 0;
945    
946 pcg 1.38 si.host = 0;
947 pcg 1.1
948 root 1.98 have_snd_auth = false;
949     have_rcv_auth = false;
950     auth_expire = 0.;
951    
952 pcg 1.73 last_activity = 0.;
953     //last_si_change = 0.;
954 pcg 1.1 retry_cnt = 0;
955    
956 pcg 1.25 rekey.stop ();
957     keepalive.stop ();
958     establish_connection.stop ();
959 pcg 1.1 }
960    
961     void
962     connection::shutdown ()
963     {
964     if (ictx && octx)
965     send_reset (si);
966    
967 root 1.108 reset_connection ("shutdown");
968 pcg 1.1 }
969    
970 pcg 1.73 // poor-man's rekeying
971 pcg 1.66 inline void
972 pcg 1.60 connection::rekey_cb (ev::timer &w, int revents)
973 pcg 1.1 {
974 root 1.108 reset_connection ("rekeying");
975 pcg 1.1 establish_connection ();
976     }
977    
978     void
979 pcg 1.21 connection::send_data_packet (tap_packet *pkt)
980 pcg 1.1 {
981     vpndata_packet *p = new vpndata_packet;
982     int tos = 0;
983    
984 pcg 1.12 // I am not hilarious about peeking into packets, but so be it.
985 pcg 1.21 if (conf->inherit_tos && pkt->is_ipv4 ())
986 pcg 1.1 tos = (*pkt)[15] & IPTOS_TOS_MASK;
987    
988 pcg 1.21 p->setup (this, conf->id, &((*pkt)[6 + 6]), pkt->len - 6 - 6, ++oseqno); // skip 2 macs
989 pcg 1.10 send_vpn_packet (p, si, tos);
990 pcg 1.1
991     delete p;
992    
993     if (oseqno > MAX_SEQNO)
994     rekey ();
995     }
996    
997     void
998 pcg 1.68 connection::post_inject_queue ()
999     {
1000     // force a connection every now and when when packets are sent (max 1/s)
1001 root 1.109 if (ev_now () - last_establish_attempt >= (conf->low_power || THISNODE->low_power ? 2.95 : 0.95)) // arbitrary
1002 pcg 1.68 establish_connection.stop ();
1003    
1004     establish_connection ();
1005     }
1006    
1007     void
1008     connection::inject_data_packet (tap_packet *pkt)
1009 pcg 1.1 {
1010     if (ictx && octx)
1011 pcg 1.21 send_data_packet (pkt);
1012 pcg 1.1 else
1013     {
1014 pcg 1.68 data_queue.put (new tap_packet (*pkt));
1015     post_inject_queue ();
1016 pcg 1.1 }
1017     }
1018    
1019 root 1.90 void
1020     connection::inject_vpn_packet (vpn_packet *pkt, int tos)
1021 pcg 1.8 {
1022     if (ictx && octx)
1023 pcg 1.10 send_vpn_packet (pkt, si, tos);
1024 pcg 1.8 else
1025 pcg 1.12 {
1026 pcg 1.28 vpn_queue.put ((vpn_packet *)new data_packet (*(data_packet *)pkt));
1027 pcg 1.68 post_inject_queue ();
1028 pcg 1.12 }
1029 pcg 1.8 }
1030    
1031 pcg 1.1 void
1032     connection::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi)
1033     {
1034 pcg 1.62 last_activity = ev_now ();
1035 pcg 1.1
1036 root 1.91 slog (L_NOISE, "%s >> received packet type %d from %d to %d.",
1037 pcg 1.79 conf->nodename, pkt->typ (), pkt->src (), pkt->dst ());
1038 pcg 1.1
1039 pcg 1.61 if (connectmode == conf_node::C_DISABLED)
1040     return;
1041    
1042 pcg 1.1 switch (pkt->typ ())
1043     {
1044 pcg 1.3 case vpn_packet::PT_PING:
1045 pcg 1.79 slog (L_TRACE, "%s >> PT_PING", conf->nodename);
1046    
1047 pcg 1.3 // we send pings instead of auth packets after some retries,
1048     // so reset the retry counter and establish a connection
1049     // when we receive a ping.
1050 root 1.89 if (!ictx)
1051 pcg 1.3 {
1052     if (auth_rate_limiter.can (rsi))
1053     send_auth_request (rsi, true);
1054     }
1055     else
1056 root 1.89 // we would love to change the socket address here, but ping's aren't
1057 pcg 1.73 // authenticated, so we best ignore it.
1058 pcg 1.3 send_ping (rsi, 1); // pong
1059    
1060     break;
1061    
1062     case vpn_packet::PT_PONG:
1063 pcg 1.79 slog (L_TRACE, "%s >> PT_PONG", conf->nodename);
1064 root 1.89
1065     // a PONG might mean that the other side doesn't really know
1066     // about our desire for communication.
1067     establish_connection ();
1068 pcg 1.3 break;
1069    
1070     case vpn_packet::PT_RESET:
1071 root 1.108 slog (L_TRACE, "%s >> PT_RESET", conf->nodename);
1072    
1073     if (ictx && octx)
1074     {
1075     reset_connection ("remote reset");
1076    
1077     config_packet *p = (config_packet *) pkt;
1078 pcg 1.3
1079 root 1.108 if (p->chk_config (conf, rsi) && connectmode == conf_node::C_ALWAYS)
1080     establish_connection ();
1081     }
1082 pcg 1.3
1083     break;
1084    
1085     case vpn_packet::PT_AUTH_REQ:
1086     if (auth_rate_limiter.can (rsi))
1087     {
1088 root 1.93 auth_req_packet *p = (auth_req_packet *)pkt;
1089 pcg 1.3
1090 root 1.93 slog (L_TRACE, "%s >> PT_AUTH_REQ(%s,p%02x,f%02x)",
1091     conf->nodename, p->initiate ? "initiate" : "reply",
1092     p->protocols, p->features);
1093 pcg 1.1
1094 root 1.103 if (memcmp (p->magic, MAGIC, 8))
1095     {
1096     slog (L_WARN, _("%s(%s): protocol magic mismatch - stray packet?"),
1097     conf->nodename, (const char *)rsi);
1098     }
1099     else if (p->chk_config (conf, rsi))
1100 pcg 1.3 {
1101     if (p->prot_minor != PROTOCOL_MINOR)
1102     slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
1103     conf->nodename, (const char *)rsi,
1104     PROTOCOL_MINOR, conf->nodename, p->prot_minor);
1105    
1106     if (p->initiate)
1107 root 1.108 {
1108     send_auth_request (rsi, false);
1109    
1110     if (ictx && octx)
1111     reset_connection ("reconnect");
1112     }
1113 pcg 1.3
1114 root 1.98 auth_data auth;
1115 pcg 1.3
1116 root 1.98 if (!auth_decrypt (::conf.rsa_key, p->encr, auth))
1117 pcg 1.23 {
1118     slog (L_ERR, _("%s(%s): challenge illegal or corrupted (%s). mismatched key or config file?"),
1119     conf->nodename, (const char *)rsi, ERR_error_string (ERR_get_error (), 0));
1120     }
1121 pcg 1.3 else
1122     {
1123 root 1.98 bool chg = !have_rcv_auth || memcmp (&rcv_auth, &auth, sizeof auth);
1124 pcg 1.1
1125 root 1.98 rcv_auth = auth;
1126     have_rcv_auth = true;
1127 pcg 1.1
1128 root 1.98 send_auth_response (rsi);
1129 pcg 1.10
1130 root 1.98 if (chg)
1131     {
1132     conf->protocols = p->protocols;
1133     features = p->features & config_packet::get_features ();
1134 pcg 1.3
1135 root 1.98 connection_established (rsi);
1136     }
1137     }
1138 pcg 1.10
1139 root 1.98 break;
1140 pcg 1.3 }
1141    
1142     send_reset (rsi);
1143 pcg 1.1 }
1144    
1145 pcg 1.3 break;
1146    
1147     case vpn_packet::PT_AUTH_RES:
1148 pcg 1.1 {
1149 pcg 1.79 auth_res_packet *p = (auth_res_packet *)pkt;
1150 pcg 1.1
1151 pcg 1.81 slog (L_TRACE, "%s >> PT_AUTH_RES", conf->nodename);
1152 pcg 1.1
1153 root 1.104 auth_mac local_mac;
1154     auth_hash (snd_auth, p->response.ecdh, local_mac);
1155    
1156     if (memcmp (&p->response.mac, local_mac, sizeof local_mac))
1157 pcg 1.1 {
1158 root 1.103 slog (L_ERR, _("%s(%s): unrequested or outdated auth response, ignoring."),
1159     conf->nodename, (const char *)rsi);
1160     }
1161     else if (!have_snd_auth)
1162     {
1163 root 1.104 memcpy (snd_ecdh_b, p->response.ecdh, sizeof snd_ecdh_b);
1164 root 1.98
1165 root 1.103 have_snd_auth = true;
1166     connection_established (rsi);
1167 pcg 1.1 }
1168     }
1169 pcg 1.3 break;
1170 pcg 1.1
1171 pcg 1.3 case vpn_packet::PT_DATA_COMPRESSED:
1172     #if !ENABLE_COMPRESSION
1173     send_reset (rsi);
1174     break;
1175     #endif
1176 pcg 1.1
1177 pcg 1.3 case vpn_packet::PT_DATA_UNCOMPRESSED:
1178 pcg 1.1
1179 pcg 1.3 if (ictx && octx)
1180 pcg 1.1 {
1181 pcg 1.3 vpndata_packet *p = (vpndata_packet *)pkt;
1182 pcg 1.1
1183 pcg 1.10 if (!p->hmac_chk (ictx))
1184 root 1.108 {
1185     // rekeying often creates temporary hmac auth floods
1186     // we assume they don't take longer than a few seconds normally,
1187     // and suppress messages and resets during that time.
1188     //TODO: should be done per source address
1189     if (!hmac_error)
1190     {
1191     hmac_error = ev_now () + 3;
1192     break;
1193     }
1194     else if (hmac_error >= ev_now ())
1195     break; // silently suppress
1196     else
1197     {
1198     slog (L_ERR, _("%s(%s): hmac authentication error, received invalid packet\n"
1199     "could be an attack, or just corruption or a synchronization error."),
1200     conf->nodename, (const char *)rsi);
1201     // reset
1202     }
1203     }
1204 pcg 1.10 else
1205 pcg 1.1 {
1206 pcg 1.10 u32 seqno;
1207     tap_packet *d = p->unpack (this, seqno);
1208 pcg 1.73 int seqclass = iseqno.seqno_classify (seqno);
1209 pcg 1.10
1210 root 1.108 hmac_error = 0;
1211    
1212 pcg 1.73 if (seqclass == 0) // ok
1213 pcg 1.1 {
1214 pcg 1.10 vpn->tap->send (d);
1215 pcg 1.1
1216 pcg 1.10 if (si != rsi)
1217 pcg 1.1 {
1218 pcg 1.56 // fast re-sync on source address changes, useful especially for tcp/ip
1219 pcg 1.73 //if (last_si_change < ev_now () + 5.)
1220     // {
1221 pcg 1.78 slog (L_INFO, _("%s(%s): changing socket address to %s."),
1222     conf->nodename, (const char *)si, (const char *)rsi);
1223    
1224 pcg 1.73 si = rsi;
1225 pcg 1.84
1226     if (::conf.script_node_change)
1227     {
1228     run_script_cb *cb = new run_script_cb;
1229     cb->set<connection, &connection::script_node_change> (this);
1230     run_script_queued (cb, _("node-change command execution failed, continuing."));
1231     }
1232    
1233 pcg 1.73 // }
1234     //else
1235     // slog (L_INFO, _("%s(%s): accepted packet from %s, not (yet) redirecting traffic."),
1236     // conf->nodename, (const char *)si, (const char *)rsi);
1237 pcg 1.10 }
1238 pcg 1.32 }
1239 pcg 1.75 else if (seqclass == 1) // far history
1240     slog (L_ERR, _("received very old packet (received %08lx, expected %08lx). "
1241     "possible replay attack, or just packet duplication/delay, ignoring."), seqno, iseqno.seq + 1);
1242     else if (seqclass == 2) // in-window duplicate, happens often on wireless
1243     slog (L_DEBUG, _("received recent duplicated packet (received %08lx, expected %08lx). "
1244     "possible replay attack, or just packet duplication, ignoring."), seqno, iseqno.seq + 1);
1245     else if (seqclass == 3) // reset
1246 pcg 1.73 {
1247 pcg 1.75 slog (L_ERR, _("received out-of-sync (far future) packet (received %08lx, expected %08lx). "
1248     "probably just massive packet loss, sending reset."), seqno, iseqno.seq + 1);
1249 pcg 1.73 send_reset (rsi);
1250     }
1251 pcg 1.3
1252 pcg 1.32 delete d;
1253     break;
1254 pcg 1.1 }
1255     }
1256    
1257 pcg 1.3 send_reset (rsi);
1258     break;
1259 pcg 1.1
1260 pcg 1.3 case vpn_packet::PT_CONNECT_REQ:
1261     if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1262     {
1263 pcg 1.84 connect_req_packet *p = (connect_req_packet *)pkt;
1264 pcg 1.1
1265 pcg 1.57 if (p->id > 0 && p->id <= vpn->conns.size ())
1266     {
1267     connection *c = vpn->conns[p->id - 1];
1268     conf->protocols = p->protocols;
1269 pcg 1.1
1270 root 1.93 slog (L_TRACE, "%s >> PT_CONNECT_REQ(%s,p%02x) [%d]",
1271     conf->nodename, vpn->conns[p->id - 1]->conf->nodename,
1272     p->protocols,
1273     c->ictx && c->octx);
1274 pcg 1.1
1275 pcg 1.57 if (c->ictx && c->octx)
1276     {
1277     // send connect_info packets to both sides, in case one is
1278     // behind a nat firewall (or both ;)
1279     c->send_connect_info (conf->id, si, conf->protocols);
1280     send_connect_info (c->conf->id, c->si, c->conf->protocols);
1281     }
1282     else
1283     c->establish_connection ();
1284 pcg 1.3 }
1285 pcg 1.11 else
1286 pcg 1.57 slog (L_WARN,
1287     _("received authenticated connection request from unknown node #%d, config file mismatch?"),
1288     p->id);
1289 pcg 1.3 }
1290 pcg 1.1
1291 pcg 1.3 break;
1292 pcg 1.1
1293 pcg 1.3 case vpn_packet::PT_CONNECT_INFO:
1294     if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1295     {
1296 pcg 1.39 connect_info_packet *p = (connect_info_packet *)pkt;
1297 pcg 1.1
1298 pcg 1.57 if (p->id > 0 && p->id <= vpn->conns.size ())
1299 pcg 1.39 {
1300     connection *c = vpn->conns[p->id - 1];
1301 pcg 1.7
1302 pcg 1.39 c->conf->protocols = p->protocols;
1303     protocol = best_protocol (c->conf->protocols & THISNODE->protocols & p->si.supported_protocols (c->conf));
1304     p->si.upgrade_protocol (protocol, c->conf);
1305 pcg 1.1
1306 root 1.96 slog (L_TRACE, "%s >> PT_CONNECT_INFO(%s,%s,protocols=%02x,protocol=%02x,upgradable=%02x) [%d]",
1307 root 1.93 conf->nodename,
1308     vpn->conns[p->id - 1]->conf->nodename,
1309     (const char *)p->si,
1310     p->protocols,
1311 root 1.96 protocol,
1312     p->si.supported_protocols (c->conf),
1313 root 1.93 !c->ictx && !c->octx);
1314 pcg 1.7
1315 pcg 1.39 const sockinfo &dsi = forward_si (p->si);
1316 pcg 1.1
1317 pcg 1.39 if (dsi.valid ())
1318     c->send_auth_request (dsi, true);
1319 root 1.96 else
1320     slog (L_INFO, "connect info for %s received (%s), but still unable to contact.",
1321     vpn->conns[p->id - 1]->conf->nodename,
1322     (const char *)p->si);
1323 pcg 1.39 }
1324 pcg 1.57 else
1325     slog (L_WARN,
1326     _("received authenticated connection request from unknown node #%d, config file mismatch?"),
1327     p->id);
1328 pcg 1.3 }
1329 pcg 1.1
1330 pcg 1.3 break;
1331 pcg 1.1
1332 pcg 1.3 default:
1333     send_reset (rsi);
1334     break;
1335 pcg 1.1 }
1336     }
1337    
1338 pcg 1.66 inline void
1339     connection::keepalive_cb (ev::timer &w, int revents)
1340 pcg 1.1 {
1341 root 1.97 ev_tstamp when = last_activity + ::conf.keepalive - ev::now ();
1342    
1343     if (when >= 0)
1344     w.start (when);
1345     else if (when < -15)
1346 pcg 1.1 {
1347 root 1.108 reset_connection ("keepalive overdue");
1348 pcg 1.1 establish_connection ();
1349     }
1350     else if (conf->connectmode != conf_node::C_ONDEMAND
1351     || THISNODE->connectmode != conf_node::C_ONDEMAND)
1352     {
1353 root 1.97 w.start (3);
1354 pcg 1.1 send_ping (si);
1355     }
1356 root 1.97 else if (when >= -10)
1357 pcg 1.12 // hold ondemand connections implicitly a few seconds longer
1358     // should delete octx, though, or something like that ;)
1359 root 1.97 w.start (when + 10);
1360 pcg 1.1 else
1361 root 1.108 reset_connection ("keepalive timeout");
1362 pcg 1.1 }
1363    
1364 root 1.90 void
1365     connection::send_connect_request (int id)
1366 pcg 1.1 {
1367 root 1.93 connect_req_packet *p = new connect_req_packet (conf->id, id, THISNODE->protocols);
1368 pcg 1.1
1369 root 1.93 slog (L_TRACE, "%s << PT_CONNECT_REQ(%s,p%02x)",
1370     conf->nodename, vpn->conns[id - 1]->conf->nodename,
1371     THISNODE->protocols);
1372 pcg 1.1 p->hmac_set (octx);
1373 pcg 1.10 send_vpn_packet (p, si);
1374 pcg 1.1
1375     delete p;
1376     }
1377    
1378 root 1.90 void
1379     connection::script_init_env (const char *ext)
1380 pcg 1.53 {
1381     char *env;
1382     asprintf (&env, "IFUPDATA%s=%s", ext, conf->if_up_data); putenv (env);
1383 pcg 1.84 asprintf (&env, "NODENAME%s=%s", ext, conf->nodename); putenv (env);
1384 pcg 1.53 asprintf (&env, "MAC%s=%02x:%02x:%02x:%02x:%02x:%02x", ext,
1385     0xfe, 0xfd, 0x80, 0x00, conf->id >> 8,
1386 pcg 1.84 conf->id & 0xff); putenv (env);
1387 pcg 1.53 }
1388    
1389 root 1.90 void
1390     connection::script_init_connect_env ()
1391 pcg 1.1 {
1392 pcg 1.52 vpn->script_init_env ();
1393 pcg 1.1
1394     char *env;
1395 pcg 1.84 asprintf (&env, "DESTID=%d", conf->id); putenv (env);
1396     asprintf (&env, "DESTSI=%s", (const char *)si); putenv (env);
1397     asprintf (&env, "DESTNODE=%s", conf->nodename); putenv (env);
1398     asprintf (&env, "DESTIP=%s", si.ntoa ()); putenv (env);
1399     asprintf (&env, "DESTPORT=%d", ntohs (si.port)); putenv (env);
1400 pcg 1.1 }
1401    
1402 pcg 1.66 inline const char *
1403     connection::script_node_up ()
1404 pcg 1.1 {
1405 pcg 1.53 script_init_connect_env ();
1406 pcg 1.1
1407 pcg 1.60 putenv ((char *)"STATE=up");
1408 pcg 1.1
1409 pcg 1.52 char *filename;
1410     asprintf (&filename,
1411     "%s/%s",
1412     confbase,
1413     ::conf.script_node_up ? ::conf.script_node_up : "node-up");
1414 pcg 1.54
1415     return filename;
1416 pcg 1.1 }
1417    
1418 pcg 1.66 inline const char *
1419 pcg 1.84 connection::script_node_change ()
1420     {
1421     script_init_connect_env ();
1422    
1423     putenv ((char *)"STATE=change");
1424    
1425     char *filename;
1426     asprintf (&filename,
1427     "%s/%s",
1428     confbase,
1429     ::conf.script_node_change ? ::conf.script_node_change : "node-change");
1430    
1431     return filename;
1432     }
1433    
1434     inline const char *
1435 pcg 1.66 connection::script_node_down ()
1436 pcg 1.1 {
1437 pcg 1.53 script_init_connect_env ();
1438 pcg 1.1
1439 pcg 1.60 putenv ((char *)"STATE=down");
1440 pcg 1.1
1441 pcg 1.52 char *filename;
1442     asprintf (&filename,
1443     "%s/%s",
1444     confbase,
1445     ::conf.script_node_down ? ::conf.script_node_down : "node-down");
1446 pcg 1.54
1447     return filename;
1448 pcg 1.1 }
1449    
1450 pcg 1.40 connection::connection (struct vpn *vpn, conf_node *conf)
1451 pcg 1.67 : vpn(vpn), conf(conf),
1452 pcg 1.40 #if ENABLE_DNS
1453 pcg 1.67 dns (0),
1454 pcg 1.40 #endif
1455 pcg 1.72 data_queue(conf->max_ttl, conf->max_queue + 1),
1456     vpn_queue(conf->max_ttl, conf->max_queue + 1)
1457 pcg 1.1 {
1458 pcg 1.65 rekey .set<connection, &connection::rekey_cb > (this);
1459     keepalive .set<connection, &connection::keepalive_cb > (this);
1460     establish_connection.set<connection, &connection::establish_connection_cb> (this);
1461    
1462 pcg 1.68 last_establish_attempt = 0.;
1463 pcg 1.1 octx = ictx = 0;
1464    
1465 pcg 1.67 connectmode = conf->connectmode;
1466    
1467     // queue a dummy packet to force an initial connection attempt
1468     if (connectmode != conf_node::C_ALWAYS && connectmode != conf_node::C_DISABLED)
1469 pcg 1.68 vpn_queue.put (new net_packet);
1470 pcg 1.67
1471 root 1.108 reset_connection ("startup");
1472 pcg 1.1 }
1473    
1474     connection::~connection ()
1475     {
1476     shutdown ();
1477     }
1478    
1479 root 1.90 void
1480     connection_init ()
1481 pcg 1.1 {
1482     auth_rate_limiter.clear ();
1483     reset_rate_limiter.clear ();
1484     }
1485