ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.C
Revision: 1.43
Committed: Fri Mar 4 04:52:38 2005 UTC (19 years, 2 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.42: +1 -3 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     connection.C -- manage a single connection
3 pcg 1.42 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de>
4 pcg 1.1
5 pcg 1.42 This file is part of GVPE.
6    
7     GVPE is free software; you can redistribute it and/or modify
8 pcg 1.1 it under the terms of the GNU General Public License as published by
9     the Free Software Foundation; either version 2 of the License, or
10     (at your option) any later version.
11    
12     This program is distributed in the hope that it will be useful,
13     but WITHOUT ANY WARRANTY; without even the implied warranty of
14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     GNU General Public License for more details.
16    
17     You should have received a copy of the GNU General Public License
18 pcg 1.42 along with gvpe; if not, write to the Free Software
19 pcg 1.1 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20     */
21    
22     #include "config.h"
23    
24 pcg 1.25 #include <cassert>
25    
26 pcg 1.1 #include <list>
27    
28 pcg 1.2 #include <openssl/rand.h>
29     #include <openssl/evp.h>
30     #include <openssl/rsa.h>
31     #include <openssl/err.h>
32    
33 pcg 1.1 #include "gettext.h"
34    
35     #include "conf.h"
36     #include "slog.h"
37     #include "device.h"
38 pcg 1.2 #include "vpn.h"
39 pcg 1.1 #include "connection.h"
40    
41 pcg 1.20 #include "netcompat.h"
42 pcg 1.19
43 pcg 1.1 #if !HAVE_RAND_PSEUDO_BYTES
44     # define RAND_pseudo_bytes RAND_bytes
45     #endif
46    
47     #define MAGIC "vped\xbd\xc6\xdb\x82" // 8 bytes of magic
48 pcg 1.30
49     #define ULTRA_FAST 1
50     #define HLOG 15
51     #include "lzf/lzf.h"
52     #include "lzf/lzf_c.c"
53     #include "lzf/lzf_d.c"
54 pcg 1.1
55     struct crypto_ctx
56     {
57     EVP_CIPHER_CTX cctx;
58     HMAC_CTX hctx;
59    
60     crypto_ctx (const rsachallenge &challenge, int enc);
61     ~crypto_ctx ();
62     };
63    
64     crypto_ctx::crypto_ctx (const rsachallenge &challenge, int enc)
65     {
66     EVP_CIPHER_CTX_init (&cctx);
67 pcg 1.29 require (EVP_CipherInit_ex (&cctx, CIPHER, 0, &challenge[CHG_CIPHER_KEY], 0, enc));
68 pcg 1.1 HMAC_CTX_init (&hctx);
69     HMAC_Init_ex (&hctx, &challenge[CHG_HMAC_KEY], HMAC_KEYLEN, DIGEST, 0);
70     }
71    
72     crypto_ctx::~crypto_ctx ()
73     {
74 pcg 1.29 require (EVP_CIPHER_CTX_cleanup (&cctx));
75 pcg 1.1 HMAC_CTX_cleanup (&hctx);
76     }
77    
78     static void
79     rsa_hash (const rsaid &id, const rsachallenge &chg, rsaresponse &h)
80     {
81     EVP_MD_CTX ctx;
82    
83     EVP_MD_CTX_init (&ctx);
84 pcg 1.29 require (EVP_DigestInit (&ctx, RSA_HASH));
85     require (EVP_DigestUpdate(&ctx, &chg, sizeof chg));
86     require (EVP_DigestUpdate(&ctx, &id, sizeof id));
87     require (EVP_DigestFinal (&ctx, (unsigned char *)&h, 0));
88 pcg 1.1 EVP_MD_CTX_cleanup (&ctx);
89     }
90    
91     struct rsa_entry {
92     tstamp expire;
93     rsaid id;
94     rsachallenge chg;
95     };
96    
97     struct rsa_cache : list<rsa_entry>
98     {
99 pcg 1.4 void cleaner_cb (time_watcher &w); time_watcher cleaner;
100 pcg 1.1
101     bool find (const rsaid &id, rsachallenge &chg)
102     {
103     for (iterator i = begin (); i != end (); ++i)
104     {
105     if (!memcmp (&id, &i->id, sizeof id) && i->expire > NOW)
106     {
107     memcpy (&chg, &i->chg, sizeof chg);
108    
109     erase (i);
110     return true;
111     }
112     }
113    
114     if (cleaner.at < NOW)
115     cleaner.start (NOW + RSA_TTL);
116    
117     return false;
118     }
119    
120     void gen (rsaid &id, rsachallenge &chg)
121     {
122     rsa_entry e;
123    
124     RAND_bytes ((unsigned char *)&id, sizeof id);
125     RAND_bytes ((unsigned char *)&chg, sizeof chg);
126    
127     e.expire = NOW + RSA_TTL;
128     e.id = id;
129     memcpy (&e.chg, &chg, sizeof chg);
130    
131     push_back (e);
132    
133     if (cleaner.at < NOW)
134     cleaner.start (NOW + RSA_TTL);
135     }
136    
137     rsa_cache ()
138     : cleaner (this, &rsa_cache::cleaner_cb)
139     { }
140    
141     } rsa_cache;
142    
143 pcg 1.4 void rsa_cache::cleaner_cb (time_watcher &w)
144 pcg 1.1 {
145 pcg 1.25 if (!empty ())
146 pcg 1.1 {
147 pcg 1.25 w.start (NOW + RSA_TTL);
148 pcg 1.1
149     for (iterator i = begin (); i != end (); )
150     if (i->expire <= NOW)
151     i = erase (i);
152     else
153     ++i;
154     }
155     }
156    
157     //////////////////////////////////////////////////////////////////////////////
158    
159 pcg 1.12 void pkt_queue::put (net_packet *p)
160 pcg 1.1 {
161     if (queue[i])
162     {
163     delete queue[i];
164     j = (j + 1) % QUEUEDEPTH;
165     }
166    
167     queue[i] = p;
168    
169     i = (i + 1) % QUEUEDEPTH;
170     }
171    
172 pcg 1.12 net_packet *pkt_queue::get ()
173 pcg 1.1 {
174 pcg 1.12 net_packet *p = queue[j];
175 pcg 1.1
176     if (p)
177     {
178     queue[j] = 0;
179     j = (j + 1) % QUEUEDEPTH;
180     }
181    
182     return p;
183     }
184    
185     pkt_queue::pkt_queue ()
186     {
187     memset (queue, 0, sizeof (queue));
188     i = 0;
189     j = 0;
190     }
191    
192     pkt_queue::~pkt_queue ()
193     {
194     for (i = QUEUEDEPTH; --i > 0; )
195     delete queue[i];
196     }
197    
198     struct net_rateinfo {
199     u32 host;
200     double pcnt, diff;
201     tstamp last;
202     };
203    
204     // only do action once every x seconds per host whole allowing bursts.
205     // this implementation ("splay list" ;) is inefficient,
206     // but low on resources.
207     struct net_rate_limiter : list<net_rateinfo>
208     {
209 pcg 1.35 # define NRL_ALPHA (1. - 1. / 600.) // allow bursts
210     # define NRL_CUTOFF 10. // one event every CUTOFF seconds
211     # define NRL_EXPIRE (NRL_CUTOFF * 30.) // expire entries after this time
212     # define NRL_MAXDIF (NRL_CUTOFF * (1. / (1. - NRL_ALPHA))) // maximum diff /count value
213 pcg 1.1
214 pcg 1.16 bool can (const sockinfo &si) { return can((u32)si.host); }
215 pcg 1.1 bool can (u32 host);
216     };
217    
218     net_rate_limiter auth_rate_limiter, reset_rate_limiter;
219    
220     bool net_rate_limiter::can (u32 host)
221     {
222     iterator i;
223    
224     for (i = begin (); i != end (); )
225     if (i->host == host)
226     break;
227 pcg 1.34 else if (i->last < NOW - NRL_EXPIRE)
228 pcg 1.1 i = erase (i);
229     else
230     i++;
231    
232     if (i == end ())
233     {
234     net_rateinfo ri;
235    
236     ri.host = host;
237     ri.pcnt = 1.;
238 pcg 1.34 ri.diff = NRL_MAXDIF;
239 pcg 1.1 ri.last = NOW;
240    
241     push_front (ri);
242    
243     return true;
244     }
245     else
246     {
247     net_rateinfo ri (*i);
248     erase (i);
249    
250 pcg 1.34 ri.pcnt = ri.pcnt * NRL_ALPHA;
251     ri.diff = ri.diff * NRL_ALPHA + (NOW - ri.last);
252 pcg 1.1
253     ri.last = NOW;
254    
255 pcg 1.10 double dif = ri.diff / ri.pcnt;
256 pcg 1.1
257 pcg 1.34 bool send = dif > NRL_CUTOFF;
258 pcg 1.10
259 pcg 1.34 if (dif > NRL_MAXDIF)
260 pcg 1.10 {
261     ri.pcnt = 1.;
262 pcg 1.34 ri.diff = NRL_MAXDIF;
263 pcg 1.10 }
264     else if (send)
265 pcg 1.1 ri.pcnt++;
266    
267     push_front (ri);
268    
269     return send;
270     }
271     }
272    
273     /////////////////////////////////////////////////////////////////////////////
274    
275     unsigned char hmac_packet::hmac_digest[EVP_MAX_MD_SIZE];
276    
277     void hmac_packet::hmac_gen (crypto_ctx *ctx)
278     {
279     unsigned int xlen;
280    
281     HMAC_CTX *hctx = &ctx->hctx;
282    
283     HMAC_Init_ex (hctx, 0, 0, 0, 0);
284     HMAC_Update (hctx, ((unsigned char *) this) + sizeof (hmac_packet),
285     len - sizeof (hmac_packet));
286     HMAC_Final (hctx, (unsigned char *) &hmac_digest, &xlen);
287     }
288    
289     void
290     hmac_packet::hmac_set (crypto_ctx *ctx)
291     {
292     hmac_gen (ctx);
293    
294     memcpy (hmac, hmac_digest, HMACLENGTH);
295     }
296    
297     bool
298     hmac_packet::hmac_chk (crypto_ctx *ctx)
299     {
300     hmac_gen (ctx);
301    
302     return !memcmp (hmac, hmac_digest, HMACLENGTH);
303     }
304    
305 pcg 1.6 void vpn_packet::set_hdr (ptype type_, unsigned int dst)
306 pcg 1.1 {
307 pcg 1.6 type = type_;
308 pcg 1.1
309     int src = THISNODE->id;
310    
311     src1 = src;
312     srcdst = ((src >> 8) << 4) | (dst >> 8);
313     dst1 = dst;
314     }
315    
316     #define MAXVPNDATA (MAX_MTU - 6 - 6)
317     #define DATAHDR (sizeof (u32) + RAND_SIZE)
318    
319 pcg 1.28 struct vpndata_packet : vpn_packet
320 pcg 1.1 {
321     u8 data[MAXVPNDATA + DATAHDR]; // seqno
322    
323     void setup (connection *conn, int dst, u8 *d, u32 len, u32 seqno);
324     tap_packet *unpack (connection *conn, u32 &seqno);
325     private:
326    
327     const u32 data_hdr_size () const
328     {
329     return sizeof (vpndata_packet) - sizeof (net_packet) - MAXVPNDATA - DATAHDR;
330     }
331     };
332    
333     void
334     vpndata_packet::setup (connection *conn, int dst, u8 *d, u32 l, u32 seqno)
335     {
336     EVP_CIPHER_CTX *cctx = &conn->octx->cctx;
337     int outl = 0, outl2;
338     ptype type = PT_DATA_UNCOMPRESSED;
339    
340     #if ENABLE_COMPRESSION
341     u8 cdata[MAX_MTU];
342    
343 pcg 1.31 if (conn->features & ENABLE_COMPRESSION)
344 pcg 1.1 {
345 pcg 1.31 u32 cl = lzf_compress (d, l, cdata + 2, (l - 2) & ~7);
346 pcg 1.1
347 pcg 1.31 if (cl)
348     {
349     type = PT_DATA_COMPRESSED;
350     d = cdata;
351     l = cl + 2;
352    
353     d[0] = cl >> 8;
354     d[1] = cl;
355     }
356 pcg 1.1 }
357     #endif
358    
359 pcg 1.29 require (EVP_EncryptInit_ex (cctx, 0, 0, 0, 0));
360 pcg 1.1
361     struct {
362     #if RAND_SIZE
363     u8 rnd[RAND_SIZE];
364     #endif
365     u32 seqno;
366     } datahdr;
367    
368     datahdr.seqno = ntohl (seqno);
369     #if RAND_SIZE
370     RAND_pseudo_bytes ((unsigned char *) datahdr.rnd, RAND_SIZE);
371     #endif
372    
373 pcg 1.29 require (EVP_EncryptUpdate (cctx,
374 pcg 1.1 (unsigned char *) data + outl, &outl2,
375 pcg 1.29 (unsigned char *) &datahdr, DATAHDR));
376 pcg 1.1 outl += outl2;
377    
378 pcg 1.29 require (EVP_EncryptUpdate (cctx,
379 pcg 1.1 (unsigned char *) data + outl, &outl2,
380 pcg 1.29 (unsigned char *) d, l));
381 pcg 1.1 outl += outl2;
382    
383 pcg 1.29 require (EVP_EncryptFinal_ex (cctx, (unsigned char *) data + outl, &outl2));
384 pcg 1.1 outl += outl2;
385    
386     len = outl + data_hdr_size ();
387    
388     set_hdr (type, dst);
389    
390     hmac_set (conn->octx);
391     }
392    
393     tap_packet *
394     vpndata_packet::unpack (connection *conn, u32 &seqno)
395     {
396     EVP_CIPHER_CTX *cctx = &conn->ictx->cctx;
397     int outl = 0, outl2;
398     tap_packet *p = new tap_packet;
399     u8 *d;
400     u32 l = len - data_hdr_size ();
401    
402 pcg 1.29 require (EVP_DecryptInit_ex (cctx, 0, 0, 0, 0));
403 pcg 1.1
404     #if ENABLE_COMPRESSION
405     u8 cdata[MAX_MTU];
406    
407     if (type == PT_DATA_COMPRESSED)
408     d = cdata;
409     else
410     #endif
411     d = &(*p)[6 + 6 - DATAHDR];
412    
413     /* this overwrites part of the src mac, but we fix that later */
414 pcg 1.29 require (EVP_DecryptUpdate (cctx,
415 pcg 1.1 d, &outl2,
416 pcg 1.29 (unsigned char *)&data, len - data_hdr_size ()));
417 pcg 1.1 outl += outl2;
418    
419 pcg 1.29 require (EVP_DecryptFinal_ex (cctx, (unsigned char *)d + outl, &outl2));
420 pcg 1.1 outl += outl2;
421    
422     seqno = ntohl (*(u32 *)(d + RAND_SIZE));
423    
424     id2mac (dst () ? dst() : THISNODE->id, p->dst);
425     id2mac (src (), p->src);
426    
427     #if ENABLE_COMPRESSION
428     if (type == PT_DATA_COMPRESSED)
429     {
430     u32 cl = (d[DATAHDR] << 8) | d[DATAHDR + 1];
431    
432     p->len = lzf_decompress (d + DATAHDR + 2, cl < MAX_MTU ? cl : 0,
433     &(*p)[6 + 6], MAX_MTU)
434     + 6 + 6;
435     }
436     else
437     p->len = outl + (6 + 6 - DATAHDR);
438     #endif
439    
440     return p;
441     }
442    
443     struct ping_packet : vpn_packet
444     {
445     void setup (int dst, ptype type)
446     {
447     set_hdr (type, dst);
448     len = sizeof (*this) - sizeof (net_packet);
449     }
450     };
451    
452     struct config_packet : vpn_packet
453     {
454     // actually, hmaclen cannot be checked because the hmac
455     // field comes before this data, so peers with other
456     // hmacs simply will not work.
457     u8 prot_major, prot_minor, randsize, hmaclen;
458 pcg 1.31 u8 flags, challengelen, features, pad3;
459 pcg 1.1 u32 cipher_nid, digest_nid, hmac_nid;
460    
461     void setup (ptype type, int dst);
462     bool chk_config () const;
463 pcg 1.32
464     static u8 get_features ()
465     {
466     u8 f = 0;
467     #if ENABLE_COMPRESSION
468     f |= FEATURE_COMPRESSION;
469     #endif
470     #if ENABLE_ROHC
471     f |= FEATURE_ROHC;
472     #endif
473     return f;
474     }
475 pcg 1.1 };
476    
477     void config_packet::setup (ptype type, int dst)
478     {
479     prot_major = PROTOCOL_MAJOR;
480     prot_minor = PROTOCOL_MINOR;
481     randsize = RAND_SIZE;
482     hmaclen = HMACLENGTH;
483 pcg 1.31 flags = ENABLE_COMPRESSION ? 0x81 : 0x80;
484 pcg 1.1 challengelen = sizeof (rsachallenge);
485 pcg 1.32 features = get_features ();
486 pcg 1.1
487     cipher_nid = htonl (EVP_CIPHER_nid (CIPHER));
488     digest_nid = htonl (EVP_MD_type (RSA_HASH));
489     hmac_nid = htonl (EVP_MD_type (DIGEST));
490    
491     len = sizeof (*this) - sizeof (net_packet);
492     set_hdr (type, dst);
493     }
494    
495     bool config_packet::chk_config () const
496     {
497 pcg 1.15 if (prot_major != PROTOCOL_MAJOR)
498 pcg 1.23 slog (L_WARN, _("major version mismatch (remote %d <=> local %d)"), prot_major, PROTOCOL_MAJOR);
499 pcg 1.15 else if (randsize != RAND_SIZE)
500 pcg 1.23 slog (L_WARN, _("rand size mismatch (remote %d <=> local %d)"), randsize, RAND_SIZE);
501 pcg 1.15 else if (hmaclen != HMACLENGTH)
502 pcg 1.23 slog (L_WARN, _("hmac length mismatch (remote %d <=> local %d)"), hmaclen, HMACLENGTH);
503 pcg 1.31 #if 0 // this implementation should handle all flag settings
504 pcg 1.15 else if (flags != curflags ())
505 pcg 1.23 slog (L_WARN, _("flag mismatch (remote %x <=> local %x)"), flags, curflags ());
506 pcg 1.31 #endif
507 pcg 1.15 else if (challengelen != sizeof (rsachallenge))
508 pcg 1.23 slog (L_WARN, _("challenge length mismatch (remote %d <=> local %d)"), challengelen, sizeof (rsachallenge));
509 pcg 1.15 else if (cipher_nid != htonl (EVP_CIPHER_nid (CIPHER)))
510 pcg 1.23 slog (L_WARN, _("cipher mismatch (remote %x <=> local %x)"), ntohl (cipher_nid), EVP_CIPHER_nid (CIPHER));
511 pcg 1.15 else if (digest_nid != htonl (EVP_MD_type (RSA_HASH)))
512 pcg 1.23 slog (L_WARN, _("digest mismatch (remote %x <=> local %x)"), ntohl (digest_nid), EVP_MD_type (RSA_HASH));
513 pcg 1.15 else if (hmac_nid != htonl (EVP_MD_type (DIGEST)))
514 pcg 1.23 slog (L_WARN, _("hmac mismatch (remote %x <=> local %x)"), ntohl (hmac_nid), EVP_MD_type (DIGEST));
515 pcg 1.15 else
516     return true;
517    
518     return false;
519 pcg 1.1 }
520    
521     struct auth_req_packet : config_packet
522     {
523     char magic[8];
524     u8 initiate; // false if this is just an automatic reply
525 pcg 1.28 u8 protocols; // supported protocols (will be patched on forward)
526 pcg 1.1 u8 pad2, pad3;
527     rsaid id;
528     rsaencrdata encr;
529    
530     auth_req_packet (int dst, bool initiate_, u8 protocols_)
531     {
532     config_packet::setup (PT_AUTH_REQ, dst);
533     strncpy (magic, MAGIC, 8);
534     initiate = !!initiate_;
535     protocols = protocols_;
536    
537     len = sizeof (*this) - sizeof (net_packet);
538     }
539     };
540    
541     struct auth_res_packet : config_packet
542     {
543     rsaid id;
544     u8 pad1, pad2, pad3;
545     u8 response_len; // encrypted length
546     rsaresponse response;
547    
548     auth_res_packet (int dst)
549     {
550     config_packet::setup (PT_AUTH_RES, dst);
551    
552     len = sizeof (*this) - sizeof (net_packet);
553     }
554     };
555    
556     struct connect_req_packet : vpn_packet
557     {
558     u8 id, protocols;
559     u8 pad1, pad2;
560    
561     connect_req_packet (int dst, int id_, u8 protocols_)
562     : id(id_)
563     , protocols(protocols_)
564     {
565     set_hdr (PT_CONNECT_REQ, dst);
566     len = sizeof (*this) - sizeof (net_packet);
567     }
568     };
569    
570     struct connect_info_packet : vpn_packet
571     {
572     u8 id, protocols;
573     u8 pad1, pad2;
574     sockinfo si;
575    
576     connect_info_packet (int dst, int id_, const sockinfo &si_, u8 protocols_)
577     : id(id_)
578     , protocols(protocols_)
579     , si(si_)
580     {
581     set_hdr (PT_CONNECT_INFO, dst);
582    
583     len = sizeof (*this) - sizeof (net_packet);
584     }
585     };
586    
587     /////////////////////////////////////////////////////////////////////////////
588    
589     void
590 pcg 1.10 connection::connection_established ()
591     {
592     if (ictx && octx)
593     {
594     connectmode = conf->connectmode;
595    
596 pcg 1.36 // make sure rekeying timeouts are slightly asymmetric
597     rekey.start (NOW + ::conf.rekey
598     + (conf->id > THISNODE->id ? 10 : 0));
599 pcg 1.10 keepalive.start (NOW + ::conf.keepalive);
600    
601     // send queued packets
602     if (ictx && octx)
603 pcg 1.12 {
604     while (tap_packet *p = (tap_packet *)data_queue.get ())
605     {
606     send_data_packet (p);
607     delete p;
608     }
609    
610     while (vpn_packet *p = (vpn_packet *)vpn_queue.get ())
611     {
612     send_vpn_packet (p, si, IPTOS_RELIABILITY);
613     delete p;
614     }
615     }
616 pcg 1.10 }
617     else
618     {
619     retry_cnt = 0;
620     establish_connection.start (NOW + 5);
621 pcg 1.25 keepalive.stop ();
622     rekey.stop ();
623 pcg 1.10 }
624     }
625    
626     void
627 pcg 1.8 connection::reset_si ()
628 pcg 1.1 {
629 pcg 1.6 protocol = best_protocol (THISNODE->protocols & conf->protocols);
630    
631     // mask out protocols we cannot establish
632     if (!conf->udp_port) protocol &= ~PROT_UDPv4;
633     if (!conf->tcp_port) protocol &= ~PROT_TCPv4;
634 pcg 1.40 if (!conf->dns_port) protocol &= ~PROT_DNSv4;
635 pcg 1.6
636     si.set (conf, protocol);
637 pcg 1.1 }
638    
639 pcg 1.8 // ensure sockinfo is valid, forward if necessary
640     const sockinfo &
641     connection::forward_si (const sockinfo &si) const
642     {
643     if (!si.valid ())
644     {
645     connection *r = vpn->find_router ();
646    
647     if (r)
648     {
649     slog (L_DEBUG, _("%s: no common protocol, trying indirectly through %s"),
650     conf->nodename, r->conf->nodename);
651     return r->si;
652     }
653     else
654     slog (L_DEBUG, _("%s: node unreachable, no common protocol"),
655     conf->nodename);
656     }
657    
658     return si;
659     }
660    
661 pcg 1.1 void
662 pcg 1.10 connection::send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos)
663     {
664 pcg 1.40 bool ok;
665    
666     switch (si.prot)
667     {
668     case PROT_IPv4:
669     ok = vpn->send_ipv4_packet (pkt, si, tos); break;
670     case PROT_UDPv4:
671     ok = vpn->send_udpv4_packet (pkt, si, tos); break;
672     #if ENABLE_TCP
673     case PROT_TCPv4:
674     ok = vpn->send_tcpv4_packet (pkt, si, tos); break;
675     #endif
676     #if ENABLE_ICMP
677     case PROT_ICMPv4:
678     ok = vpn->send_icmpv4_packet (pkt, si, tos); break;
679     #endif
680     #if ENABLE_DNS
681     case PROT_DNSv4:
682     ok = send_dnsv4_packet (pkt, si, tos); break;
683     #endif
684    
685     default:
686     slog (L_CRIT, _("%s: FATAL: trying to send packet with unsupported protocol"), (const char *)si);
687     ok = false;
688     }
689    
690     if (!ok)
691 pcg 1.10 reset_connection ();
692     }
693    
694     void
695 pcg 1.1 connection::send_ping (const sockinfo &si, u8 pong)
696     {
697     ping_packet *pkt = new ping_packet;
698    
699     pkt->setup (conf->id, pong ? ping_packet::PT_PONG : ping_packet::PT_PING);
700 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_LOWDELAY);
701 pcg 1.1
702     delete pkt;
703     }
704    
705     void
706     connection::send_reset (const sockinfo &si)
707     {
708     if (reset_rate_limiter.can (si) && connectmode != conf_node::C_DISABLED)
709     {
710     config_packet *pkt = new config_packet;
711    
712     pkt->setup (vpn_packet::PT_RESET, conf->id);
713 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_MINCOST);
714 pcg 1.1
715     delete pkt;
716     }
717     }
718    
719     void
720     connection::send_auth_request (const sockinfo &si, bool initiate)
721     {
722     auth_req_packet *pkt = new auth_req_packet (conf->id, initiate, THISNODE->protocols);
723    
724 pcg 1.6 rsachallenge chg;
725     rsa_cache.gen (pkt->id, chg);
726 pcg 1.24 rsa_encrypt (conf->rsa_key, chg, pkt->encr);
727 pcg 1.1
728 pcg 1.6 slog (L_TRACE, ">>%d PT_AUTH_REQ [%s]", conf->id, (const char *)si);
729 pcg 1.1
730 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_RELIABILITY | IPTOS_LOWDELAY); // rsa is very very costly
731 pcg 1.1
732 pcg 1.6 delete pkt;
733 pcg 1.1 }
734    
735     void
736     connection::send_auth_response (const sockinfo &si, const rsaid &id, const rsachallenge &chg)
737     {
738     auth_res_packet *pkt = new auth_res_packet (conf->id);
739    
740     pkt->id = id;
741    
742     rsa_hash (id, chg, pkt->response);
743    
744     pkt->hmac_set (octx);
745    
746     slog (L_TRACE, ">>%d PT_AUTH_RES [%s]", conf->id, (const char *)si);
747    
748 pcg 1.10 send_vpn_packet (pkt, si, IPTOS_RELIABILITY); // rsa is very very costly
749 pcg 1.1
750     delete pkt;
751     }
752    
753     void
754     connection::send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols)
755     {
756     slog (L_TRACE, ">>%d PT_CONNECT_INFO(%d,%s)\n",
757     conf->id, rid, (const char *)rsi);
758    
759     connect_info_packet *r = new connect_info_packet (conf->id, rid, rsi, rprotocols);
760    
761     r->hmac_set (octx);
762 pcg 1.10 send_vpn_packet (r, si);
763 pcg 1.1
764     delete r;
765     }
766    
767     void
768 pcg 1.4 connection::establish_connection_cb (time_watcher &w)
769 pcg 1.1 {
770 pcg 1.25 if (!ictx
771     && conf != THISNODE
772     && connectmode != conf_node::C_NEVER
773     && connectmode != conf_node::C_DISABLED
774 pcg 1.26 && NOW > w.at)
775 pcg 1.1 {
776     double retry_int = double (retry_cnt & 3 ? (retry_cnt & 3) : 1 << (retry_cnt >> 2)) * 0.6;
777    
778 pcg 1.37 if (retry_int < conf->max_retry)
779 pcg 1.1 retry_cnt++;
780 pcg 1.37 else
781     retry_int = conf->max_retry;
782 pcg 1.1
783 pcg 1.25 w.start (NOW + retry_int);
784 pcg 1.1
785 pcg 1.8 reset_si ();
786    
787     if (si.prot && !si.host)
788 pcg 1.10 vpn->send_connect_request (conf->id);
789 pcg 1.8 else
790 pcg 1.1 {
791 pcg 1.8 const sockinfo &dsi = forward_si (si);
792 pcg 1.6
793 pcg 1.8 if (dsi.valid () && auth_rate_limiter.can (dsi))
794     {
795     if (retry_cnt < 4)
796     send_auth_request (dsi, true);
797     else
798     send_ping (dsi, 0);
799     }
800 pcg 1.1 }
801     }
802     }
803    
804     void
805     connection::reset_connection ()
806     {
807     if (ictx && octx)
808     {
809     slog (L_INFO, _("%s(%s): connection lost"),
810     conf->nodename, (const char *)si);
811    
812     if (::conf.script_node_down)
813     run_script (run_script_cb (this, &connection::script_node_down), false);
814     }
815    
816     delete ictx; ictx = 0;
817     delete octx; octx = 0;
818    
819 pcg 1.38 si.host = 0;
820 pcg 1.1
821     last_activity = 0;
822     retry_cnt = 0;
823    
824 pcg 1.25 rekey.stop ();
825     keepalive.stop ();
826     establish_connection.stop ();
827 pcg 1.1 }
828    
829     void
830     connection::shutdown ()
831     {
832     if (ictx && octx)
833     send_reset (si);
834    
835     reset_connection ();
836     }
837    
838     void
839 pcg 1.4 connection::rekey_cb (time_watcher &w)
840 pcg 1.1 {
841     reset_connection ();
842     establish_connection ();
843     }
844    
845     void
846 pcg 1.21 connection::send_data_packet (tap_packet *pkt)
847 pcg 1.1 {
848     vpndata_packet *p = new vpndata_packet;
849     int tos = 0;
850    
851 pcg 1.12 // I am not hilarious about peeking into packets, but so be it.
852 pcg 1.21 if (conf->inherit_tos && pkt->is_ipv4 ())
853 pcg 1.1 tos = (*pkt)[15] & IPTOS_TOS_MASK;
854    
855 pcg 1.21 p->setup (this, conf->id, &((*pkt)[6 + 6]), pkt->len - 6 - 6, ++oseqno); // skip 2 macs
856 pcg 1.10 send_vpn_packet (p, si, tos);
857 pcg 1.1
858     delete p;
859    
860     if (oseqno > MAX_SEQNO)
861     rekey ();
862     }
863    
864     void
865 pcg 1.21 connection::inject_data_packet (tap_packet *pkt, bool broadcast/*TODO DDD*/)
866 pcg 1.1 {
867     if (ictx && octx)
868 pcg 1.21 send_data_packet (pkt);
869 pcg 1.1 else
870     {
871     if (!broadcast)//DDDD
872 pcg 1.12 data_queue.put (new tap_packet (*pkt));
873 pcg 1.1
874     establish_connection ();
875     }
876     }
877    
878 pcg 1.8 void connection::inject_vpn_packet (vpn_packet *pkt, int tos)
879     {
880     if (ictx && octx)
881 pcg 1.10 send_vpn_packet (pkt, si, tos);
882 pcg 1.8 else
883 pcg 1.12 {
884 pcg 1.28 vpn_queue.put ((vpn_packet *)new data_packet (*(data_packet *)pkt));
885 pcg 1.12
886     establish_connection ();
887     }
888 pcg 1.8 }
889    
890 pcg 1.1 void
891     connection::recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi)
892     {
893     last_activity = NOW;
894    
895     slog (L_NOISE, "<<%d received packet type %d from %d to %d",
896     conf->id, pkt->typ (), pkt->src (), pkt->dst ());
897    
898     switch (pkt->typ ())
899     {
900 pcg 1.3 case vpn_packet::PT_PING:
901     // we send pings instead of auth packets after some retries,
902     // so reset the retry counter and establish a connection
903     // when we receive a ping.
904     if (!ictx)
905     {
906     if (auth_rate_limiter.can (rsi))
907     send_auth_request (rsi, true);
908     }
909     else
910     send_ping (rsi, 1); // pong
911    
912     break;
913    
914     case vpn_packet::PT_PONG:
915     break;
916    
917     case vpn_packet::PT_RESET:
918 pcg 1.1 {
919 pcg 1.3 reset_connection ();
920    
921     config_packet *p = (config_packet *) pkt;
922    
923     if (!p->chk_config ())
924     {
925     slog (L_WARN, _("%s(%s): protocol mismatch, disabling node"),
926     conf->nodename, (const char *)rsi);
927     connectmode = conf_node::C_DISABLED;
928     }
929     else if (connectmode == conf_node::C_ALWAYS)
930     establish_connection ();
931 pcg 1.1 }
932 pcg 1.3 break;
933    
934     case vpn_packet::PT_AUTH_REQ:
935     if (auth_rate_limiter.can (rsi))
936     {
937     auth_req_packet *p = (auth_req_packet *) pkt;
938    
939     slog (L_TRACE, "<<%d PT_AUTH_REQ(%d)", conf->id, p->initiate);
940 pcg 1.1
941 pcg 1.3 if (p->chk_config () && !strncmp (p->magic, MAGIC, 8))
942     {
943     if (p->prot_minor != PROTOCOL_MINOR)
944     slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
945     conf->nodename, (const char *)rsi,
946     PROTOCOL_MINOR, conf->nodename, p->prot_minor);
947    
948     if (p->initiate)
949     send_auth_request (rsi, false);
950    
951     rsachallenge k;
952    
953 pcg 1.24 if (!rsa_decrypt (::conf.rsa_key, p->encr, k))
954 pcg 1.23 {
955     slog (L_ERR, _("%s(%s): challenge illegal or corrupted (%s). mismatched key or config file?"),
956     conf->nodename, (const char *)rsi, ERR_error_string (ERR_get_error (), 0));
957     break;
958     }
959 pcg 1.3 else
960     {
961     delete octx;
962 pcg 1.1
963 pcg 1.3 octx = new crypto_ctx (k, 1);
964     oseqno = ntohl (*(u32 *)&k[CHG_SEQNO]) & 0x7fffffff;
965 pcg 1.1
966 pcg 1.31 // compatibility code, remove when no longer required
967     if (p->flags & 1) p->features |= FEATURE_COMPRESSION;
968    
969 pcg 1.3 conf->protocols = p->protocols;
970 pcg 1.32 features = p->features & config_packet::get_features ();
971 pcg 1.10
972 pcg 1.3 send_auth_response (rsi, p->id, k);
973    
974 pcg 1.10 connection_established ();
975    
976 pcg 1.3 break;
977     }
978     }
979 pcg 1.15 else
980     slog (L_WARN, _("%s(%s): protocol mismatch"),
981     conf->nodename, (const char *)rsi);
982 pcg 1.3
983     send_reset (rsi);
984 pcg 1.1 }
985    
986 pcg 1.3 break;
987    
988     case vpn_packet::PT_AUTH_RES:
989 pcg 1.1 {
990 pcg 1.3 auth_res_packet *p = (auth_res_packet *) pkt;
991 pcg 1.1
992 pcg 1.3 slog (L_TRACE, "<<%d PT_AUTH_RES", conf->id);
993 pcg 1.1
994 pcg 1.3 if (p->chk_config ())
995 pcg 1.1 {
996     if (p->prot_minor != PROTOCOL_MINOR)
997     slog (L_INFO, _("%s(%s): protocol minor version mismatch: ours is %d, %s's is %d."),
998     conf->nodename, (const char *)rsi,
999     PROTOCOL_MINOR, conf->nodename, p->prot_minor);
1000    
1001 pcg 1.3 rsachallenge chg;
1002 pcg 1.1
1003 pcg 1.3 if (!rsa_cache.find (p->id, chg))
1004 pcg 1.13 {
1005 pcg 1.18 slog (L_ERR, _("%s(%s): unrequested auth response ignored"),
1006 pcg 1.13 conf->nodename, (const char *)rsi);
1007     break;
1008     }
1009 pcg 1.1 else
1010     {
1011 pcg 1.3 crypto_ctx *cctx = new crypto_ctx (chg, 0);
1012    
1013     if (!p->hmac_chk (cctx))
1014 pcg 1.18 {
1015     slog (L_ERR, _("%s(%s): hmac authentication error on auth response, received invalid packet\n"
1016 pcg 1.27 "could be an attack, or just corruption or a synchronization error"),
1017 pcg 1.18 conf->nodename, (const char *)rsi);
1018     break;
1019     }
1020 pcg 1.3 else
1021     {
1022     rsaresponse h;
1023    
1024     rsa_hash (p->id, chg, h);
1025    
1026     if (!memcmp ((u8 *)&h, (u8 *)p->response, sizeof h))
1027     {
1028     prot_minor = p->prot_minor;
1029    
1030     delete ictx; ictx = cctx;
1031    
1032     iseqno.reset (ntohl (*(u32 *)&chg[CHG_SEQNO]) & 0x7fffffff); // at least 2**31 sequence numbers are valid
1033    
1034     si = rsi;
1035 pcg 1.7 protocol = rsi.prot;
1036 pcg 1.3
1037 pcg 1.10 connection_established ();
1038 pcg 1.1
1039 pcg 1.7 slog (L_INFO, _("%s(%s): connection established, protocol version %d.%d"),
1040 pcg 1.3 conf->nodename, (const char *)rsi,
1041     p->prot_major, p->prot_minor);
1042 pcg 1.1
1043 pcg 1.3 if (::conf.script_node_up)
1044     run_script (run_script_cb (this, &connection::script_node_up), false);
1045 pcg 1.1
1046 pcg 1.3 break;
1047     }
1048     else
1049     slog (L_ERR, _("%s(%s): sent and received challenge do not match"),
1050     conf->nodename, (const char *)rsi);
1051     }
1052 pcg 1.1
1053 pcg 1.3 delete cctx;
1054 pcg 1.1 }
1055     }
1056     }
1057    
1058 pcg 1.3 send_reset (rsi);
1059     break;
1060 pcg 1.1
1061 pcg 1.3 case vpn_packet::PT_DATA_COMPRESSED:
1062     #if !ENABLE_COMPRESSION
1063     send_reset (rsi);
1064     break;
1065     #endif
1066 pcg 1.1
1067 pcg 1.3 case vpn_packet::PT_DATA_UNCOMPRESSED:
1068 pcg 1.1
1069 pcg 1.3 if (ictx && octx)
1070 pcg 1.1 {
1071 pcg 1.3 vpndata_packet *p = (vpndata_packet *)pkt;
1072 pcg 1.1
1073 pcg 1.10 if (!p->hmac_chk (ictx))
1074     slog (L_ERR, _("%s(%s): hmac authentication error, received invalid packet\n"
1075 pcg 1.27 "could be an attack, or just corruption or a synchronization error"),
1076 pcg 1.10 conf->nodename, (const char *)rsi);
1077     else
1078 pcg 1.1 {
1079 pcg 1.10 u32 seqno;
1080     tap_packet *d = p->unpack (this, seqno);
1081    
1082     if (iseqno.recv_ok (seqno))
1083 pcg 1.1 {
1084 pcg 1.10 vpn->tap->send (d);
1085 pcg 1.1
1086 pcg 1.10 if (si != rsi)
1087 pcg 1.1 {
1088 pcg 1.14 // fast re-sync on connection changes, useful especially for tcp/ip
1089 pcg 1.10 si = rsi;
1090 pcg 1.1
1091 pcg 1.10 slog (L_INFO, _("%s(%s): socket address changed to %s"),
1092     conf->nodename, (const char *)si, (const char *)rsi);
1093     }
1094 pcg 1.32 }
1095 pcg 1.3
1096 pcg 1.32 delete d;
1097     break;
1098 pcg 1.1 }
1099     }
1100    
1101 pcg 1.3 send_reset (rsi);
1102     break;
1103 pcg 1.1
1104 pcg 1.3 case vpn_packet::PT_CONNECT_REQ:
1105     if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1106     {
1107     connect_req_packet *p = (connect_req_packet *) pkt;
1108 pcg 1.1
1109 pcg 1.3 assert (p->id > 0 && p->id <= vpn->conns.size ()); // hmac-auth does not mean we accept anything
1110 pcg 1.7 connection *c = vpn->conns[p->id - 1];
1111 pcg 1.3 conf->protocols = p->protocols;
1112 pcg 1.1
1113 pcg 1.3 slog (L_TRACE, "<<%d PT_CONNECT_REQ(%d) [%d]\n",
1114     conf->id, p->id, c->ictx && c->octx);
1115 pcg 1.1
1116 pcg 1.3 if (c->ictx && c->octx)
1117     {
1118     // send connect_info packets to both sides, in case one is
1119     // behind a nat firewall (or both ;)
1120     c->send_connect_info (conf->id, si, conf->protocols);
1121     send_connect_info (c->conf->id, c->si, c->conf->protocols);
1122     }
1123 pcg 1.11 else
1124     c->establish_connection ();
1125 pcg 1.3 }
1126 pcg 1.1
1127 pcg 1.3 break;
1128 pcg 1.1
1129 pcg 1.3 case vpn_packet::PT_CONNECT_INFO:
1130     if (ictx && octx && rsi == si && pkt->hmac_chk (ictx))
1131     {
1132 pcg 1.39 connect_info_packet *p = (connect_info_packet *)pkt;
1133 pcg 1.1
1134 pcg 1.39 if (p->id > 0 && p->id <= vpn->conns.size ()) // hmac-auth does not mean we accept anything
1135     {
1136     connection *c = vpn->conns[p->id - 1];
1137 pcg 1.7
1138 pcg 1.39 c->conf->protocols = p->protocols;
1139     protocol = best_protocol (c->conf->protocols & THISNODE->protocols & p->si.supported_protocols (c->conf));
1140     p->si.upgrade_protocol (protocol, c->conf);
1141 pcg 1.1
1142 pcg 1.39 slog (L_TRACE, "<<%d PT_CONNECT_INFO(%d,%s) (%d)",
1143     conf->id, p->id, (const char *)p->si, !c->ictx && !c->octx);
1144 pcg 1.7
1145 pcg 1.39 const sockinfo &dsi = forward_si (p->si);
1146 pcg 1.1
1147 pcg 1.39 if (dsi.valid ())
1148     c->send_auth_request (dsi, true);
1149     }
1150 pcg 1.3 }
1151 pcg 1.1
1152 pcg 1.3 break;
1153 pcg 1.1
1154 pcg 1.3 default:
1155     send_reset (rsi);
1156     break;
1157 pcg 1.1 }
1158     }
1159    
1160 pcg 1.4 void connection::keepalive_cb (time_watcher &w)
1161 pcg 1.1 {
1162     if (NOW >= last_activity + ::conf.keepalive + 30)
1163     {
1164     reset_connection ();
1165     establish_connection ();
1166     }
1167     else if (NOW < last_activity + ::conf.keepalive)
1168 pcg 1.25 w.start (last_activity + ::conf.keepalive);
1169 pcg 1.1 else if (conf->connectmode != conf_node::C_ONDEMAND
1170     || THISNODE->connectmode != conf_node::C_ONDEMAND)
1171     {
1172     send_ping (si);
1173 pcg 1.25 w.start (NOW + 5);
1174 pcg 1.1 }
1175 pcg 1.12 else if (NOW < last_activity + ::conf.keepalive + 10)
1176     // hold ondemand connections implicitly a few seconds longer
1177     // should delete octx, though, or something like that ;)
1178 pcg 1.25 w.start (last_activity + ::conf.keepalive + 10);
1179 pcg 1.1 else
1180     reset_connection ();
1181     }
1182    
1183 pcg 1.10 void connection::send_connect_request (int id)
1184 pcg 1.1 {
1185     connect_req_packet *p = new connect_req_packet (conf->id, id, conf->protocols);
1186    
1187     slog (L_TRACE, ">>%d PT_CONNECT_REQ(%d)", conf->id, id);
1188     p->hmac_set (octx);
1189 pcg 1.10 send_vpn_packet (p, si);
1190 pcg 1.1
1191     delete p;
1192     }
1193    
1194     void connection::script_node ()
1195     {
1196 pcg 1.3 vpn->script_if_up ();
1197 pcg 1.1
1198     char *env;
1199     asprintf (&env, "DESTID=%d", conf->id); putenv (env);
1200     asprintf (&env, "DESTNODE=%s", conf->nodename); putenv (env);
1201     asprintf (&env, "DESTIP=%s", si.ntoa ()); putenv (env);
1202     asprintf (&env, "DESTPORT=%d", ntohs (si.port)); putenv (env);
1203     }
1204    
1205 pcg 1.3 const char *connection::script_node_up ()
1206 pcg 1.1 {
1207     script_node ();
1208    
1209     putenv ("STATE=up");
1210    
1211     return ::conf.script_node_up ? ::conf.script_node_up : "node-up";
1212     }
1213    
1214 pcg 1.3 const char *connection::script_node_down ()
1215 pcg 1.1 {
1216     script_node ();
1217    
1218     putenv ("STATE=down");
1219    
1220     return ::conf.script_node_up ? ::conf.script_node_down : "node-down";
1221     }
1222    
1223 pcg 1.40 connection::connection (struct vpn *vpn, conf_node *conf)
1224     : vpn(vpn), conf(conf)
1225 pcg 1.1 , rekey (this, &connection::rekey_cb)
1226     , keepalive (this, &connection::keepalive_cb)
1227     , establish_connection (this, &connection::establish_connection_cb)
1228 pcg 1.40 #if ENABLE_DNS
1229 pcg 1.43 , dns (0)
1230 pcg 1.40 #endif
1231 pcg 1.1 {
1232     octx = ictx = 0;
1233     retry_cnt = 0;
1234    
1235 pcg 1.40 if (!conf->protocols) // make sure some protocol is enabled
1236     conf->protocols = PROT_UDPv4;
1237    
1238 pcg 1.1 connectmode = conf_node::C_ALWAYS; // initial setting
1239     reset_connection ();
1240     }
1241    
1242     connection::~connection ()
1243     {
1244     shutdown ();
1245     }
1246    
1247     void connection_init ()
1248     {
1249     auth_rate_limiter.clear ();
1250     reset_rate_limiter.clear ();
1251     }
1252