2 /* $OpenBSD: auth.h,v 1.62 2008/11/04 08:22:12 djm Exp $ */
5 * Copyright (c) 2000 Markus Friedl. All rights reserved.
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 #include <openssl/rsa.h>
37 #include <login_cap.h>
46 typedef struct Authctxt Authctxt
;
47 typedef struct Authmethod Authmethod
;
48 typedef struct KbdintDevice KbdintDevice
;
52 int authenticated
; /* authenticated and alarms cancelled */
53 int postponed
; /* authentication needs another step */
54 int valid
; /* user exists and is allowed to login */
58 char *user
; /* username sent by the client */
60 struct passwd
*pw
; /* set if 'valid' */
68 char *krb4_ticket_file
;
71 krb5_context krb5_ctx
;
72 krb5_auth_context krb5_auth_ctx
;
73 krb5_ccache krb5_fwd_ccache
;
74 krb5_principal krb5_user
;
75 char *krb5_ticket_file
;
80 * Every authentication method has to handle authentication requests for
81 * non-existing users, or for users that are not allowed to login. In this
82 * case 'valid' is set to 0, but 'user' points to the username requested by
92 int (*userauth
)(Authctxt
*authctxt
);
97 * Keyboard interactive device:
98 * init_ctx returns: non NULL upon success
99 * query returns: 0 - success, otherwise failure
100 * respond returns: 0 - success, 1 - need further interaction,
101 * otherwise - failure
106 void* (*init_ctx
)(Authctxt
*);
107 int (*query
)(void *ctx
, char **name
, char **infotxt
,
108 u_int
*numprompts
, char ***prompts
, u_int
**echo_on
);
109 int (*respond
)(void *ctx
, u_int numresp
, char **responses
);
110 void (*free_ctx
)(void *ctx
);
113 void disable_forwarding(void);
114 int auth_rhosts(struct passwd
*, const char *);
116 auth_rhosts2(struct passwd
*, const char *, const char *, const char *);
118 int auth_rhosts_rsa(Authctxt
*, char *, Key
*);
119 int auth_password(Authctxt
*, const char *);
120 int auth_rsa(Authctxt
*, BIGNUM
*);
121 int auth_rsa_challenge_dialog(Key
*);
122 BIGNUM
*auth_rsa_generate_challenge(Key
*);
123 int auth_rsa_verify_response(Key
*, BIGNUM
*, u_char
[]);
124 int auth_rsa_key_allowed(struct passwd
*, BIGNUM
*, Key
**);
126 int auth_rhosts_rsa_key_allowed(struct passwd
*, char *, char *, Key
*);
127 int hostbased_key_allowed(struct passwd
*, const char *, char *, Key
*);
128 int user_key_allowed(struct passwd
*, Key
*);
132 int auth_krb4(Authctxt
*, KTEXT
, char **, KTEXT
);
133 int auth_krb4_password(Authctxt
*, const char *);
134 void krb4_cleanup_proc(void *);
138 int auth_krb4_tgt(Authctxt
*, const char *);
139 int auth_afs_token(Authctxt
*, const char *);
145 int auth_krb5(Authctxt
*authctxt
, krb5_data
*auth
, char **client
, krb5_data
*);
146 int auth_krb5_tgt(Authctxt
*authctxt
, krb5_data
*tgt
);
147 int auth_krb5_password(Authctxt
*authctxt
, const char *password
);
148 void krb5_cleanup_proc(Authctxt
*authctxt
);
151 void do_authentication(Authctxt
*);
152 void do_authentication2(Authctxt
*);
154 void auth_log(Authctxt
*, int, char *, char *);
155 void userauth_finish(Authctxt
*, int, char *);
156 void userauth_send_banner(const char *);
157 int auth_root_allowed(char *);
159 char *auth2_read_banner(void);
161 void privsep_challenge_enable(void);
163 int auth2_challenge(Authctxt
*, char *);
164 void auth2_challenge_stop(Authctxt
*);
165 int bsdauth_query(void *, char **, char **, u_int
*, char ***, u_int
**);
166 int bsdauth_respond(void *, u_int
, char **);
167 int skey_query(void *, char **, char **, u_int
*, char ***, u_int
**);
168 int skey_respond(void *, u_int
, char **);
170 void auth2_jpake_get_pwdata(Authctxt
*, BIGNUM
**, char **, char **);
171 void auth2_jpake_stop(Authctxt
*);
173 int allowed_user(struct passwd
*);
174 struct passwd
* getpwnamallow(const char *user
);
176 char *get_challenge(Authctxt
*);
177 int verify_response(Authctxt
*, const char *);
179 char *authorized_keys_file(struct passwd
*);
180 char *authorized_keys_file2(struct passwd
*);
182 FILE *auth_openkeyfile(const char *, struct passwd
*, int);
185 check_key_in_hostfiles(struct passwd
*, Key
*, const char *,
186 const char *, const char *);
188 /* hostkey handling */
189 Key
*get_hostkey_by_index(int);
190 Key
*get_hostkey_by_type(int);
191 int get_hostkey_index(Key
*);
192 int ssh1_session_key(BIGNUM
*);
194 /* debug messages during authentication */
195 void auth_debug_add(const char *fmt
,...) __attribute__((format(printf
, 1, 2)));
196 void auth_debug_send(void);
197 void auth_debug_reset(void);
199 struct passwd
*fakepw(void);
201 #define AUTH_FAIL_MSG "Too many authentication failures for %.100s"
203 #define SKEY_PROMPT "\nS/Key Password: "
205 #if defined(KRB5) && !defined(HEIMDAL)
207 krb5_error_code
ssh_krb5_cc_gen(krb5_context
, krb5_ccache
*);