ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/gvpectrl.C
(Generate patch)

Comparing gvpe/src/gvpectrl.C (file contents):
Revision 1.12 by root, Sun Mar 6 13:49:50 2011 UTC vs.
Revision 1.23 by root, Wed Nov 2 06:58:35 2016 UTC

1/* 1/*
2 gvpectrl.C -- the main file for gvpectrl 2 gvpectrl.C -- the main file for gvpectrl
3 Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl> 3 Copyright (C) 1998-2002 Ivo Timmermans <ivo@o2w.nl>
4 2000-2002 Guus Sliepen <guus@sliepen.eu.org> 4 2000-2002 Guus Sliepen <guus@sliepen.eu.org>
5 2003-2011 Marc Lehmann <gvpe@schmorp.de> 5 2003-2016 Marc Lehmann <gvpe@schmorp.de>
6 6
7 This file is part of GVPE. 7 This file is part of GVPE.
8 8
9 GVPE is free software; you can redistribute it and/or modify it 9 GVPE is free software; you can redistribute it and/or modify it
10 under the terms of the GNU General Public License as published by the 10 under the terms of the GNU General Public License as published by the
44#include <sys/stat.h> 44#include <sys/stat.h>
45#include <sys/types.h> 45#include <sys/types.h>
46#include <unistd.h> 46#include <unistd.h>
47#include <signal.h> 47#include <signal.h>
48 48
49#include <openssl/bn.h>
49#include <openssl/rand.h> 50#include <openssl/rand.h>
50#include <openssl/rsa.h> 51#include <openssl/rsa.h>
51#include <openssl/pem.h> 52#include <openssl/pem.h>
52#include <openssl/evp.h> 53#include <openssl/evp.h>
53 54
71static int show_config; 72static int show_config;
72 73
73/* If nonzero, do not output anything but warnings/errors/very unusual conditions */ 74/* If nonzero, do not output anything but warnings/errors/very unusual conditions */
74static int quiet; 75static int quiet;
75 76
77/* If nonzero, generate single public/private keypair. */
78static const char *generate_key;
79
76/* If nonzero, generate public/private keypair for this net. */ 80/* If nonzero, generate public/private keypair for this net. */
77static int generate_keys; 81static int generate_keys;
82
83// output some debugging info, interna constants &c
84static int debug_info;
78 85
79static struct option const long_options[] = 86static struct option const long_options[] =
80{ 87{
81 {"config", required_argument, NULL, 'c'}, 88 {"config", required_argument, NULL, 'c'},
82 {"kill", optional_argument, NULL, 'k'}, 89 {"kill", optional_argument, NULL, 'k'},
83 {"help", no_argument, &show_help, 1}, 90 {"help", no_argument, &show_help, 1},
84 {"version", no_argument, &show_version, 1}, 91 {"version", no_argument, &show_version, 1},
92 {"generate-key", required_argument, NULL, 'g'},
85 {"generate-keys", no_argument, NULL, 'g'}, 93 {"generate-keys", no_argument, NULL, 'G'},
86 {"quiet", no_argument, &quiet, 1}, 94 {"quiet", no_argument, &quiet, 1},
87 {"show-config", no_argument, &show_config, 's'}, 95 {"show-config", no_argument, &show_config, 's'},
96 {"debug-info", no_argument, &debug_info, 1},
88 {NULL, 0, NULL, 0} 97 {NULL, 0, NULL, 0}
89}; 98};
90 99
91static void 100static void
92usage (int status) 101usage (int status)
97 { 106 {
98 printf (_("Usage: %s [option]...\n\n"), get_identity ()); 107 printf (_("Usage: %s [option]...\n\n"), get_identity ());
99 printf (_ 108 printf (_
100 (" -c, --config=DIR Read configuration options from DIR.\n" 109 (" -c, --config=DIR Read configuration options from DIR.\n"
101 " -k, --kill[=SIGNAL] Attempt to kill a running gvpe and exit.\n" 110 " -k, --kill[=SIGNAL] Attempt to kill a running gvpe and exit.\n"
111 " -g, --generate-key=file Generate public/private RSA keypair.\n"
102 " -g, --generate-keys Generate public/private RSA keypair.\n" 112 " -G, --generate-keys Generate all public/private RSA keypairs.\n"
103 " -s, --show-config Display the configuration information.\n" 113 " -s, --show-config Display the configuration information.\n"
104 " -q, --quiet Be quite quiet.\n" 114 " -q, --quiet Be quite quiet.\n"
105 " --help Display this help and exit.\n" 115 " --help Display this help and exit.\n"
106 " --version Output version information and exit.\n\n")); 116 " --version Output version information and exit.\n\n"));
107 printf (_("Report bugs to <gvpe@schmorp.de>.\n")); 117 printf (_("Report bugs to <gvpe@schmorp.de>.\n"));
114parse_options (int argc, char **argv, char **envp) 124parse_options (int argc, char **argv, char **envp)
115{ 125{
116 int r; 126 int r;
117 int option_index = 0; 127 int option_index = 0;
118 128
119 while ((r = getopt_long (argc, argv, "c:k::qgs", long_options, &option_index)) != EOF) 129 while ((r = getopt_long (argc, argv, "c:k::qg:Gs", long_options, &option_index)) != EOF)
120 { 130 {
121 switch (r) 131 switch (r)
122 { 132 {
123 case 0: /* long option */ 133 case 0: /* long option */
124 break; 134 break;
162 kill_gvpe = SIGTERM; 172 kill_gvpe = SIGTERM;
163 173
164 break; 174 break;
165 175
166 case 'g': /* generate public/private keypair */ 176 case 'g': /* generate public/private keypair */
177 generate_key = optarg;
178 break;
179
180 case 'G': /* generate public/private keypairs */
167 generate_keys = RSA_KEYBITS; 181 generate_keys = 1;
168 break; 182 break;
169 183
170 case 's': 184 case 's':
171 show_config = 1; 185 show_config = 1;
172 break; 186 break;
183 } 197 }
184 } 198 }
185} 199}
186 200
187// this function prettyprints the key generation process 201// this function prettyprints the key generation process
188static void 202static int
189indicator (int a, int b, void *p) 203indicator (int a, int b, BN_GENCB *cb)
190{ 204{
191 if (quiet) 205 if (quiet)
192 return; 206 return 1;
193 207
194 switch (a) 208 switch (a)
195 { 209 {
196 case 0: 210 case 0:
197 fprintf (stderr, "."); 211 fprintf (stderr, ".");
222 break; 236 break;
223 237
224 default: 238 default:
225 fprintf (stderr, "?"); 239 fprintf (stderr, "?");
226 } 240 }
241
242 return 1;
227} 243}
228 244
229/* 245/*
230 * generate public/private RSA keypairs for all hosts that don't have one. 246 * generate public/private RSA keypairs for all hosts that don't have one.
231 */ 247 */
232static int 248static int
233keygen (int bits) 249keygen (const char *pub, const char *priv)
234{ 250{
235 RSA *rsa_key; 251
236 FILE *f; 252 FILE *pubf = fopen (pub, "ab");
237 char *name = NULL; 253 if (!pubf || fseek (pubf, 0, SEEK_END))
254 {
255 perror (pub);
256 exit (EXIT_FAILURE);
257 }
258
259 if (ftell (pubf))
260 {
261 fclose (pubf);
262 return 1;
263 }
264
265 FILE *privf = fopen (priv, "ab");
266
267 /* some libcs are buggy and require an extra seek to the end */
268 if (!privf || fseek (privf, 0, SEEK_END))
269 {
270 perror (priv);
271 exit (EXIT_FAILURE);
272 }
273
274 if (ftell (privf))
275 {
276 fclose (pubf);
277 fclose (privf);
278 return 1;
279 }
280
281 RSA *rsa = RSA_new ();
282 BIGNUM *e = BN_new ();
283 BN_set_bit (e, 0); BN_set_bit (e, 16); // 0x10001, 65537
284
285#if 0
286#if OPENSSL_VERSION_NUMBER < 0x10100000
287 BN_GENCB cb_100;
288 BN_GENCB *cb = &cb_100;
289#else
290 BN_GENCB *cb = BN_GENCB_new ();
291 require (cb);
292#endif
293
294 BN_GENCB_set (cb, indicator, 0);
295 require (RSA_generate_key_ex (rsa, RSABITS, e, cb));
296#else
297 require (RSA_generate_key_ex (rsa, RSABITS, e, 0));
298#endif
299
300 require (PEM_write_RSAPublicKey (pubf, rsa));
301 require (PEM_write_RSAPrivateKey (privf, rsa, NULL, NULL, 0, NULL, NULL));
302
303 fclose (pubf);
304 fclose (privf);
305
306 BN_free (e);
307 RSA_free (rsa);
308
309 return 0;
310}
311
312static int
313keygen_all ()
314{
238 char *fname; 315 char *fname;
239
240 asprintf (&fname, "%s/hostkeys", confbase);
241 mkdir (fname, 0700);
242 free (fname);
243 316
244 asprintf (&fname, "%s/pubkey", confbase); 317 asprintf (&fname, "%s/pubkey", confbase);
245 mkdir (fname, 0700); 318 mkdir (fname, 0700);
246 free (fname); 319 free (fname);
247 320
248 for (configuration::node_vector::iterator i = conf.nodes.begin (); i != conf.nodes.end (); ++i) 321 for (configuration::node_vector::iterator i = conf.nodes.begin (); i != conf.nodes.end (); ++i)
249 { 322 {
250 conf_node *node = *i; 323 conf_node *node = *i;
251 324
252 asprintf (&fname, "%s/pubkey/%s", confbase, node->nodename); 325 ::thisnode = node->nodename;
253 326
254 f = fopen (fname, "a"); 327 char *pub = conf.config_filename ("pubkey/%s", 0);
328 char *priv = conf.config_filename (conf.prikeyfile, "hostkey");
255 329
256 /* some libcs are buggy and require an extra seek to the end */ 330 int status = keygen (pub, priv);
257 if (!f || fseek (f, 0, SEEK_END))
258 {
259 perror (fname);
260 exit (EXIT_FAILURE);
261 }
262 331
263 if (ftell (f)) 332 if (status == 0)
264 { 333 {
265 if (!quiet) 334 if (!quiet)
266 fprintf (stderr, "'%s' already exists, skipping this node %d\n", 335 fprintf (stderr, _("generated %d bits key for %s.\n"), RSABITS, node->nodename);
267 fname, quiet);
268
269 fclose (f);
270 continue;
271 } 336 }
337 else if (status == 1)
338 fprintf (stderr, _("'%s' keypair already exists, skipping node %s.\n"), pub, node->nodename);
272 339
273 fprintf (stderr, _("generating %d bits key for %s:\n"), bits, 340 free (priv);
274 node->nodename);
275
276 rsa_key = RSA_generate_key (bits, 0xFFFF, indicator, NULL);
277
278 if (!rsa_key)
279 {
280 fprintf (stderr, _("error during key generation!\n"));
281 return -1;
282 }
283 else
284 fprintf (stderr, _("Done.\n"));
285
286 require (PEM_write_RSAPublicKey (f, rsa_key));
287 fclose (f);
288 free (fname); 341 free (pub);
289
290 asprintf (&fname, "%s/hostkeys/%s", confbase, node->nodename);
291
292 f = fopen (fname, "a");
293 if (!f)
294 {
295 perror (fname);
296 exit (EXIT_FAILURE);
297 }
298
299 require (PEM_write_RSAPrivateKey (f, rsa_key, NULL, NULL, 0, NULL, NULL));
300 fclose (f);
301 free (fname);
302 } 342 }
303 343
304 return 0; 344 return 0;
345}
346
347static int
348keygen_one (const char *pubname)
349{
350 char *privname;
351
352 asprintf (&privname, "%s.privkey", pubname);
353
354 int status = keygen (pubname, privname);
355
356 if (status == 0)
357 {
358 if (!quiet)
359 fprintf (stderr, _("generated %d bits key as %s.\n"), RSABITS, pubname);
360 }
361 else if (status == 1)
362 {
363 fprintf (stderr, _("'%s' keypair already exists, not generating key.\n"), pubname);
364 exit (EXIT_FAILURE);
365 }
366
367 free(privname);
305} 368}
306 369
307int 370int
308main (int argc, char **argv, char **envp) 371main (int argc, char **argv, char **envp)
309{ 372{
320 { 383 {
321 printf (_("%s version %s (built %s %s, protocol version %d.%d)\n"), get_identity (), 384 printf (_("%s version %s (built %s %s, protocol version %d.%d)\n"), get_identity (),
322 VERSION, __DATE__, __TIME__, PROTOCOL_MAJOR, PROTOCOL_MINOR); 385 VERSION, __DATE__, __TIME__, PROTOCOL_MAJOR, PROTOCOL_MINOR);
323 printf (_("Built with kernel interface %s/%s.\n"), IFTYPE, IFSUBTYPE); 386 printf (_("Built with kernel interface %s/%s.\n"), IFTYPE, IFSUBTYPE);
324 printf (_ 387 printf (_
325 ("Copyright (C) 2003-2008 Marc Lehmann <gvpe@schmorp.de> and others.\n" 388 ("Copyright (C) 2003-2013 Marc Lehmann <gvpe@schmorp.de> and others.\n"
326 "See the AUTHORS file for a complete list.\n\n" 389 "See the AUTHORS file for a complete list.\n\n"
327 "vpe comes with ABSOLUTELY NO WARRANTY. This is free software,\n" 390 "vpe comes with ABSOLUTELY NO WARRANTY. This is free software,\n"
328 "and you are welcome to redistribute it under certain conditions;\n" 391 "and you are welcome to redistribute it under certain conditions;\n"
329 "see the file COPYING for details.\n")); 392 "see the file COPYING for details.\n"));
330 393
336 399
337 { 400 {
338 configuration_parser (conf, false, 0, 0); 401 configuration_parser (conf, false, 0, 0);
339 } 402 }
340 403
404 if (debug_info)
405 {
406 printf ("cipher_nid=%d\n", EVP_CIPHER_nid (CIPHER ()));
407 printf ("mac_nid=%d\n", EVP_MD_type (MAC_DIGEST ()));
408 printf ("auth_nid=%d\n", EVP_MD_type (AUTH_DIGEST ()));
409 printf ("sizeof_auth_data=%d\n", sizeof (auth_data));
410 printf ("sizeof_rsa_data=%d\n", sizeof (rsa_data));
411 printf ("sizeof_rsa_data_extra_auth=%d\n", sizeof (((rsa_data *)0)->extra_auth));
412 printf ("raw_overhead=%d\n", VPE_OVERHEAD);
413 printf ("vpn_overhead=%d\n", VPE_OVERHEAD + 6 + 6);
414 printf ("udp_overhead=%d\n", UDP_OVERHEAD + VPE_OVERHEAD + 6 + 6);
415 exit (EXIT_SUCCESS);
416 }
417
418 if (generate_key)
419 {
420 RAND_load_file (conf.seed_dev, SEED_SIZE);
421 exit (keygen_one (generate_key));
422 }
423
341 if (generate_keys) 424 if (generate_keys)
342 { 425 {
343 RAND_load_file ("/dev/urandom", 1024); 426 RAND_load_file (conf.seed_dev, SEED_SIZE);
344 exit (keygen (generate_keys)); 427 exit (keygen_all ());
345 } 428 }
346 429
347 if (kill_gvpe) 430 if (kill_gvpe)
348 exit (kill_other (kill_gvpe)); 431 exit (kill_other (kill_gvpe));
349 432
353 exit (EXIT_SUCCESS); 436 exit (EXIT_SUCCESS);
354 } 437 }
355 438
356 usage (1); 439 usage (1);
357} 440}
441

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines