ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/connection.h
Revision: 1.38
Committed: Thu Jul 18 13:35:16 2013 UTC (10 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.37: +2 -2 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     connection.h -- header for connection.C
3 root 1.37 Copyright (C) 2003-2008,2013 Marc Lehmann <gvpe@schmorp.de>
4 pcg 1.1
5 pcg 1.18 This file is part of GVPE.
6    
7 pcg 1.32 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 pcg 1.22 #ifndef GVPE_CONNECTION_H__
33     #define GVPE_CONNECTION_H__
34 pcg 1.1
35     #include <openssl/hmac.h>
36    
37     #include "global.h"
38     #include "conf.h"
39     #include "sockinfo.h"
40     #include "util.h"
41     #include "device.h"
42 root 1.37 #include "curve25519.h"
43 root 1.38 #include "iv_gen.h"
44 pcg 1.1
45     struct vpn;
46    
47     // called after HUP etc. to (re-)initialize global data structures
48     void connection_init ();
49    
50 root 1.37 typedef curve25519_key ecdh_key;
51    
52     struct rsa_data
53     {
54     u32 seqno;
55     u8 auth_key[AUTH_SIZE];
56     u8 mac_key[MAC_KEYSIZE]; // used to generate hmac key
57     u8 cipher_key[CIPHER_KEYSIZE]; // used to generate cipher key
58     u8 hkdf_salt[HKDF_SALT]; // used as hkdf salt
59     u8 pad[
60     (RSABITS >> 3)
61     - 41 // OAEP
62     - sizeof (u32) // seqno
63     - AUTH_SIZE
64     - MAC_KEYSIZE
65     - CIPHER_KEYSIZE
66     - HKDF_SALT
67     - 3 // struct alignment...
68     ];
69     };
70    
71     struct auth_data
72     {
73     rsa_data rsa;
74     ecdh_key ecdh;
75     };
76    
77     typedef u8 rsa_crypt[RSA_KEYLEN]; // encrypted challenge
78    
79     struct auth_encr
80 pcg 1.29 {
81 root 1.37 rsa_crypt rsa;
82     ecdh_key ecdh;
83 pcg 1.1 };
84    
85 root 1.37 typedef u8 auth_mac[AUTH_SIZE];
86    
87     struct auth_response
88     {
89     auth_mac mac;
90     ecdh_key ecdh;
91     };
92 pcg 1.1
93     ////////////////////////////////////////////////////////////////////////////////////////
94    
95     struct crypto_ctx;
96    
97 pcg 1.13 struct hmac_packet : net_packet
98 pcg 1.1 {
99     u8 hmac[HMACLENGTH]; // each and every packet has a hmac field, but that is not (yet) checked everywhere
100    
101     void hmac_set (crypto_ctx * ctx);
102     bool hmac_chk (crypto_ctx * ctx);
103    
104     private:
105     static unsigned char hmac_digest[EVP_MAX_MD_SIZE];
106    
107     void hmac_gen (crypto_ctx * ctx);
108     };
109    
110     struct vpn_packet : hmac_packet
111 pcg 1.29 {
112     enum ptype
113 pcg 1.1 {
114 pcg 1.29 PT_RESET = 0,
115     PT_DATA_UNCOMPRESSED,
116     PT_DATA_COMPRESSED,
117     PT_PING, PT_PONG, // wasting namespace space? ;)
118     PT_AUTH_REQ, // authentification request
119     PT_AUTH_RES, // authentification response
120     PT_CONNECT_REQ, // want other node to contact me
121     PT_CONNECT_INFO, // request connection to some node
122 pcg 1.31 PT_DATA_BRIDGED, // uncompressed packet with foreign mac pot. larger than path mtu (NYI)
123 pcg 1.29 PT_MAX
124 pcg 1.1 };
125    
126 pcg 1.29 u8 type;
127     u8 srcdst, src1, dst1;
128    
129     void set_hdr (ptype type_, unsigned int dst);
130    
131     unsigned int src () const
132     {
133     return src1 | ((srcdst >> 4) << 8);
134     }
135    
136     unsigned int dst () const
137     {
138     return dst1 | ((srcdst & 0xf) << 8);
139     }
140    
141     ptype typ () const
142     {
143     return (ptype) type;
144     }
145     };
146    
147 pcg 1.1 ////////////////////////////////////////////////////////////////////////////////////////
148    
149     // a very simple fifo pkt-queue
150     class pkt_queue
151 pcg 1.29 {
152     int i, j;
153 pcg 1.30 int max_queue;
154     double max_ttl;
155    
156     struct pkt {
157     ev_tstamp tstamp;
158     net_packet *pkt;
159     } *queue;
160    
161     void expire_cb (ev::timer &w, int revents); ev::timer expire;
162 pcg 1.1
163 pcg 1.29 public:
164 pcg 1.1
165 pcg 1.29 void put (net_packet *p);
166     net_packet *get ();
167 pcg 1.1
168 pcg 1.30 bool empty ()
169     {
170     return i == j;
171     }
172    
173     pkt_queue (double max_ttl, int max_queue);
174 pcg 1.29 ~pkt_queue ();
175     };
176 pcg 1.1
177 pcg 1.14 enum
178 pcg 1.29 {
179     FEATURE_COMPRESSION = 0x01,
180     FEATURE_ROHC = 0x02,
181     FEATURE_BRIDGING = 0x04,
182     };
183 pcg 1.14
184 pcg 1.1 struct connection
185 pcg 1.29 {
186     conf_node *conf;
187     struct vpn *vpn;
188 pcg 1.1
189 pcg 1.29 sockinfo si; // the current(!) destination ip to send packets to
190     int retry_cnt;
191 pcg 1.1
192 pcg 1.29 tstamp last_activity; // time of last packet received
193 root 1.35 tstamp last_establish_attempt;
194 pcg 1.33 //tstamp last_si_change; // time we last changed the socket address
195 pcg 1.1
196 pcg 1.29 u32 oseqno;
197     sliding_window iseqno;
198 pcg 1.1
199 pcg 1.29 u8 protocol;
200     u8 features;
201 pcg 1.33 bool is_direct; // current connection (si) is direct?
202 pcg 1.1
203 pcg 1.29 pkt_queue data_queue, vpn_queue;
204 pcg 1.1
205 pcg 1.29 crypto_ctx *octx, *ictx;
206 root 1.38 iv_gen oiv; // generator for random byte prefix
207 pcg 1.1
208 root 1.37 void generate_auth_data ();
209    
210     ev_tstamp auth_expire; // when the snd_* and *_ecdh values expire
211    
212     // send auth data - used for octx
213     auth_data snd_auth;
214     auth_mac snd_auth_mac; // expected response mac
215     ecdh_key snd_ecdh_a; // the secret ecdh key we used for our request
216     ecdh_key snd_ecdh_b; // the public ecdh key we received in the response
217     bool have_snd_auth; // received response for our req
218    
219     // receive auth data - used for ictx
220     auth_data rcv_auth;
221     ecdh_key rcv_ecdh_a; // the secret ecdh key we used for our response
222     ecdh_key rcv_ecdh_b; // the public ecdh key we sent in our response
223     bool have_rcv_auth; // received auth from other side
224    
225 pcg 1.15 #if ENABLE_DNS
226 pcg 1.29 struct dns_connection *dns;
227 pcg 1.15 #endif
228    
229 pcg 1.29 enum conf_node::connectmode connectmode;
230     u8 prot_minor; // minor number of other side
231 pcg 1.1
232 pcg 1.29 void reset_si ();
233     const sockinfo &forward_si (const sockinfo &si) const;
234 pcg 1.1
235 pcg 1.29 void shutdown ();
236 root 1.37 void connection_established (const sockinfo &rsi);
237 pcg 1.29 void reset_connection ();
238    
239     void establish_connection_cb (ev::timer &w, int revents); ev::timer establish_connection;
240     void rekey_cb (ev::timer &w, int revents); ev::timer rekey; // next rekying (actually current reset + reestablishing)
241     void keepalive_cb (ev::timer &w, int revents); ev::timer keepalive; // next keepalive probe
242    
243     void send_connect_request (int id);
244     void send_auth_request (const sockinfo &si, bool initiate);
245 root 1.37 void send_auth_response (const sockinfo &si);
246 pcg 1.29 void send_connect_info (int rid, const sockinfo &rsi, u8 rprotocols);
247     void send_reset (const sockinfo &dsi);
248     void send_ping (const sockinfo &dsi, u8 pong = 0);
249     void send_data_packet (tap_packet *pkt);
250    
251 pcg 1.31 void post_inject_queue ();
252     void inject_data_packet (tap_packet *pkt);
253 pcg 1.29 void inject_vpn_packet (vpn_packet *pkt, int tos = 0); // for forwarding
254    
255     void recv_vpn_packet (vpn_packet *pkt, const sockinfo &rsi);
256     void send_vpn_packet (vpn_packet *pkt, const sockinfo &si, int tos = 0);
257    
258     void script_init_env (const char *ext);
259     void script_init_connect_env ();
260     const char *script_node_up ();
261 pcg 1.34 const char *script_node_change ();
262 pcg 1.29 const char *script_node_down ();
263 pcg 1.1
264 pcg 1.29 void dump_status ();
265 pcg 1.1
266 pcg 1.29 connection (struct vpn *vpn, conf_node *conf);
267     ~connection ();
268     };
269 pcg 1.1
270     #endif
271