ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.C
Revision: 1.9
Committed: Sun Apr 6 04:31:51 2003 UTC (21 years, 1 month ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.8: +3 -4 lines
Log Message:
*** empty log message ***

File Contents

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