]> andersk Git - openssh.git/blob - sshd.c
- (djm) Add workaround for Linux 2.4's gratuitious errno change. Patch
[openssh.git] / sshd.c
1 /*
2  * Author: Tatu Ylonen <ylo@cs.hut.fi>
3  * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
4  *                    All rights reserved
5  * This program is the ssh daemon.  It listens for connections from clients,
6  * and performs authentication, executes use commands or shell, and forwards
7  * information to/from the application to the user client over an encrypted
8  * connection.  This can also handle forwarding of X11, TCP/IP, and
9  * authentication agent connections.
10  *
11  * As far as I am concerned, the code I have written for this software
12  * can be used freely for any purpose.  Any derived versions of this
13  * software must be clearly marked as such, and if the derived work is
14  * incompatible with the protocol description in the RFC file, it must be
15  * called by a name other than "ssh" or "Secure Shell".
16  *
17  * SSH2 implementation:
18  *
19  * Copyright (c) 2000 Markus Friedl.  All rights reserved.
20  *
21  * Redistribution and use in source and binary forms, with or without
22  * modification, are permitted provided that the following conditions
23  * are met:
24  * 1. Redistributions of source code must retain the above copyright
25  *    notice, this list of conditions and the following disclaimer.
26  * 2. Redistributions in binary form must reproduce the above copyright
27  *    notice, this list of conditions and the following disclaimer in the
28  *    documentation and/or other materials provided with the distribution.
29  *
30  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
31  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
32  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
33  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
34  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
35  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
36  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
37  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
38  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
39  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
40  */
41
42 #include "includes.h"
43 RCSID("$OpenBSD: sshd.c,v 1.128 2000/09/17 15:38:59 markus Exp $");
44
45 #include "xmalloc.h"
46 #include "rsa.h"
47 #include "ssh.h"
48 #include "pty.h"
49 #include "packet.h"
50 #include "cipher.h"
51 #include "mpaux.h"
52 #include "servconf.h"
53 #include "uidswap.h"
54 #include "compat.h"
55 #include "buffer.h"
56
57 #include "ssh2.h"
58 #include <openssl/dh.h>
59 #include <openssl/bn.h>
60 #include <openssl/hmac.h>
61 #include "kex.h"
62 #include <openssl/dsa.h>
63 #include <openssl/rsa.h>
64 #include "key.h"
65 #include "dsa.h"
66
67 #include "auth.h"
68 #include "myproposal.h"
69 #include "authfile.h"
70
71 #ifdef LIBWRAP
72 #include <tcpd.h>
73 #include <syslog.h>
74 int allow_severity = LOG_INFO;
75 int deny_severity = LOG_WARNING;
76 #endif /* LIBWRAP */
77
78 #ifndef O_NOCTTY
79 #define O_NOCTTY        0
80 #endif
81
82 /* Server configuration options. */
83 ServerOptions options;
84
85 /* Name of the server configuration file. */
86 char *config_file_name = SERVER_CONFIG_FILE;
87
88 /*
89  * Flag indicating whether IPv4 or IPv6.  This can be set on the command line.
90  * Default value is AF_UNSPEC means both IPv4 and IPv6.
91  */
92 #ifdef IPV4_DEFAULT
93 int IPv4or6 = AF_INET;
94 #else
95 int IPv4or6 = AF_UNSPEC;
96 #endif
97
98 /*
99  * Debug mode flag.  This can be set on the command line.  If debug
100  * mode is enabled, extra debugging output will be sent to the system
101  * log, the daemon will not go to background, and will exit after processing
102  * the first connection.
103  */
104 int debug_flag = 0;
105
106 /* Flag indicating that the daemon is being started from inetd. */
107 int inetd_flag = 0;
108
109 /* debug goes to stderr unless inetd_flag is set */
110 int log_stderr = 0;
111
112 /* argv[0] without path. */
113 char *av0;
114
115 /* Saved arguments to main(). */
116 char **saved_argv;
117 int saved_argc;
118
119 /*
120  * The sockets that the server is listening; this is used in the SIGHUP
121  * signal handler.
122  */
123 #define MAX_LISTEN_SOCKS        16
124 int listen_socks[MAX_LISTEN_SOCKS];
125 int num_listen_socks = 0;
126
127 /*
128  * the client's version string, passed by sshd2 in compat mode. if != NULL,
129  * sshd will skip the version-number exchange
130  */
131 char *client_version_string = NULL;
132 char *server_version_string = NULL;
133
134 /*
135  * Any really sensitive data in the application is contained in this
136  * structure. The idea is that this structure could be locked into memory so
137  * that the pages do not get written into swap.  However, there are some
138  * problems. The private key contains BIGNUMs, and we do not (in principle)
139  * have access to the internals of them, and locking just the structure is
140  * not very useful.  Currently, memory locking is not implemented.
141  */
142 struct {
143         RSA *private_key;        /* Private part of empheral server key. */
144         RSA *host_key;           /* Private part of host key. */
145         Key *dsa_host_key;       /* Private DSA host key. */
146 } sensitive_data;
147
148 /*
149  * Flag indicating whether the current session key has been used.  This flag
150  * is set whenever the key is used, and cleared when the key is regenerated.
151  */
152 int key_used = 0;
153
154 /* This is set to true when SIGHUP is received. */
155 int received_sighup = 0;
156
157 /* Public side of the server key.  This value is regenerated regularly with
158    the private key. */
159 RSA *public_key;
160
161 /* session identifier, used by RSA-auth */
162 unsigned char session_id[16];
163
164 /* same for ssh2 */
165 unsigned char *session_id2 = NULL;
166 int session_id2_len = 0;
167
168 /* record remote hostname or ip */
169 unsigned int utmp_len = MAXHOSTNAMELEN;
170
171 /* Prototypes for various functions defined later in this file. */
172 void do_ssh1_kex();
173 void do_ssh2_kex();
174
175 /*
176  * Close all listening sockets
177  */
178 void
179 close_listen_socks(void)
180 {
181         int i;
182         for (i = 0; i < num_listen_socks; i++)
183                 close(listen_socks[i]);
184         num_listen_socks = -1;
185 }
186
187 /*
188  * Signal handler for SIGHUP.  Sshd execs itself when it receives SIGHUP;
189  * the effect is to reread the configuration file (and to regenerate
190  * the server key).
191  */
192 void
193 sighup_handler(int sig)
194 {
195         received_sighup = 1;
196         signal(SIGHUP, sighup_handler);
197 }
198
199 /*
200  * Called from the main program after receiving SIGHUP.
201  * Restarts the server.
202  */
203 void
204 sighup_restart()
205 {
206         log("Received SIGHUP; restarting.");
207         close_listen_socks();
208         execv(saved_argv[0], saved_argv);
209         log("RESTART FAILED: av0='%s', error: %s.", av0, strerror(errno));
210         exit(1);
211 }
212
213 /*
214  * Generic signal handler for terminating signals in the master daemon.
215  * These close the listen socket; not closing it seems to cause "Address
216  * already in use" problems on some machines, which is inconvenient.
217  */
218 void
219 sigterm_handler(int sig)
220 {
221         log("Received signal %d; terminating.", sig);
222         close_listen_socks();
223         unlink(options.pid_file);
224         exit(255);
225 }
226
227 /*
228  * SIGCHLD handler.  This is called whenever a child dies.  This will then
229  * reap any zombies left by exited c.
230  */
231 void
232 main_sigchld_handler(int sig)
233 {
234         int save_errno = errno;
235         int status;
236
237         while (waitpid(-1, &status, WNOHANG) > 0)
238                 ;
239
240         signal(SIGCHLD, main_sigchld_handler);
241         errno = save_errno;
242 }
243
244 /*
245  * Signal handler for the alarm after the login grace period has expired.
246  */
247 void
248 grace_alarm_handler(int sig)
249 {
250         /* Close the connection. */
251         packet_close();
252
253         /* Log error and exit. */
254         fatal("Timeout before authentication for %s.", get_remote_ipaddr());
255 }
256
257 /*
258  * Signal handler for the key regeneration alarm.  Note that this
259  * alarm only occurs in the daemon waiting for connections, and it does not
260  * do anything with the private key or random state before forking.
261  * Thus there should be no concurrency control/asynchronous execution
262  * problems.
263  */
264 /* XXX do we really want this work to be done in a signal handler ? -m */
265 void
266 key_regeneration_alarm(int sig)
267 {
268         int save_errno = errno;
269
270         /* Check if we should generate a new key. */
271         if (key_used) {
272                 /* This should really be done in the background. */
273                 log("Generating new %d bit RSA key.", options.server_key_bits);
274
275                 if (sensitive_data.private_key != NULL)
276                         RSA_free(sensitive_data.private_key);
277                 sensitive_data.private_key = RSA_new();
278
279                 if (public_key != NULL)
280                         RSA_free(public_key);
281                 public_key = RSA_new();
282
283                 rsa_generate_key(sensitive_data.private_key, public_key,
284                                  options.server_key_bits);
285                 arc4random_stir();
286                 key_used = 0;
287                 log("RSA key generation complete.");
288         }
289         /* Reschedule the alarm. */
290         signal(SIGALRM, key_regeneration_alarm);
291         alarm(options.key_regeneration_time);
292         errno = save_errno;
293 }
294
295 void
296 sshd_exchange_identification(int sock_in, int sock_out)
297 {
298         int i, mismatch;
299         int remote_major, remote_minor;
300         int major, minor;
301         char *s;
302         char buf[256];                  /* Must not be larger than remote_version. */
303         char remote_version[256];       /* Must be at least as big as buf. */
304
305         if ((options.protocol & SSH_PROTO_1) &&
306             (options.protocol & SSH_PROTO_2)) {
307                 major = PROTOCOL_MAJOR_1;
308                 minor = 99;
309         } else if (options.protocol & SSH_PROTO_2) {
310                 major = PROTOCOL_MAJOR_2;
311                 minor = PROTOCOL_MINOR_2;
312         } else {
313                 major = PROTOCOL_MAJOR_1;
314                 minor = PROTOCOL_MINOR_1;
315         }
316         snprintf(buf, sizeof buf, "SSH-%d.%d-%.100s\n", major, minor, SSH_VERSION);
317         server_version_string = xstrdup(buf);
318
319         if (client_version_string == NULL) {
320                 /* Send our protocol version identification. */
321                 if (atomicio(write, sock_out, server_version_string, strlen(server_version_string))
322                     != strlen(server_version_string)) {
323                         log("Could not write ident string to %s.", get_remote_ipaddr());
324                         fatal_cleanup();
325                 }
326
327                 /* Read other side\'s version identification. */
328                 for (i = 0; i < sizeof(buf) - 1; i++) {
329                         if (atomicio(read, sock_in, &buf[i], 1) != 1) {
330                                 log("Did not receive ident string from %s.", get_remote_ipaddr());
331                                 fatal_cleanup();
332                         }
333                         if (buf[i] == '\r') {
334                                 buf[i] = '\n';
335                                 buf[i + 1] = 0;
336                                 continue;
337                         }
338                         if (buf[i] == '\n') {
339                                 /* buf[i] == '\n' */
340                                 buf[i + 1] = 0;
341                                 break;
342                         }
343                 }
344                 buf[sizeof(buf) - 1] = 0;
345                 client_version_string = xstrdup(buf);
346         }
347
348         /*
349          * Check that the versions match.  In future this might accept
350          * several versions and set appropriate flags to handle them.
351          */
352         if (sscanf(client_version_string, "SSH-%d.%d-%[^\n]\n",
353             &remote_major, &remote_minor, remote_version) != 3) {
354                 s = "Protocol mismatch.\n";
355                 (void) atomicio(write, sock_out, s, strlen(s));
356                 close(sock_in);
357                 close(sock_out);
358                 log("Bad protocol version identification '%.100s' from %s",
359                     client_version_string, get_remote_ipaddr());
360                 fatal_cleanup();
361         }
362         debug("Client protocol version %d.%d; client software version %.100s",
363               remote_major, remote_minor, remote_version);
364
365         compat_datafellows(remote_version);
366
367         mismatch = 0;
368         switch(remote_major) {
369         case 1:
370                 if (remote_minor == 99) {
371                         if (options.protocol & SSH_PROTO_2)
372                                 enable_compat20();
373                         else
374                                 mismatch = 1;
375                         break;
376                 }
377                 if (!(options.protocol & SSH_PROTO_1)) {
378                         mismatch = 1;
379                         break;
380                 }
381                 if (remote_minor < 3) {
382                         packet_disconnect("Your ssh version is too old and "
383                             "is no longer supported.  Please install a newer version.");
384                 } else if (remote_minor == 3) {
385                         /* note that this disables agent-forwarding */
386                         enable_compat13();
387                 }
388                 break;
389         case 2:
390                 if (options.protocol & SSH_PROTO_2) {
391                         enable_compat20();
392                         break;
393                 }
394                 /* FALLTHROUGH */
395         default:
396                 mismatch = 1;
397                 break;
398         }
399         chop(server_version_string);
400         chop(client_version_string);
401         debug("Local version string %.200s", server_version_string);
402
403         if (mismatch) {
404                 s = "Protocol major versions differ.\n";
405                 (void) atomicio(write, sock_out, s, strlen(s));
406                 close(sock_in);
407                 close(sock_out);
408                 log("Protocol major versions differ for %s: %.200s vs. %.200s",
409                     get_remote_ipaddr(),
410                     server_version_string, client_version_string);
411                 fatal_cleanup();
412         }
413         if (compat20)
414                 packet_set_ssh2_format();
415 }
416
417
418 void
419 destroy_sensitive_data(void)
420 {
421         /* Destroy the private and public keys.  They will no longer be needed. */
422         if (public_key)
423                 RSA_free(public_key);
424         if (sensitive_data.private_key)
425                 RSA_free(sensitive_data.private_key);
426         if (sensitive_data.host_key)
427                 RSA_free(sensitive_data.host_key);
428         if (sensitive_data.dsa_host_key != NULL)
429                 key_free(sensitive_data.dsa_host_key);
430 }
431
432 /*
433  * returns 1 if connection should be dropped, 0 otherwise.
434  * dropping starts at connection #max_startups_begin with a probability
435  * of (max_startups_rate/100). the probability increases linearly until
436  * all connections are dropped for startups > max_startups
437  */
438 int
439 drop_connection(int startups)
440 {
441         double p, r;
442
443         if (startups < options.max_startups_begin)
444                 return 0;
445         if (startups >= options.max_startups)
446                 return 1;
447         if (options.max_startups_rate == 100)
448                 return 1;
449
450         p  = 100 - options.max_startups_rate;
451         p *= startups - options.max_startups_begin;
452         p /= (double) (options.max_startups - options.max_startups_begin);
453         p += options.max_startups_rate;
454         p /= 100.0;
455         r = arc4random() / (double) UINT_MAX;
456
457         debug("drop_connection: p %g, r %g", p, r);
458         return (r < p) ? 1 : 0;
459 }
460
461 int *startup_pipes = NULL;      /* options.max_startup sized array of fd ints */
462 int startup_pipe;               /* in child */
463
464 /*
465  * Main program for the daemon.
466  */
467 int
468 main(int ac, char **av)
469 {
470         extern char *optarg;
471         extern int optind;
472         int opt, sock_in = 0, sock_out = 0, newsock, j, i, fdsetsz, on = 1;
473         pid_t pid;
474         socklen_t fromlen;
475         int silent = 0;
476         fd_set *fdset;
477         struct sockaddr_storage from;
478         const char *remote_ip;
479         int remote_port;
480         FILE *f;
481         struct linger linger;
482         struct addrinfo *ai;
483         char ntop[NI_MAXHOST], strport[NI_MAXSERV];
484         int listen_sock, maxfd;
485         int startup_p[2];
486         int startups = 0;
487
488         init_rng();
489
490         /* Save argv[0]. */
491         saved_argc = ac;
492         saved_argv = av;
493         if (strchr(av[0], '/'))
494                 av0 = strrchr(av[0], '/') + 1;
495         else
496                 av0 = av[0];
497
498         /* Initialize configuration options to their default values. */
499         initialize_server_options(&options);
500
501         /* Parse command-line arguments. */
502         while ((opt = getopt(ac, av, "f:p:b:k:h:g:V:u:diqQ46")) != EOF) {
503                 switch (opt) {
504                 case '4':
505                         IPv4or6 = AF_INET;
506                         break;
507                 case '6':
508                         IPv4or6 = AF_INET6;
509                         break;
510                 case 'f':
511                         config_file_name = optarg;
512                         break;
513                 case 'd':
514                         if (0 == debug_flag) {
515                                 debug_flag = 1;
516                                 options.log_level = SYSLOG_LEVEL_DEBUG1;
517                         } else if (options.log_level < SYSLOG_LEVEL_DEBUG3) {
518                                 options.log_level++;
519                         } else {
520                                 fprintf(stderr, "Too high debugging level.\n");
521                                 exit(1);
522                         }
523                         break;
524                 case 'i':
525                         inetd_flag = 1;
526                         break;
527                 case 'Q':
528                         silent = 1;
529                         break;
530                 case 'q':
531                         options.log_level = SYSLOG_LEVEL_QUIET;
532                         break;
533                 case 'b':
534                         options.server_key_bits = atoi(optarg);
535                         break;
536                 case 'p':
537                         options.ports_from_cmdline = 1;
538                         if (options.num_ports >= MAX_PORTS) {
539                                 fprintf(stderr, "too many ports.\n");
540                                 exit(1);
541                         }
542                         options.ports[options.num_ports++] = atoi(optarg);
543                         break;
544                 case 'g':
545                         options.login_grace_time = atoi(optarg);
546                         break;
547                 case 'k':
548                         options.key_regeneration_time = atoi(optarg);
549                         break;
550                 case 'h':
551                         options.host_key_file = optarg;
552                         break;
553                 case 'V':
554                         client_version_string = optarg;
555                         /* only makes sense with inetd_flag, i.e. no listen() */
556                         inetd_flag = 1;
557                         break;
558                 case 'u':
559                         utmp_len = atoi(optarg);
560                         break;
561                 case '?':
562                 default:
563                         fprintf(stderr, "sshd version %s\n", SSH_VERSION);
564                         fprintf(stderr, "Usage: %s [options]\n", av0);
565                         fprintf(stderr, "Options:\n");
566                         fprintf(stderr, "  -f file    Configuration file (default %s)\n", SERVER_CONFIG_FILE);
567                         fprintf(stderr, "  -d         Debugging mode (multiple -d means more debugging)\n");
568                         fprintf(stderr, "  -i         Started from inetd\n");
569                         fprintf(stderr, "  -q         Quiet (no logging)\n");
570                         fprintf(stderr, "  -p port    Listen on the specified port (default: 22)\n");
571                         fprintf(stderr, "  -k seconds Regenerate server key every this many seconds (default: 3600)\n");
572                         fprintf(stderr, "  -g seconds Grace period for authentication (default: 300)\n");
573                         fprintf(stderr, "  -b bits    Size of server RSA key (default: 768 bits)\n");
574                         fprintf(stderr, "  -h file    File from which to read host key (default: %s)\n",
575                             HOST_KEY_FILE);
576                         fprintf(stderr, "  -u len     Maximum hostname length for utmp recording\n");
577                         fprintf(stderr, "  -4         Use IPv4 only\n");
578                         fprintf(stderr, "  -6         Use IPv6 only\n");
579                         exit(1);
580                 }
581         }
582
583         /*
584          * Force logging to stderr until we have loaded the private host
585          * key (unless started from inetd)
586          */
587         log_init(av0,
588             options.log_level == -1 ? SYSLOG_LEVEL_INFO : options.log_level,
589             options.log_facility == -1 ? SYSLOG_FACILITY_AUTH : options.log_facility,
590             !silent && !inetd_flag);
591
592         /* Read server configuration options from the configuration file. */
593         read_server_config(&options, config_file_name);
594
595         /* Fill in default values for those options not explicitly set. */
596         fill_default_server_options(&options);
597
598         /* Check that there are no remaining arguments. */
599         if (optind < ac) {
600                 fprintf(stderr, "Extra argument %s.\n", av[optind]);
601                 exit(1);
602         }
603
604         debug("sshd version %.100s", SSH_VERSION);
605
606         sensitive_data.dsa_host_key = NULL;
607         sensitive_data.host_key = NULL;
608
609         /* check if RSA support exists */
610         if ((options.protocol & SSH_PROTO_1) &&
611             rsa_alive() == 0) {
612                 log("no RSA support in libssl and libcrypto.  See ssl(8)");
613                 log("Disabling protocol version 1");
614                 options.protocol &= ~SSH_PROTO_1;
615         }
616         /* Load the RSA/DSA host key.  It must have empty passphrase. */
617         if (options.protocol & SSH_PROTO_1) {
618                 Key k;
619                 sensitive_data.host_key = RSA_new();
620                 k.type = KEY_RSA;
621                 k.rsa = sensitive_data.host_key;
622                 errno = 0;
623                 if (!load_private_key(options.host_key_file, "", &k, NULL)) {
624                         error("Could not load host key: %.200s: %.100s",
625                             options.host_key_file, strerror(errno));
626                         log("Disabling protocol version 1");
627                         options.protocol &= ~SSH_PROTO_1;
628                 }
629                 k.rsa = NULL;
630         }
631         if (options.protocol & SSH_PROTO_2) {
632                 sensitive_data.dsa_host_key = key_new(KEY_DSA);
633                 if (!load_private_key(options.host_dsa_key_file, "", sensitive_data.dsa_host_key, NULL)) {
634
635                         error("Could not load DSA host key: %.200s", options.host_dsa_key_file);
636                         log("Disabling protocol version 2");
637                         options.protocol &= ~SSH_PROTO_2;
638                 }
639         }
640         if (! options.protocol & (SSH_PROTO_1|SSH_PROTO_2)) {
641                 if (silent == 0)
642                         fprintf(stderr, "sshd: no hostkeys available -- exiting.\n");
643                 log("sshd: no hostkeys available -- exiting.\n");
644                 exit(1);
645         }
646
647         /* Check certain values for sanity. */
648         if (options.protocol & SSH_PROTO_1) {
649                 if (options.server_key_bits < 512 ||
650                     options.server_key_bits > 32768) {
651                         fprintf(stderr, "Bad server key size.\n");
652                         exit(1);
653                 }
654                 /*
655                  * Check that server and host key lengths differ sufficiently. This
656                  * is necessary to make double encryption work with rsaref. Oh, I
657                  * hate software patents. I dont know if this can go? Niels
658                  */
659                 if (options.server_key_bits >
660                     BN_num_bits(sensitive_data.host_key->n) - SSH_KEY_BITS_RESERVED &&
661                     options.server_key_bits <
662                     BN_num_bits(sensitive_data.host_key->n) + SSH_KEY_BITS_RESERVED) {
663                         options.server_key_bits =
664                             BN_num_bits(sensitive_data.host_key->n) + SSH_KEY_BITS_RESERVED;
665                         debug("Forcing server key to %d bits to make it differ from host key.",
666                             options.server_key_bits);
667                 }
668         }
669
670 #ifdef HAVE_SCO_PROTECTED_PW
671         (void) set_auth_parameters(ac, av);
672 #endif
673
674         /* Initialize the log (it is reinitialized below in case we forked). */
675         if (debug_flag && !inetd_flag)
676                 log_stderr = 1;
677         log_init(av0, options.log_level, options.log_facility, log_stderr);
678
679         /*
680          * If not in debugging mode, and not started from inetd, disconnect
681          * from the controlling terminal, and fork.  The original process
682          * exits.
683          */
684         if (!debug_flag && !inetd_flag) {
685 #ifdef TIOCNOTTY
686                 int fd;
687 #endif /* TIOCNOTTY */
688                 if (daemon(0, 0) < 0)
689                         fatal("daemon() failed: %.200s", strerror(errno));
690
691                 /* Disconnect from the controlling tty. */
692 #ifdef TIOCNOTTY
693                 fd = open("/dev/tty", O_RDWR | O_NOCTTY);
694                 if (fd >= 0) {
695                         (void) ioctl(fd, TIOCNOTTY, NULL);
696                         close(fd);
697                 }
698 #endif /* TIOCNOTTY */
699         }
700         /* Reinitialize the log (because of the fork above). */
701         log_init(av0, options.log_level, options.log_facility, log_stderr);
702
703         /* Do not display messages to stdout in RSA code. */
704         rsa_set_verbose(0);
705
706         /* Initialize the random number generator. */
707         arc4random_stir();
708
709         /* Chdir to the root directory so that the current disk can be
710            unmounted if desired. */
711         chdir("/");
712
713         /* Start listening for a socket, unless started from inetd. */
714         if (inetd_flag) {
715                 int s1, s2;
716                 s1 = dup(0);    /* Make sure descriptors 0, 1, and 2 are in use. */
717                 s2 = dup(s1);
718                 sock_in = dup(0);
719                 sock_out = dup(1);
720                 startup_pipe = -1;
721                 /*
722                  * We intentionally do not close the descriptors 0, 1, and 2
723                  * as our code for setting the descriptors won\'t work if
724                  * ttyfd happens to be one of those.
725                  */
726                 debug("inetd sockets after dupping: %d, %d", sock_in, sock_out);
727
728                 if (options.protocol & SSH_PROTO_1) {
729                         public_key = RSA_new();
730                         sensitive_data.private_key = RSA_new();
731                         log("Generating %d bit RSA key.", options.server_key_bits);
732                         rsa_generate_key(sensitive_data.private_key, public_key,
733                             options.server_key_bits);
734                         arc4random_stir();
735                         log("RSA key generation complete.");
736                 }
737         } else {
738                 for (ai = options.listen_addrs; ai; ai = ai->ai_next) {
739                         if (ai->ai_family != AF_INET && ai->ai_family != AF_INET6)
740                                 continue;
741                         if (num_listen_socks >= MAX_LISTEN_SOCKS)
742                                 fatal("Too many listen sockets. "
743                                     "Enlarge MAX_LISTEN_SOCKS");
744                         if (getnameinfo(ai->ai_addr, ai->ai_addrlen,
745                             ntop, sizeof(ntop), strport, sizeof(strport),
746                             NI_NUMERICHOST|NI_NUMERICSERV) != 0) {
747                                 error("getnameinfo failed");
748                                 continue;
749                         }
750                         /* Create socket for listening. */
751                         listen_sock = socket(ai->ai_family, SOCK_STREAM, 0);
752                         if (listen_sock < 0) {
753                                 /* kernel may not support ipv6 */
754                                 verbose("socket: %.100s", strerror(errno));
755                                 continue;
756                         }
757                         if (fcntl(listen_sock, F_SETFL, O_NONBLOCK) < 0) {
758                                 error("listen_sock O_NONBLOCK: %s", strerror(errno));
759                                 close(listen_sock);
760                                 continue;
761                         }
762                         /*
763                          * Set socket options.  We try to make the port
764                          * reusable and have it close as fast as possible
765                          * without waiting in unnecessary wait states on
766                          * close.
767                          */
768                         setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR,
769                             (void *) &on, sizeof(on));
770                         linger.l_onoff = 1;
771                         linger.l_linger = 5;
772                         setsockopt(listen_sock, SOL_SOCKET, SO_LINGER,
773                             (void *) &linger, sizeof(linger));
774
775                         debug("Bind to port %s on %s.", strport, ntop);
776
777                         /* Bind the socket to the desired port. */
778                         if ((bind(listen_sock, ai->ai_addr, ai->ai_addrlen) < 0) &&
779                                  (!ai->ai_next)) {
780                                 error("Bind to port %s on %s failed: %.200s.",
781                                     strport, ntop, strerror(errno));
782                                 close(listen_sock);
783                                 continue;
784                         }
785                         listen_socks[num_listen_socks] = listen_sock;
786                         num_listen_socks++;
787
788                         /* Start listening on the port. */
789                         log("Server listening on %s port %s.", ntop, strport);
790                         if (listen(listen_sock, 5) < 0)
791                                 fatal("listen: %.100s", strerror(errno));
792
793                 }
794                 freeaddrinfo(options.listen_addrs);
795
796                 if (!num_listen_socks)
797                         fatal("Cannot bind any address.");
798
799                 if (!debug_flag) {
800                         /*
801                          * Record our pid in /etc/sshd_pid to make it easier
802                          * to kill the correct sshd.  We don\'t want to do
803                          * this before the bind above because the bind will
804                          * fail if there already is a daemon, and this will
805                          * overwrite any old pid in the file.
806                          */
807                         f = fopen(options.pid_file, "wb");
808                         if (f) {
809                                 fprintf(f, "%u\n", (unsigned int) getpid());
810                                 fclose(f);
811                         }
812                 }
813                 if (options.protocol & SSH_PROTO_1) {
814                         public_key = RSA_new();
815                         sensitive_data.private_key = RSA_new();
816
817                         log("Generating %d bit RSA key.", options.server_key_bits);
818                         rsa_generate_key(sensitive_data.private_key, public_key,
819                             options.server_key_bits);
820                         arc4random_stir();
821                         log("RSA key generation complete.");
822
823                         /* Schedule server key regeneration alarm. */
824                         signal(SIGALRM, key_regeneration_alarm);
825                         alarm(options.key_regeneration_time);
826                 }
827
828                 /* Arrange to restart on SIGHUP.  The handler needs listen_sock. */
829                 signal(SIGHUP, sighup_handler);
830
831                 signal(SIGTERM, sigterm_handler);
832                 signal(SIGQUIT, sigterm_handler);
833
834                 /* Arrange SIGCHLD to be caught. */
835                 signal(SIGCHLD, main_sigchld_handler);
836
837                 /* setup fd set for listen */
838                 fdset = NULL;
839                 maxfd = 0;
840                 for (i = 0; i < num_listen_socks; i++)
841                         if (listen_socks[i] > maxfd)
842                                 maxfd = listen_socks[i];
843                 /* pipes connected to unauthenticated childs */
844                 startup_pipes = xmalloc(options.max_startups * sizeof(int));
845                 for (i = 0; i < options.max_startups; i++)
846                         startup_pipes[i] = -1;
847
848                 /*
849                  * Stay listening for connections until the system crashes or
850                  * the daemon is killed with a signal.
851                  */
852                 for (;;) {
853                         if (received_sighup)
854                                 sighup_restart();
855                         if (fdset != NULL)
856                                 xfree(fdset);
857                         fdsetsz = howmany(maxfd, NFDBITS) * sizeof(fd_mask);
858                         fdset = (fd_set *)xmalloc(fdsetsz);
859                         memset(fdset, 0, fdsetsz);
860
861                         for (i = 0; i < num_listen_socks; i++)
862                                 FD_SET(listen_socks[i], fdset);
863                         for (i = 0; i < options.max_startups; i++)
864                                 if (startup_pipes[i] != -1)
865                                         FD_SET(startup_pipes[i], fdset);
866
867                         /* Wait in select until there is a connection. */
868                         if (select(maxfd + 1, fdset, NULL, NULL, NULL) < 0) {
869                                 if (errno != EINTR)
870                                         error("select: %.100s", strerror(errno));
871                                 continue;
872                         }
873                         for (i = 0; i < options.max_startups; i++)
874                                 if (startup_pipes[i] != -1 &&
875                                     FD_ISSET(startup_pipes[i], fdset)) {
876                                         /*
877                                          * the read end of the pipe is ready
878                                          * if the child has closed the pipe
879                                          * after successfull authentication
880                                          * or if the child has died
881                                          */
882                                         close(startup_pipes[i]);
883                                         startup_pipes[i] = -1;
884                                         startups--;
885                                 }
886                         for (i = 0; i < num_listen_socks; i++) {
887                                 if (!FD_ISSET(listen_socks[i], fdset))
888                                         continue;
889                                 fromlen = sizeof(from);
890                                 newsock = accept(listen_socks[i], (struct sockaddr *)&from,
891                                     &fromlen);
892                                 if (newsock < 0) {
893                                         if (errno != EINTR && errno != EWOULDBLOCK)
894                                                 error("accept: %.100s", strerror(errno));
895                                         continue;
896                                 }
897                                 if (fcntl(newsock, F_SETFL, 0) < 0) {
898                                         error("newsock del O_NONBLOCK: %s", strerror(errno));
899                                         continue;
900                                 }
901                                 if (drop_connection(startups) == 1) {
902                                         debug("drop connection #%d", startups);
903                                         close(newsock);
904                                         continue;
905                                 }
906                                 if (pipe(startup_p) == -1) {
907                                         close(newsock);
908                                         continue;
909                                 }
910
911                                 for (j = 0; j < options.max_startups; j++)
912                                         if (startup_pipes[j] == -1) {
913                                                 startup_pipes[j] = startup_p[0];
914                                                 if (maxfd < startup_p[0])
915                                                         maxfd = startup_p[0];
916                                                 startups++;
917                                                 break;
918                                         }
919                                 
920                                 /*
921                                  * Got connection.  Fork a child to handle it, unless
922                                  * we are in debugging mode.
923                                  */
924                                 if (debug_flag) {
925                                         /*
926                                          * In debugging mode.  Close the listening
927                                          * socket, and start processing the
928                                          * connection without forking.
929                                          */
930                                         debug("Server will not fork when running in debugging mode.");
931                                         close_listen_socks();
932                                         sock_in = newsock;
933                                         sock_out = newsock;
934                                         startup_pipe = -1;
935                                         pid = getpid();
936                                         break;
937                                 } else {
938                                         /*
939                                          * Normal production daemon.  Fork, and have
940                                          * the child process the connection. The
941                                          * parent continues listening.
942                                          */
943                                         if ((pid = fork()) == 0) {
944                                                 /*
945                                                  * Child.  Close the listening and max_startup
946                                                  * sockets.  Start using the accepted socket.
947                                                  * Reinitialize logging (since our pid has
948                                                  * changed).  We break out of the loop to handle
949                                                  * the connection.
950                                                  */
951                                                 startup_pipe = startup_p[1];
952                                                 for (j = 0; j < options.max_startups; j++)
953                                                         if (startup_pipes[j] != -1)
954                                                                 close(startup_pipes[j]);
955                                                 close_listen_socks();
956                                                 sock_in = newsock;
957                                                 sock_out = newsock;
958                                                 log_init(av0, options.log_level, options.log_facility, log_stderr);
959                                                 break;
960                                         }
961                                 }
962
963                                 /* Parent.  Stay in the loop. */
964                                 if (pid < 0)
965                                         error("fork: %.100s", strerror(errno));
966                                 else
967                                         debug("Forked child %d.", pid);
968
969                                 close(startup_p[1]);
970
971                                 /* Mark that the key has been used (it was "given" to the child). */
972                                 key_used = 1;
973
974                                 arc4random_stir();
975
976                                 /* Close the new socket (the child is now taking care of it). */
977                                 close(newsock);
978                         }
979                         /* child process check (or debug mode) */
980                         if (num_listen_socks < 0)
981                                 break;
982                 }
983         }
984
985         /* This is the child processing a new connection. */
986
987         /*
988          * Disable the key regeneration alarm.  We will not regenerate the
989          * key since we are no longer in a position to give it to anyone. We
990          * will not restart on SIGHUP since it no longer makes sense.
991          */
992         alarm(0);
993         signal(SIGALRM, SIG_DFL);
994         signal(SIGHUP, SIG_DFL);
995         signal(SIGTERM, SIG_DFL);
996         signal(SIGQUIT, SIG_DFL);
997         signal(SIGCHLD, SIG_DFL);
998         signal(SIGINT, SIG_DFL);
999
1000         /*
1001          * Set socket options for the connection.  We want the socket to
1002          * close as fast as possible without waiting for anything.  If the
1003          * connection is not a socket, these will do nothing.
1004          */
1005         /* setsockopt(sock_in, SOL_SOCKET, SO_REUSEADDR, (void *)&on, sizeof(on)); */
1006         linger.l_onoff = 1;
1007         linger.l_linger = 5;
1008         setsockopt(sock_in, SOL_SOCKET, SO_LINGER, (void *) &linger, sizeof(linger));
1009
1010         /*
1011          * Register our connection.  This turns encryption off because we do
1012          * not have a key.
1013          */
1014         packet_set_connection(sock_in, sock_out);
1015
1016         remote_port = get_remote_port();
1017         remote_ip = get_remote_ipaddr();
1018
1019         /* Check whether logins are denied from this host. */
1020 #ifdef LIBWRAP
1021         /* XXX LIBWRAP noes not know about IPv6 */
1022         {
1023                 struct request_info req;
1024
1025                 request_init(&req, RQ_DAEMON, av0, RQ_FILE, sock_in, NULL);
1026                 fromhost(&req);
1027
1028                 if (!hosts_access(&req)) {
1029                         close(sock_in);
1030                         close(sock_out);
1031                         refuse(&req);
1032                 }
1033 /*XXX IPv6 verbose("Connection from %.500s port %d", eval_client(&req), remote_port); */
1034         }
1035 #endif /* LIBWRAP */
1036         /* Log the connection. */
1037         verbose("Connection from %.500s port %d", remote_ip, remote_port);
1038
1039         /*
1040          * We don\'t want to listen forever unless the other side
1041          * successfully authenticates itself.  So we set up an alarm which is
1042          * cleared after successful authentication.  A limit of zero
1043          * indicates no limit. Note that we don\'t set the alarm in debugging
1044          * mode; it is just annoying to have the server exit just when you
1045          * are about to discover the bug.
1046          */
1047         signal(SIGALRM, grace_alarm_handler);
1048         if (!debug_flag)
1049                 alarm(options.login_grace_time);
1050
1051         sshd_exchange_identification(sock_in, sock_out);
1052         /*
1053          * Check that the connection comes from a privileged port.  Rhosts-
1054          * and Rhosts-RSA-Authentication only make sense from priviledged
1055          * programs.  Of course, if the intruder has root access on his local
1056          * machine, he can connect from any port.  So do not use these
1057          * authentication methods from machines that you do not trust.
1058          */
1059         if (remote_port >= IPPORT_RESERVED ||
1060             remote_port < IPPORT_RESERVED / 2) {
1061                 options.rhosts_authentication = 0;
1062                 options.rhosts_rsa_authentication = 0;
1063         }
1064 #ifdef KRB4
1065         if (!packet_connection_is_ipv4() &&
1066             options.kerberos_authentication) {
1067                 debug("Kerberos Authentication disabled, only available for IPv4.");
1068                 options.kerberos_authentication = 0;
1069         }
1070 #endif /* KRB4 */
1071
1072         packet_set_nonblocking();
1073
1074         /* perform the key exchange */
1075         /* authenticate user and start session */
1076         if (compat20) {
1077                 do_ssh2_kex();
1078                 do_authentication2();
1079         } else {
1080                 do_ssh1_kex();
1081                 do_authentication();
1082         }
1083
1084 #ifdef KRB4
1085         /* Cleanup user's ticket cache file. */
1086         if (options.kerberos_ticket_cleanup)
1087                 (void) dest_tkt();
1088 #endif /* KRB4 */
1089
1090         /* The connection has been terminated. */
1091         verbose("Closing connection to %.100s", remote_ip);
1092
1093 #ifdef USE_PAM
1094         finish_pam();
1095 #endif /* USE_PAM */
1096
1097         packet_close();
1098         exit(0);
1099 }
1100
1101 /*
1102  * SSH1 key exchange
1103  */
1104 void
1105 do_ssh1_kex()
1106 {
1107         int i, len;
1108         int plen, slen;
1109         BIGNUM *session_key_int;
1110         unsigned char session_key[SSH_SESSION_KEY_LENGTH];
1111         unsigned char cookie[8];
1112         unsigned int cipher_type, auth_mask, protocol_flags;
1113         u_int32_t rand = 0;
1114
1115         /*
1116          * Generate check bytes that the client must send back in the user
1117          * packet in order for it to be accepted; this is used to defy ip
1118          * spoofing attacks.  Note that this only works against somebody
1119          * doing IP spoofing from a remote machine; any machine on the local
1120          * network can still see outgoing packets and catch the random
1121          * cookie.  This only affects rhosts authentication, and this is one
1122          * of the reasons why it is inherently insecure.
1123          */
1124         for (i = 0; i < 8; i++) {
1125                 if (i % 4 == 0)
1126                         rand = arc4random();
1127                 cookie[i] = rand & 0xff;
1128                 rand >>= 8;
1129         }
1130
1131         /*
1132          * Send our public key.  We include in the packet 64 bits of random
1133          * data that must be matched in the reply in order to prevent IP
1134          * spoofing.
1135          */
1136         packet_start(SSH_SMSG_PUBLIC_KEY);
1137         for (i = 0; i < 8; i++)
1138                 packet_put_char(cookie[i]);
1139
1140         /* Store our public server RSA key. */
1141         packet_put_int(BN_num_bits(public_key->n));
1142         packet_put_bignum(public_key->e);
1143         packet_put_bignum(public_key->n);
1144
1145         /* Store our public host RSA key. */
1146         packet_put_int(BN_num_bits(sensitive_data.host_key->n));
1147         packet_put_bignum(sensitive_data.host_key->e);
1148         packet_put_bignum(sensitive_data.host_key->n);
1149
1150         /* Put protocol flags. */
1151         packet_put_int(SSH_PROTOFLAG_HOST_IN_FWD_OPEN);
1152
1153         /* Declare which ciphers we support. */
1154         packet_put_int(cipher_mask1());
1155
1156         /* Declare supported authentication types. */
1157         auth_mask = 0;
1158         if (options.rhosts_authentication)
1159                 auth_mask |= 1 << SSH_AUTH_RHOSTS;
1160         if (options.rhosts_rsa_authentication)
1161                 auth_mask |= 1 << SSH_AUTH_RHOSTS_RSA;
1162         if (options.rsa_authentication)
1163                 auth_mask |= 1 << SSH_AUTH_RSA;
1164 #ifdef KRB4
1165         if (options.kerberos_authentication)
1166                 auth_mask |= 1 << SSH_AUTH_KERBEROS;
1167 #endif
1168 #ifdef AFS
1169         if (options.kerberos_tgt_passing)
1170                 auth_mask |= 1 << SSH_PASS_KERBEROS_TGT;
1171         if (options.afs_token_passing)
1172                 auth_mask |= 1 << SSH_PASS_AFS_TOKEN;
1173 #endif
1174 #ifdef SKEY
1175         if (options.skey_authentication == 1)
1176                 auth_mask |= 1 << SSH_AUTH_TIS;
1177 #endif
1178         if (options.password_authentication)
1179                 auth_mask |= 1 << SSH_AUTH_PASSWORD;
1180         packet_put_int(auth_mask);
1181
1182         /* Send the packet and wait for it to be sent. */
1183         packet_send();
1184         packet_write_wait();
1185
1186         debug("Sent %d bit public key and %d bit host key.",
1187               BN_num_bits(public_key->n), BN_num_bits(sensitive_data.host_key->n));
1188
1189         /* Read clients reply (cipher type and session key). */
1190         packet_read_expect(&plen, SSH_CMSG_SESSION_KEY);
1191
1192         /* Get cipher type and check whether we accept this. */
1193         cipher_type = packet_get_char();
1194
1195         if (!(cipher_mask() & (1 << cipher_type)))
1196                 packet_disconnect("Warning: client selects unsupported cipher.");
1197
1198         /* Get check bytes from the packet.  These must match those we
1199            sent earlier with the public key packet. */
1200         for (i = 0; i < 8; i++)
1201                 if (cookie[i] != packet_get_char())
1202                         packet_disconnect("IP Spoofing check bytes do not match.");
1203
1204         debug("Encryption type: %.200s", cipher_name(cipher_type));
1205
1206         /* Get the encrypted integer. */
1207         session_key_int = BN_new();
1208         packet_get_bignum(session_key_int, &slen);
1209
1210         protocol_flags = packet_get_int();
1211         packet_set_protocol_flags(protocol_flags);
1212
1213         packet_integrity_check(plen, 1 + 8 + slen + 4, SSH_CMSG_SESSION_KEY);
1214
1215         /*
1216          * Decrypt it using our private server key and private host key (key
1217          * with larger modulus first).
1218          */
1219         if (BN_cmp(sensitive_data.private_key->n, sensitive_data.host_key->n) > 0) {
1220                 /* Private key has bigger modulus. */
1221                 if (BN_num_bits(sensitive_data.private_key->n) <
1222                     BN_num_bits(sensitive_data.host_key->n) + SSH_KEY_BITS_RESERVED) {
1223                         fatal("do_connection: %s: private_key %d < host_key %d + SSH_KEY_BITS_RESERVED %d",
1224                               get_remote_ipaddr(),
1225                               BN_num_bits(sensitive_data.private_key->n),
1226                               BN_num_bits(sensitive_data.host_key->n),
1227                               SSH_KEY_BITS_RESERVED);
1228                 }
1229                 rsa_private_decrypt(session_key_int, session_key_int,
1230                                     sensitive_data.private_key);
1231                 rsa_private_decrypt(session_key_int, session_key_int,
1232                                     sensitive_data.host_key);
1233         } else {
1234                 /* Host key has bigger modulus (or they are equal). */
1235                 if (BN_num_bits(sensitive_data.host_key->n) <
1236                     BN_num_bits(sensitive_data.private_key->n) + SSH_KEY_BITS_RESERVED) {
1237                         fatal("do_connection: %s: host_key %d < private_key %d + SSH_KEY_BITS_RESERVED %d",
1238                               get_remote_ipaddr(),
1239                               BN_num_bits(sensitive_data.host_key->n),
1240                               BN_num_bits(sensitive_data.private_key->n),
1241                               SSH_KEY_BITS_RESERVED);
1242                 }
1243                 rsa_private_decrypt(session_key_int, session_key_int,
1244                                     sensitive_data.host_key);
1245                 rsa_private_decrypt(session_key_int, session_key_int,
1246                                     sensitive_data.private_key);
1247         }
1248
1249         compute_session_id(session_id, cookie,
1250                            sensitive_data.host_key->n,
1251                            sensitive_data.private_key->n);
1252
1253         /* Destroy the private and public keys.  They will no longer be needed. */
1254         destroy_sensitive_data();
1255
1256         /*
1257          * Extract session key from the decrypted integer.  The key is in the
1258          * least significant 256 bits of the integer; the first byte of the
1259          * key is in the highest bits.
1260          */
1261         BN_mask_bits(session_key_int, sizeof(session_key) * 8);
1262         len = BN_num_bytes(session_key_int);
1263         if (len < 0 || len > sizeof(session_key))
1264                 fatal("do_connection: bad len from %s: session_key_int %d > sizeof(session_key) %d",
1265                       get_remote_ipaddr(),
1266                       len, (int) sizeof(session_key));
1267         memset(session_key, 0, sizeof(session_key));
1268         BN_bn2bin(session_key_int, session_key + sizeof(session_key) - len);
1269
1270         /* Destroy the decrypted integer.  It is no longer needed. */
1271         BN_clear_free(session_key_int);
1272
1273         /* Xor the first 16 bytes of the session key with the session id. */
1274         for (i = 0; i < 16; i++)
1275                 session_key[i] ^= session_id[i];
1276
1277         /* Set the session key.  From this on all communications will be encrypted. */
1278         packet_set_encryption_key(session_key, SSH_SESSION_KEY_LENGTH, cipher_type);
1279
1280         /* Destroy our copy of the session key.  It is no longer needed. */
1281         memset(session_key, 0, sizeof(session_key));
1282
1283         debug("Received session key; encryption turned on.");
1284
1285         /* Send an acknowledgement packet.  Note that this packet is sent encrypted. */
1286         packet_start(SSH_SMSG_SUCCESS);
1287         packet_send();
1288         packet_write_wait();
1289 }
1290
1291 /*
1292  * SSH2 key exchange: diffie-hellman-group1-sha1
1293  */
1294 void
1295 do_ssh2_kex()
1296 {
1297         Buffer *server_kexinit;
1298         Buffer *client_kexinit;
1299         int payload_len, dlen;
1300         int slen;
1301         unsigned int klen, kout;
1302         unsigned char *signature = NULL;
1303         unsigned char *server_host_key_blob = NULL;
1304         unsigned int sbloblen;
1305         DH *dh;
1306         BIGNUM *dh_client_pub = 0;
1307         BIGNUM *shared_secret = 0;
1308         int i;
1309         unsigned char *kbuf;
1310         unsigned char *hash;
1311         Kex *kex;
1312         char *cprop[PROPOSAL_MAX];
1313
1314 /* KEXINIT */
1315
1316         if (options.ciphers != NULL) {
1317                 myproposal[PROPOSAL_ENC_ALGS_CTOS] =
1318                 myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers;
1319         }
1320         server_kexinit = kex_init(myproposal);
1321         client_kexinit = xmalloc(sizeof(*client_kexinit));
1322         buffer_init(client_kexinit);
1323
1324         /* algorithm negotiation */
1325         kex_exchange_kexinit(server_kexinit, client_kexinit, cprop);
1326         kex = kex_choose_conf(cprop, myproposal, 1);
1327         for (i = 0; i < PROPOSAL_MAX; i++)
1328                 xfree(cprop[i]);
1329
1330 /* KEXDH */
1331
1332         debug("Wait SSH2_MSG_KEXDH_INIT.");
1333         packet_read_expect(&payload_len, SSH2_MSG_KEXDH_INIT);
1334
1335         /* key, cert */
1336         dh_client_pub = BN_new();
1337         if (dh_client_pub == NULL)
1338                 fatal("dh_client_pub == NULL");
1339         packet_get_bignum2(dh_client_pub, &dlen);
1340
1341 #ifdef DEBUG_KEXDH
1342         fprintf(stderr, "\ndh_client_pub= ");
1343         BN_print_fp(stderr, dh_client_pub);
1344         fprintf(stderr, "\n");
1345         debug("bits %d", BN_num_bits(dh_client_pub));
1346 #endif
1347
1348         /* generate DH key */
1349         dh = dh_new_group1();                   /* XXX depends on 'kex' */
1350
1351 #ifdef DEBUG_KEXDH
1352         fprintf(stderr, "\np= ");
1353         BN_print_fp(stderr, dh->p);
1354         fprintf(stderr, "\ng= ");
1355         bn_print(dh->g);
1356         fprintf(stderr, "\npub= ");
1357         BN_print_fp(stderr, dh->pub_key);
1358         fprintf(stderr, "\n");
1359         DHparams_print_fp(stderr, dh);
1360 #endif
1361         if (!dh_pub_is_valid(dh, dh_client_pub))
1362                 packet_disconnect("bad client public DH value");
1363
1364         klen = DH_size(dh);
1365         kbuf = xmalloc(klen);
1366         kout = DH_compute_key(kbuf, dh_client_pub, dh);
1367
1368 #ifdef DEBUG_KEXDH
1369         debug("shared secret: len %d/%d", klen, kout);
1370         fprintf(stderr, "shared secret == ");
1371         for (i = 0; i< kout; i++)
1372                 fprintf(stderr, "%02x", (kbuf[i])&0xff);
1373         fprintf(stderr, "\n");
1374 #endif
1375         shared_secret = BN_new();
1376
1377         BN_bin2bn(kbuf, kout, shared_secret);
1378         memset(kbuf, 0, klen);
1379         xfree(kbuf);
1380
1381         /* XXX precompute? */
1382         dsa_make_key_blob(sensitive_data.dsa_host_key, &server_host_key_blob, &sbloblen);
1383
1384         /* calc H */                    /* XXX depends on 'kex' */
1385         hash = kex_hash(
1386             client_version_string,
1387             server_version_string,
1388             buffer_ptr(client_kexinit), buffer_len(client_kexinit),
1389             buffer_ptr(server_kexinit), buffer_len(server_kexinit),
1390             (char *)server_host_key_blob, sbloblen,
1391             dh_client_pub,
1392             dh->pub_key,
1393             shared_secret
1394         );
1395         buffer_free(client_kexinit);
1396         buffer_free(server_kexinit);
1397         xfree(client_kexinit);
1398         xfree(server_kexinit);
1399 #ifdef DEBUG_KEXDH
1400         fprintf(stderr, "hash == ");
1401         for (i = 0; i< 20; i++)
1402                 fprintf(stderr, "%02x", (hash[i])&0xff);
1403         fprintf(stderr, "\n");
1404 #endif
1405         /* save session id := H */
1406         /* XXX hashlen depends on KEX */
1407         session_id2_len = 20;
1408         session_id2 = xmalloc(session_id2_len);
1409         memcpy(session_id2, hash, session_id2_len);
1410
1411         /* sign H */
1412         /* XXX hashlen depends on KEX */
1413         dsa_sign(sensitive_data.dsa_host_key, &signature, &slen, hash, 20);
1414
1415         destroy_sensitive_data();
1416
1417         /* send server hostkey, DH pubkey 'f' and singed H */
1418         packet_start(SSH2_MSG_KEXDH_REPLY);
1419         packet_put_string((char *)server_host_key_blob, sbloblen);
1420         packet_put_bignum2(dh->pub_key);        /* f */
1421         packet_put_string((char *)signature, slen);
1422         packet_send();
1423         xfree(signature);
1424         xfree(server_host_key_blob);
1425         packet_write_wait();
1426
1427         kex_derive_keys(kex, hash, shared_secret);
1428         packet_set_kex(kex);
1429
1430         /* have keys, free DH */
1431         DH_free(dh);
1432
1433         debug("send SSH2_MSG_NEWKEYS.");
1434         packet_start(SSH2_MSG_NEWKEYS);
1435         packet_send();
1436         packet_write_wait();
1437         debug("done: send SSH2_MSG_NEWKEYS.");
1438
1439         debug("Wait SSH2_MSG_NEWKEYS.");
1440         packet_read_expect(&payload_len, SSH2_MSG_NEWKEYS);
1441         debug("GOT SSH2_MSG_NEWKEYS.");
1442
1443 #ifdef DEBUG_KEXDH
1444         /* send 1st encrypted/maced/compressed message */
1445         packet_start(SSH2_MSG_IGNORE);
1446         packet_put_cstring("markus");
1447         packet_send();
1448         packet_write_wait();
1449 #endif
1450         debug("done: KEX2.");
1451 }
This page took 0.157969 seconds and 5 git commands to generate.