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