|
Lines 64-69
Link Here
|
| 64 |
|
64 |
|
| 65 |
#include <openssl/dh.h> |
65 |
#include <openssl/dh.h> |
| 66 |
#include <openssl/bn.h> |
66 |
#include <openssl/bn.h> |
|
|
67 |
#include <openssl/err.h> |
| 67 |
#include <openssl/md5.h> |
68 |
#include <openssl/md5.h> |
| 68 |
#include <openssl/rand.h> |
69 |
#include <openssl/rand.h> |
| 69 |
|
70 |
|
|
Lines 186-191
Kex *xxx_kex;
Link Here
|
| 186 |
*/ |
187 |
*/ |
| 187 |
struct { |
188 |
struct { |
| 188 |
Key *server_key; /* ephemeral server key */ |
189 |
Key *server_key; /* ephemeral server key */ |
|
|
190 |
Key *ssh2_rsakex_key; /* ssh2 RSA KEX key */ |
| 189 |
Key *ssh1_host_key; /* ssh1 host key */ |
191 |
Key *ssh1_host_key; /* ssh1 host key */ |
| 190 |
Key **host_keys; /* all private host keys */ |
192 |
Key **host_keys; /* all private host keys */ |
| 191 |
int have_ssh1_key; |
193 |
int have_ssh1_key; |
|
Lines 352-372
generate_ephemeral_server_key(void)
Link Here
|
| 352 |
u_int32_t rnd = 0; |
354 |
u_int32_t rnd = 0; |
| 353 |
int i; |
355 |
int i; |
| 354 |
|
356 |
|
| 355 |
verbose("Generating %s%d bit RSA key.", |
357 |
if (options.protocol & SSH_PROTO_1) { |
| 356 |
sensitive_data.server_key ? "new " : "", options.server_key_bits); |
358 |
verbose("Generating %s%d bit RSA key.", |
| 357 |
if (sensitive_data.server_key != NULL) |
359 |
sensitive_data.server_key ? "new " : "", |
| 358 |
key_free(sensitive_data.server_key); |
360 |
options.server_key_bits); |
| 359 |
sensitive_data.server_key = key_generate(KEY_RSA1, |
361 |
if (sensitive_data.server_key != NULL) |
| 360 |
options.server_key_bits); |
362 |
key_free(sensitive_data.server_key); |
| 361 |
verbose("RSA key generation complete."); |
363 |
sensitive_data.server_key = key_generate(KEY_RSA1, |
| 362 |
|
364 |
options.server_key_bits); |
| 363 |
for (i = 0; i < SSH_SESSION_KEY_LENGTH; i++) { |
365 |
verbose("RSA key generation complete."); |
| 364 |
if (i % 4 == 0) |
366 |
|
| 365 |
rnd = arc4random(); |
367 |
for (i = 0; i < SSH_SESSION_KEY_LENGTH; i++) { |
| 366 |
sensitive_data.ssh1_cookie[i] = rnd & 0xff; |
368 |
if (i % 4 == 0) |
| 367 |
rnd >>= 8; |
369 |
rnd = arc4random(); |
|
|
370 |
sensitive_data.ssh1_cookie[i] = rnd & 0xff; |
| 371 |
rnd >>= 8; |
| 372 |
} |
| 373 |
arc4random_stir(); |
| 374 |
} |
| 375 |
|
| 376 |
if (options.protocol & SSH_PROTO_2) { |
| 377 |
verbose("Generating %s1024 bit RSA key for SSH-2.", |
| 378 |
sensitive_data.ssh2_rsakex_key ? "new " : ""); |
| 379 |
if (sensitive_data.ssh2_rsakex_key != NULL) |
| 380 |
key_free(sensitive_data.ssh2_rsakex_key); |
| 381 |
sensitive_data.ssh2_rsakex_key = key_generate(KEY_RSA, 1024); |
| 382 |
verbose("RSA key generation complete."); |
| 368 |
} |
383 |
} |
| 369 |
arc4random_stir(); |
|
|
| 370 |
} |
384 |
} |
| 371 |
|
385 |
|
| 372 |
/*ARGSUSED*/ |
386 |
/*ARGSUSED*/ |
|
Lines 525-530
destroy_sensitive_data(void)
Link Here
|
| 525 |
key_free(sensitive_data.server_key); |
539 |
key_free(sensitive_data.server_key); |
| 526 |
sensitive_data.server_key = NULL; |
540 |
sensitive_data.server_key = NULL; |
| 527 |
} |
541 |
} |
|
|
542 |
if (sensitive_data.ssh2_rsakex_key) { |
| 543 |
key_free(sensitive_data.ssh2_rsakex_key); |
| 544 |
sensitive_data.ssh2_rsakex_key = NULL; |
| 545 |
} |
| 528 |
for (i = 0; i < options.num_host_key_files; i++) { |
546 |
for (i = 0; i < options.num_host_key_files; i++) { |
| 529 |
if (sensitive_data.host_keys[i]) { |
547 |
if (sensitive_data.host_keys[i]) { |
| 530 |
key_free(sensitive_data.host_keys[i]); |
548 |
key_free(sensitive_data.host_keys[i]); |
|
Lines 548-553
demote_sensitive_data(void)
Link Here
|
| 548 |
sensitive_data.server_key = tmp; |
566 |
sensitive_data.server_key = tmp; |
| 549 |
} |
567 |
} |
| 550 |
|
568 |
|
|
|
569 |
if (sensitive_data.ssh2_rsakex_key) { |
| 570 |
tmp = key_demote(sensitive_data.ssh2_rsakex_key); |
| 571 |
key_free(sensitive_data.ssh2_rsakex_key); |
| 572 |
sensitive_data.ssh2_rsakex_key = tmp; |
| 573 |
} |
| 574 |
|
| 551 |
for (i = 0; i < options.num_host_key_files; i++) { |
575 |
for (i = 0; i < options.num_host_key_files; i++) { |
| 552 |
if (sensitive_data.host_keys[i]) { |
576 |
if (sensitive_data.host_keys[i]) { |
| 553 |
tmp = key_demote(sensitive_data.host_keys[i]); |
577 |
tmp = key_demote(sensitive_data.host_keys[i]); |
|
Lines 756-761
get_hostkey_index(Key *key)
Link Here
|
| 756 |
return (-1); |
780 |
return (-1); |
| 757 |
} |
781 |
} |
| 758 |
|
782 |
|
|
|
783 |
Key * |
| 784 |
get_ssh2_rsakex_key(void) |
| 785 |
{ |
| 786 |
|
| 787 |
return (sensitive_data.ssh2_rsakex_key); |
| 788 |
} |
| 789 |
|
| 759 |
/* |
790 |
/* |
| 760 |
* returns 1 if connection should be dropped, 0 otherwise. |
791 |
* returns 1 if connection should be dropped, 0 otherwise. |
| 761 |
* dropping starts at connection #max_startups_begin with a probability |
792 |
* dropping starts at connection #max_startups_begin with a probability |
|
Lines 814-819
send_rexec_state(int fd, Buffer *conf)
Link Here
|
| 814 |
* bignum iqmp " |
845 |
* bignum iqmp " |
| 815 |
* bignum p " |
846 |
* bignum p " |
| 816 |
* bignum q " |
847 |
* bignum q " |
|
|
848 |
* u_int ephemeral_ssh2_key_follows |
| 849 |
* bignum e (only if ephemeral_ssh2_key_follows == 1) |
| 850 |
* bignum n " |
| 851 |
* bignum d " |
| 852 |
* bignum iqmp " |
| 853 |
* bignum p " |
| 854 |
* bignum q " |
| 817 |
*/ |
855 |
*/ |
| 818 |
buffer_init(&m); |
856 |
buffer_init(&m); |
| 819 |
buffer_put_cstring(&m, buffer_ptr(conf)); |
857 |
buffer_put_cstring(&m, buffer_ptr(conf)); |
|
Lines 830-835
send_rexec_state(int fd, Buffer *conf)
Link Here
|
| 830 |
} else |
868 |
} else |
| 831 |
buffer_put_int(&m, 0); |
869 |
buffer_put_int(&m, 0); |
| 832 |
|
870 |
|
|
|
871 |
if (sensitive_data.ssh2_rsakex_key != NULL && |
| 872 |
sensitive_data.ssh2_rsakex_key->type == KEY_RSA) { |
| 873 |
buffer_put_int(&m, 1); |
| 874 |
buffer_put_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->e); |
| 875 |
buffer_put_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->n); |
| 876 |
buffer_put_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->d); |
| 877 |
buffer_put_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->iqmp); |
| 878 |
buffer_put_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->p); |
| 879 |
buffer_put_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->q); |
| 880 |
} else |
| 881 |
buffer_put_int(&m, 0); |
| 882 |
|
| 833 |
if (ssh_msg_send(fd, 0, &m) == -1) |
883 |
if (ssh_msg_send(fd, 0, &m) == -1) |
| 834 |
fatal("%s: ssh_msg_send failed", __func__); |
884 |
fatal("%s: ssh_msg_send failed", __func__); |
| 835 |
|
885 |
|
|
Lines 872-877
recv_rexec_state(int fd, Buffer *conf)
Link Here
|
| 872 |
rsa_generate_additional_parameters( |
922 |
rsa_generate_additional_parameters( |
| 873 |
sensitive_data.server_key->rsa); |
923 |
sensitive_data.server_key->rsa); |
| 874 |
} |
924 |
} |
|
|
925 |
if (buffer_get_int(&m)) { |
| 926 |
if (sensitive_data.ssh2_rsakex_key != NULL) |
| 927 |
key_free(sensitive_data.ssh2_rsakex_key); |
| 928 |
sensitive_data.ssh2_rsakex_key = key_new_private(KEY_RSA); |
| 929 |
buffer_get_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->e); |
| 930 |
buffer_get_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->n); |
| 931 |
buffer_get_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->d); |
| 932 |
buffer_get_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->iqmp); |
| 933 |
buffer_get_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->p); |
| 934 |
buffer_get_bignum(&m, sensitive_data.ssh2_rsakex_key->rsa->q); |
| 935 |
rsa_generate_additional_parameters( |
| 936 |
sensitive_data.ssh2_rsakex_key->rsa); |
| 937 |
} |
| 875 |
buffer_free(&m); |
938 |
buffer_free(&m); |
| 876 |
|
939 |
|
| 877 |
debug3("%s: done", __func__); |
940 |
debug3("%s: done", __func__); |
|
Lines 1169-1176
server_accept_loop(int *sock_in, int *so
Link Here
|
| 1169 |
* Mark that the key has been used (it |
1232 |
* Mark that the key has been used (it |
| 1170 |
* was "given" to the child). |
1233 |
* was "given" to the child). |
| 1171 |
*/ |
1234 |
*/ |
| 1172 |
if ((options.protocol & SSH_PROTO_1) && |
1235 |
if (key_used == 0) { |
| 1173 |
key_used == 0) { |
|
|
| 1174 |
/* Schedule server key regeneration alarm. */ |
1236 |
/* Schedule server key regeneration alarm. */ |
| 1175 |
signal(SIGALRM, key_regeneration_alarm); |
1237 |
signal(SIGALRM, key_regeneration_alarm); |
| 1176 |
alarm(options.key_regeneration_time); |
1238 |
alarm(options.key_regeneration_time); |
|
Lines 1329-1334
main(int ac, char **av)
Link Here
|
| 1329 |
closefrom(REEXEC_DEVCRYPTO_RESERVED_FD); |
1391 |
closefrom(REEXEC_DEVCRYPTO_RESERVED_FD); |
| 1330 |
|
1392 |
|
| 1331 |
SSLeay_add_all_algorithms(); |
1393 |
SSLeay_add_all_algorithms(); |
|
|
1394 |
ERR_load_crypto_strings(); |
| 1332 |
|
1395 |
|
| 1333 |
/* |
1396 |
/* |
| 1334 |
* Force logging to stderr until we have loaded the private host |
1397 |
* Force logging to stderr until we have loaded the private host |
|
Lines 1342-1347
main(int ac, char **av)
Link Here
|
| 1342 |
log_stderr || !inetd_flag); |
1405 |
log_stderr || !inetd_flag); |
| 1343 |
|
1406 |
|
| 1344 |
sensitive_data.server_key = NULL; |
1407 |
sensitive_data.server_key = NULL; |
|
|
1408 |
sensitive_data.ssh2_rsakex_key = NULL; |
| 1345 |
sensitive_data.ssh1_host_key = NULL; |
1409 |
sensitive_data.ssh1_host_key = NULL; |
| 1346 |
sensitive_data.have_ssh1_key = 0; |
1410 |
sensitive_data.have_ssh1_key = 0; |
| 1347 |
sensitive_data.have_ssh2_key = 0; |
1411 |
sensitive_data.have_ssh2_key = 0; |
|
Lines 1509-1522
main(int ac, char **av)
Link Here
|
| 1509 |
if (inetd_flag) { |
1573 |
if (inetd_flag) { |
| 1510 |
server_accept_inetd(&sock_in, &sock_out); |
1574 |
server_accept_inetd(&sock_in, &sock_out); |
| 1511 |
|
1575 |
|
| 1512 |
if ((options.protocol & SSH_PROTO_1) && |
1576 |
if (((options.protocol & SSH_PROTO_1) && |
| 1513 |
sensitive_data.server_key == NULL) |
1577 |
sensitive_data.server_key == NULL) || |
| 1514 |
generate_ephemeral_server_key(); |
1578 |
((options.protocol & SSH_PROTO_2) && |
|
|
1579 |
sensitive_data.ssh2_rsakex_key == NULL)) |
| 1580 |
generate_ephemeral_server_key(); |
| 1515 |
} else { |
1581 |
} else { |
| 1516 |
server_listen(); |
1582 |
server_listen(); |
| 1517 |
|
1583 |
|
| 1518 |
if (options.protocol & SSH_PROTO_1) |
1584 |
generate_ephemeral_server_key(); |
| 1519 |
generate_ephemeral_server_key(); |
|
|
| 1520 |
|
1585 |
|
| 1521 |
signal(SIGHUP, sighup_handler); |
1586 |
signal(SIGHUP, sighup_handler); |
| 1522 |
signal(SIGCHLD, main_sigchld_handler); |
1587 |
signal(SIGCHLD, main_sigchld_handler); |
|
Lines 1995-2000
do_ssh2_kex(void)
Link Here
|
| 1995 |
myproposal[PROPOSAL_COMP_ALGS_CTOS] = |
2060 |
myproposal[PROPOSAL_COMP_ALGS_CTOS] = |
| 1996 |
myproposal[PROPOSAL_COMP_ALGS_STOC] = "none,zlib@openssh.com"; |
2061 |
myproposal[PROPOSAL_COMP_ALGS_STOC] = "none,zlib@openssh.com"; |
| 1997 |
} |
2062 |
} |
|
|
2063 |
if (options.kexmethods != NULL) |
| 2064 |
myproposal[PROPOSAL_KEX_ALGS] = options.kexmethods; |
| 1998 |
|
2065 |
|
| 1999 |
myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = list_hostkey_types(); |
2066 |
myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = list_hostkey_types(); |
| 2000 |
|
2067 |
|
|
Lines 2004-2009
do_ssh2_kex(void)
Link Here
|
| 2004 |
kex->kex[KEX_DH_GRP14_SHA1] = kexdh_server; |
2071 |
kex->kex[KEX_DH_GRP14_SHA1] = kexdh_server; |
| 2005 |
kex->kex[KEX_DH_GEX_SHA1] = kexgex_server; |
2072 |
kex->kex[KEX_DH_GEX_SHA1] = kexgex_server; |
| 2006 |
kex->kex[KEX_DH_GEX_SHA256] = kexgex_server; |
2073 |
kex->kex[KEX_DH_GEX_SHA256] = kexgex_server; |
|
|
2074 |
kex->kex[KEX_RSA_SHA1] = kexrsa_server; |
| 2007 |
kex->server = 1; |
2075 |
kex->server = 1; |
| 2008 |
kex->client_version_string=client_version_string; |
2076 |
kex->client_version_string=client_version_string; |
| 2009 |
kex->server_version_string=server_version_string; |
2077 |
kex->server_version_string=server_version_string; |