comparison svr-runopts.c @ 847:f4bb964c8678 keyondemand

Add '-R' for delayed hostkey option
author Matt Johnston <matt@ucc.asn.au>
date Thu, 07 Nov 2013 23:49:37 +0800
parents b298bb438625
children 7540c0822374
comparison
equal deleted inserted replaced
846:b298bb438625 847:f4bb964c8678
42 fprintf(stderr, "Dropbear server v%s https://matt.ucc.asn.au/dropbear/dropbear.html\n" 42 fprintf(stderr, "Dropbear server v%s https://matt.ucc.asn.au/dropbear/dropbear.html\n"
43 "Usage: %s [options]\n" 43 "Usage: %s [options]\n"
44 "-b bannerfile Display the contents of bannerfile" 44 "-b bannerfile Display the contents of bannerfile"
45 " before user login\n" 45 " before user login\n"
46 " (default: none)\n" 46 " (default: none)\n"
47 "-r keyfile Specify hostkeys (repeatable)\n"
48 " defaults: \n"
47 #ifdef DROPBEAR_DSS 49 #ifdef DROPBEAR_DSS
48 "-d dsskeyfile Use dsskeyfile for the DSS host key\n" 50 " dss %s\n"
49 " (default: %s)\n"
50 #endif 51 #endif
51 #ifdef DROPBEAR_RSA 52 #ifdef DROPBEAR_RSA
52 "-r rsakeyfile Use rsakeyfile for the RSA host key\n" 53 " rsa %s\n"
53 " (default: %s)\n" 54 #endif
55 #ifdef DROPBEAR_ECDSA
56 " ecdsa %s\n"
57 #endif
58 #ifdef DROPBEAR_DELAY_HOSTKEY
59 "-R Create hostkeys as required\n"
54 #endif 60 #endif
55 "-F Don't fork into background\n" 61 "-F Don't fork into background\n"
56 #ifdef DISABLE_SYSLOG 62 #ifdef DISABLE_SYSLOG
57 "(Syslog support not compiled in, using stderr)\n" 63 "(Syslog support not compiled in, using stderr)\n"
58 #else 64 #else
93 #ifdef DROPBEAR_DSS 99 #ifdef DROPBEAR_DSS
94 DSS_PRIV_FILENAME, 100 DSS_PRIV_FILENAME,
95 #endif 101 #endif
96 #ifdef DROPBEAR_RSA 102 #ifdef DROPBEAR_RSA
97 RSA_PRIV_FILENAME, 103 RSA_PRIV_FILENAME,
104 #endif
105 #ifdef DROPBEAR_ECDSA
106 ECDSA_PRIV_FILENAME,
98 #endif 107 #endif
99 DROPBEAR_MAX_PORTS, DROPBEAR_DEFPORT, DROPBEAR_PIDFILE, 108 DROPBEAR_MAX_PORTS, DROPBEAR_DEFPORT, DROPBEAR_PIDFILE,
100 DEFAULT_RECV_WINDOW, DEFAULT_KEEPALIVE, DEFAULT_IDLE_TIMEOUT); 109 DEFAULT_RECV_WINDOW, DEFAULT_KEEPALIVE, DEFAULT_IDLE_TIMEOUT);
101 } 110 }
102 111
120 svr_opts.norootpass = 0; 129 svr_opts.norootpass = 0;
121 svr_opts.allowblankpass = 0; 130 svr_opts.allowblankpass = 0;
122 svr_opts.inetdmode = 0; 131 svr_opts.inetdmode = 0;
123 svr_opts.portcount = 0; 132 svr_opts.portcount = 0;
124 svr_opts.hostkey = NULL; 133 svr_opts.hostkey = NULL;
134 svr_opts.delay_hostkey = 0;
125 svr_opts.pidfile = DROPBEAR_PIDFILE; 135 svr_opts.pidfile = DROPBEAR_PIDFILE;
126 #ifdef ENABLE_SVR_LOCALTCPFWD 136 #ifdef ENABLE_SVR_LOCALTCPFWD
127 svr_opts.nolocaltcp = 0; 137 svr_opts.nolocaltcp = 0;
128 #endif 138 #endif
129 #ifdef ENABLE_SVR_REMOTETCPFWD 139 #ifdef ENABLE_SVR_REMOTETCPFWD
177 next = &svr_opts.bannerfile; 187 next = &svr_opts.bannerfile;
178 break; 188 break;
179 case 'd': 189 case 'd':
180 case 'r': 190 case 'r':
181 next = &keyfile; 191 next = &keyfile;
192 break;
193 case 'R':
194 svr_opts.delay_hostkey = 1;
182 break; 195 break;
183 case 'F': 196 case 'F':
184 svr_opts.forkbg = 0; 197 svr_opts.forkbg = 0;
185 break; 198 break;
186 #ifndef DISABLE_SYSLOG 199 #ifndef DISABLE_SYSLOG
388 } 401 }
389 402
390 /* Must be called after syslog/etc is working */ 403 /* Must be called after syslog/etc is working */
391 static void loadhostkey(const char *keyfile, int fatal_duplicate) { 404 static void loadhostkey(const char *keyfile, int fatal_duplicate) {
392 sign_key * read_key = new_sign_key(); 405 sign_key * read_key = new_sign_key();
393 int type = DROPBEAR_SIGNKEY_ANY; 406 enum signkey_type type = DROPBEAR_SIGNKEY_ANY;
394 if (readhostkey(keyfile, read_key, &type) == DROPBEAR_FAILURE) { 407 if (readhostkey(keyfile, read_key, &type) == DROPBEAR_FAILURE) {
395 dropbear_log(LOG_WARNING, "Failed loading %s", keyfile); 408 dropbear_log(LOG_WARNING, "Failed loading %s", keyfile);
396 } 409 }
397 410
398 #ifdef DROPBEAR_RSA 411 #ifdef DROPBEAR_RSA
436 svr_opts.num_hostkey_files++; 449 svr_opts.num_hostkey_files++;
437 } 450 }
438 451
439 void load_all_hostkeys() { 452 void load_all_hostkeys() {
440 int i; 453 int i;
454 int disable_unset_keys = 1;
441 455
442 svr_opts.hostkey = new_sign_key(); 456 svr_opts.hostkey = new_sign_key();
443 457
444 for (i = 0; i < svr_opts.num_hostkey_files; i++) { 458 for (i = 0; i < svr_opts.num_hostkey_files; i++) {
445 char *hostkey_file = svr_opts.hostkey_files[i]; 459 char *hostkey_file = svr_opts.hostkey_files[i];
457 471
458 #ifdef DROPBEAR_ECDSA 472 #ifdef DROPBEAR_ECDSA
459 loadhostkey(ECDSA_PRIV_FILENAME, 0); 473 loadhostkey(ECDSA_PRIV_FILENAME, 0);
460 #endif 474 #endif
461 475
476 #ifdef DROPBEAR_DELAY_HOSTKEY
477 if (svr_opts.delay_hostkey)
478 {
479 disable_unset_keys = 0;
480 }
481 #endif
482
462 #ifdef DROPBEAR_RSA 483 #ifdef DROPBEAR_RSA
463 if (!svr_opts.hostkey->rsakey) { 484 if (disable_unset_keys && !svr_opts.hostkey->rsakey) {
464 disablekey(DROPBEAR_SIGNKEY_RSA); 485 disablekey(DROPBEAR_SIGNKEY_RSA);
465 } 486 }
466 #endif 487 #endif
488
467 #ifdef DROPBEAR_DSS 489 #ifdef DROPBEAR_DSS
468 if (!svr_opts.hostkey->dsskey) { 490 if (disable_unset_keys && !svr_opts.hostkey->dsskey) {
469 disablekey(DROPBEAR_SIGNKEY_RSA); 491 disablekey(DROPBEAR_SIGNKEY_RSA);
470 } 492 }
471 #endif 493 #endif
494
495
472 #ifdef DROPBEAR_ECDSA 496 #ifdef DROPBEAR_ECDSA
473 #ifdef DROPBEAR_ECC_256 497 #ifdef DROPBEAR_ECC_256
474 if (!svr_opts.hostkey->ecckey256) { 498 if ((disable_unset_keys || ECDSA_DEFAULT_SIZE != 256)
499 && !svr_opts.hostkey->ecckey256) {
475 disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP256); 500 disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP256);
476 } 501 }
477 #endif 502 #endif
503
478 #ifdef DROPBEAR_ECC_384 504 #ifdef DROPBEAR_ECC_384
479 if (!svr_opts.hostkey->ecckey384) { 505 if ((disable_unset_keys || ECDSA_DEFAULT_SIZE != 384)
506 && !svr_opts.hostkey->ecckey384) {
480 disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP384); 507 disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP384);
481 } 508 }
482 #endif 509 #endif
510
483 #ifdef DROPBEAR_ECC_521 511 #ifdef DROPBEAR_ECC_521
484 if (!svr_opts.hostkey->ecckey521) { 512 if ((disable_unset_keys || ECDSA_DEFAULT_SIZE != 521)
485 //disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP521); 513 && !svr_opts.hostkey->ecckey521) {
486 } 514 disablekey(DROPBEAR_SIGNKEY_ECDSA_NISTP521);
487 #endif 515 }
488 #endif 516 #endif
489 } 517 #endif /* DROPBEAR_ECDSA */
518
519 }