freebsd-nq/crypto/openssh/auth-rh-rsa.c

104 lines
3.0 KiB
C
Raw Normal View History

2010-03-08 11:19:52 +00:00
/* $OpenBSD: auth-rh-rsa.c,v 1.43 2010/03/04 10:36:03 djm Exp $ */
2000-02-24 14:29:47 +00:00
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
* All rights reserved
* Rhosts or /etc/hosts.equiv authentication combined with RSA host
* authentication.
*
* As far as I am concerned, the code I have written for this software
* can be used freely for any purpose. Any derived versions of this
* software must be clearly marked as such, and if the derived work is
* incompatible with the protocol description in the RFC file, it must be
* called by a name other than "ssh" or "Secure Shell".
2000-02-24 14:29:47 +00:00
*/
#include "includes.h"
2006-09-30 13:29:51 +00:00
#include <sys/types.h>
#include <pwd.h>
#include <stdarg.h>
2000-02-24 14:29:47 +00:00
#include "packet.h"
#include "uidswap.h"
#include "log.h"
2006-09-30 13:29:51 +00:00
#include "buffer.h"
2000-02-24 14:29:47 +00:00
#include "servconf.h"
#include "key.h"
#include "hostfile.h"
#include "pathnames.h"
#include "auth.h"
#include "canohost.h"
2006-09-30 13:29:51 +00:00
#ifdef GSSAPI
#include "ssh-gss.h"
#endif
2002-06-23 14:01:54 +00:00
#include "monitor_wrap.h"
/* import */
extern ServerOptions options;
2000-02-24 14:29:47 +00:00
2000-05-15 04:37:24 +00:00
int
2002-06-23 14:01:54 +00:00
auth_rhosts_rsa_key_allowed(struct passwd *pw, char *cuser, char *chost,
Key *client_host_key)
2000-02-24 14:29:47 +00:00
{
HostStatus host_status;
2010-03-08 11:19:52 +00:00
if (auth_key_is_revoked(client_host_key))
return 0;
2000-02-24 14:29:47 +00:00
/* Check if we would accept it using rhosts authentication. */
2002-06-23 14:01:54 +00:00
if (!auth_rhosts(pw, cuser))
2000-02-24 14:29:47 +00:00
return 0;
2002-03-18 09:55:03 +00:00
host_status = check_key_in_hostfiles(pw, client_host_key,
2002-06-23 14:01:54 +00:00
chost, _PATH_SSH_SYSTEM_HOSTFILE,
2002-03-18 09:55:03 +00:00
options.ignore_user_known_hosts ? NULL : _PATH_SSH_USER_HOSTFILE);
2000-02-24 14:29:47 +00:00
2002-06-23 14:01:54 +00:00
return (host_status == HOST_OK);
}
/*
* Tries to authenticate the user using the .rhosts file and the host using
* its host key. Returns true if authentication succeeds.
*/
int
2004-02-26 10:38:49 +00:00
auth_rhosts_rsa(Authctxt *authctxt, char *cuser, Key *client_host_key)
2002-06-23 14:01:54 +00:00
{
char *chost;
2004-02-26 10:38:49 +00:00
struct passwd *pw = authctxt->pw;
2002-06-23 14:01:54 +00:00
debug("Trying rhosts with RSA host authentication for client user %.100s",
cuser);
2004-02-26 10:38:49 +00:00
if (!authctxt->valid || client_host_key == NULL ||
2002-06-23 14:01:54 +00:00
client_host_key->rsa == NULL)
return 0;
2004-01-07 11:10:17 +00:00
chost = (char *)get_canonical_hostname(options.use_dns);
2002-06-23 14:01:54 +00:00
debug("Rhosts RSA authentication: canonical host %.900s", chost);
if (!PRIVSEP(auth_rhosts_rsa_key_allowed(pw, cuser, chost, client_host_key))) {
2000-02-24 14:29:47 +00:00
debug("Rhosts with RSA host authentication denied: unknown or invalid host key");
packet_send_debug("Your host key cannot be verified: unknown or invalid host key.");
return 0;
}
/* A matching host key was found and is known. */
/* Perform the challenge-response dialog with the client for the host key. */
2002-06-23 14:01:54 +00:00
if (!auth_rsa_challenge_dialog(client_host_key)) {
2004-01-07 11:10:17 +00:00
logit("Client on %.800s failed to respond correctly to host authentication.",
2002-06-23 14:01:54 +00:00
chost);
2000-02-24 14:29:47 +00:00
return 0;
}
/*
* We have authenticated the user using .rhosts or /etc/hosts.equiv,
* and the host using RSA. We accept the authentication.
*/
verbose("Rhosts with RSA host authentication accepted for %.100s, %.100s on %.700s.",
2005-09-03 06:59:33 +00:00
pw->pw_name, cuser, chost);
2000-02-24 14:29:47 +00:00
packet_send_debug("Rhosts with RSA host authentication accepted.");
return 1;
}