version 1.55, 2005/06/17 02:44:33 |
version 1.55.2.3, 2006/11/08 00:44:05 |
|
|
|
/* $OpenBSD$ */ |
/* |
/* |
* Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>. |
* Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>. |
* |
* |
|
|
* OpenBSD project by leaving this copyright notice intact. |
* OpenBSD project by leaving this copyright notice intact. |
*/ |
*/ |
|
|
#include "includes.h" |
#include <sys/types.h> |
RCSID("$OpenBSD$"); |
#include <sys/socket.h> |
|
|
#include <sys/queue.h> |
#include <sys/queue.h> |
#include <errno.h> |
#include <sys/time.h> |
|
#include <sys/resource.h> |
|
|
#include <openssl/bn.h> |
#include <openssl/bn.h> |
|
|
|
#include <errno.h> |
|
#include <netdb.h> |
#include <setjmp.h> |
#include <setjmp.h> |
|
#include <stdarg.h> |
|
#include <stdio.h> |
|
#include <stdlib.h> |
|
#include <signal.h> |
|
#include <string.h> |
|
#include <unistd.h> |
|
|
#include "xmalloc.h" |
#include "xmalloc.h" |
#include "ssh.h" |
#include "ssh.h" |
#include "ssh1.h" |
#include "ssh1.h" |
|
#include "buffer.h" |
#include "key.h" |
#include "key.h" |
|
#include "cipher.h" |
#include "kex.h" |
#include "kex.h" |
#include "compat.h" |
#include "compat.h" |
#include "myproposal.h" |
#include "myproposal.h" |
#include "packet.h" |
#include "packet.h" |
#include "dispatch.h" |
#include "dispatch.h" |
#include "buffer.h" |
|
#include "bufaux.h" |
|
#include "log.h" |
#include "log.h" |
#include "atomicio.h" |
#include "atomicio.h" |
#include "misc.h" |
#include "misc.h" |
|
|
|
|
extern char *__progname; |
extern char *__progname; |
fd_set *read_wait; |
fd_set *read_wait; |
size_t read_wait_size; |
size_t read_wait_nfdset; |
int ncon; |
int ncon; |
int nonfatal_fatal = 0; |
int nonfatal_fatal = 0; |
jmp_buf kexjmp; |
jmp_buf kexjmp; |
|
|
lb->stream = stdin; |
lb->stream = stdin; |
} |
} |
|
|
if (!(lb->buf = malloc(lb->size = LINEBUF_SIZE))) { |
if (!(lb->buf = malloc((lb->size = LINEBUF_SIZE)))) { |
if (errfun) |
if (errfun) |
(*errfun) ("linebuf (%s): malloc failed\n", lb->filename); |
(*errfun) ("linebuf (%s): malloc failed\n", lb->filename); |
xfree(lb); |
xfree(lb); |
|
|
c->c_kex->kex[KEX_DH_GRP1_SHA1] = kexdh_client; |
c->c_kex->kex[KEX_DH_GRP1_SHA1] = kexdh_client; |
c->c_kex->kex[KEX_DH_GRP14_SHA1] = kexdh_client; |
c->c_kex->kex[KEX_DH_GRP14_SHA1] = kexdh_client; |
c->c_kex->kex[KEX_DH_GEX_SHA1] = kexgex_client; |
c->c_kex->kex[KEX_DH_GEX_SHA1] = kexgex_client; |
|
c->c_kex->kex[KEX_DH_GEX_SHA256] = kexgex_client; |
c->c_kex->verify_host_key = hostjump; |
c->c_kex->verify_host_key = hostjump; |
|
|
if (!(j = setjmp(kexjmp))) { |
if (!(j = setjmp(kexjmp))) { |
|
|
size_t bufsiz; |
size_t bufsiz; |
con *c = &fdcon[s]; |
con *c = &fdcon[s]; |
|
|
bufsiz = sizeof(buf); |
for (;;) { |
cp = buf; |
memset(buf, '\0', sizeof(buf)); |
while (bufsiz-- && (n = atomicio(read, s, cp, 1)) == 1 && *cp != '\n') { |
bufsiz = sizeof(buf); |
if (*cp == '\r') |
cp = buf; |
*cp = '\n'; |
while (bufsiz-- && |
cp++; |
(n = atomicio(read, s, cp, 1)) == 1 && *cp != '\n') { |
|
if (*cp == '\r') |
|
*cp = '\n'; |
|
cp++; |
|
} |
|
if (n != 1 || strncmp(buf, "SSH-", 4) == 0) |
|
break; |
} |
} |
if (n == 0) { |
if (n == 0) { |
switch (errno) { |
switch (errno) { |
|
|
keyprint(c, keygrab_ssh1(c)); |
keyprint(c, keygrab_ssh1(c)); |
confree(s); |
confree(s); |
return; |
return; |
break; |
|
default: |
default: |
fatal("conread: invalid status %d", c->c_status); |
fatal("conread: invalid status %d", c->c_status); |
break; |
break; |
|
|
} else |
} else |
seltime.tv_sec = seltime.tv_usec = 0; |
seltime.tv_sec = seltime.tv_usec = 0; |
|
|
r = xmalloc(read_wait_size); |
r = xcalloc(read_wait_nfdset, sizeof(fd_mask)); |
memcpy(r, read_wait, read_wait_size); |
e = xcalloc(read_wait_nfdset, sizeof(fd_mask)); |
e = xmalloc(read_wait_size); |
memcpy(r, read_wait, read_wait_nfdset * sizeof(fd_mask)); |
memcpy(e, read_wait, read_wait_size); |
memcpy(e, read_wait, read_wait_nfdset * sizeof(fd_mask)); |
|
|
while (select(maxfd, r, NULL, e, &seltime) == -1 && |
while (select(maxfd, r, NULL, e, &seltime) == -1 && |
(errno == EAGAIN || errno == EINTR)) |
(errno == EAGAIN || errno == EINTR)) |
|
|
|
|
TAILQ_INIT(&tq); |
TAILQ_INIT(&tq); |
|
|
|
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
|
sanitise_stdfd(); |
|
|
if (argc <= 1) |
if (argc <= 1) |
usage(); |
usage(); |
|
|
|
|
fatal("%s: not enough file descriptors", __progname); |
fatal("%s: not enough file descriptors", __progname); |
if (maxfd > fdlim_get(0)) |
if (maxfd > fdlim_get(0)) |
fdlim_set(maxfd); |
fdlim_set(maxfd); |
fdcon = xmalloc(maxfd * sizeof(con)); |
fdcon = xcalloc(maxfd, sizeof(con)); |
memset(fdcon, 0, maxfd * sizeof(con)); |
|
|
|
read_wait_size = howmany(maxfd, NFDBITS) * sizeof(fd_mask); |
read_wait_nfdset = howmany(maxfd, NFDBITS); |
read_wait = xmalloc(read_wait_size); |
read_wait = xcalloc(read_wait_nfdset, sizeof(fd_mask)); |
memset(read_wait, 0, read_wait_size); |
|
|
|
if (fopt_count) { |
if (fopt_count) { |
Linebuf *lb; |
Linebuf *lb; |