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  * Rhosts or /etc/hosts.equiv authentication combined with RSA host
   6  * authentication.
   7  *
   8  * As far as I am concerned, the code I have written for this software
   9  * can be used freely for any purpose.  Any derived versions of this
  10  * software must be clearly marked as such, and if the derived work is
  11  * incompatible with the protocol description in the RFC file, it must be
  12  * called by a name other than "ssh" or "Secure Shell".
  13  */
  14 
  15 #include "includes.h"
  16 RCSID("$OpenBSD: auth-rh-rsa.c,v 1.34 2002/03/25 09:25:06 markus Exp $");
  17 
  18 #pragma ident   "%Z%%M% %I%     %E% SMI"
  19 
  20 #include "packet.h"
  21 #include "uidswap.h"
  22 #include "log.h"
  23 #include "servconf.h"
  24 #include "key.h"
  25 #include "hostfile.h"
  26 #include "pathnames.h"
  27 #include "auth.h"
  28 #include "canohost.h"
  29 
  30 /* import */
  31 extern ServerOptions options;
  32 
  33 int
  34 auth_rhosts_rsa_key_allowed(struct passwd *pw, char *cuser, char *chost,
  35     Key *client_host_key)
  36 {
  37         HostStatus host_status;
  38 
  39         /* Check if we would accept it using rhosts authentication. */
  40         if (!auth_rhosts(pw, cuser))
  41                 return 0;
  42 
  43         host_status = check_key_in_hostfiles(pw, client_host_key,
  44             chost, _PATH_SSH_SYSTEM_HOSTFILE,
  45             options.ignore_user_known_hosts ? NULL : _PATH_SSH_USER_HOSTFILE);
  46 
  47         return (host_status == HOST_OK);
  48 }
  49 
  50 /*
  51  * Tries to authenticate the user using the .rhosts file and the host using
  52  * its host key.  Returns true if authentication succeeds.
  53  */
  54 int
  55 auth_rhosts_rsa(struct passwd *pw, char *cuser, Key *client_host_key)
  56 {
  57         char *chost;
  58 
  59         debug("Trying rhosts with RSA host authentication for client user %.100s",
  60             cuser);
  61 
  62         if (pw == NULL || client_host_key == NULL ||
  63             client_host_key->rsa == NULL)
  64                 return 0;
  65 
  66         chost = (char *)get_canonical_hostname(options.verify_reverse_mapping);
  67         debug("Rhosts RSA authentication: canonical host %.900s", chost);
  68 
  69         if (!auth_rhosts_rsa_key_allowed(pw, cuser, chost, client_host_key)) {
  70                 debug("Rhosts with RSA host authentication denied: unknown or invalid host key");
  71                 packet_send_debug("Your host key cannot be verified: unknown or invalid host key.");
  72                 return 0;
  73         }
  74         /* A matching host key was found and is known. */
  75 
  76         /* Perform the challenge-response dialog with the client for the host key. */
  77         if (!auth_rsa_challenge_dialog(client_host_key)) {
  78                 log("Client on %.800s failed to respond correctly to host authentication.",
  79                     chost);
  80                 return 0;
  81         }
  82         /*
  83          * We have authenticated the user using .rhosts or /etc/hosts.equiv,
  84          * and the host using RSA. We accept the authentication.
  85          */
  86 
  87         verbose("Rhosts with RSA host authentication accepted for %.100s, %.100s on %.700s.",
  88            pw->pw_name, cuser, chost);
  89         packet_send_debug("Rhosts with RSA host authentication accepted.");
  90         return 1;
  91 }