OpenCoverage

auth2.c

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/openssh/src/auth2.c
Source codeSwitch to Preprocessed file
LineSourceCount
1/* $OpenBSD: auth2.c,v 1.149 2018/07/11 18:53:29 markus Exp $ */-
2/*-
3 * Copyright (c) 2000 Markus Friedl. All rights reserved.-
4 *-
5 * Redistribution and use in source and binary forms, with or without-
6 * modification, are permitted provided that the following conditions-
7 * are met:-
8 * 1. Redistributions of source code must retain the above copyright-
9 * notice, this list of conditions and the following disclaimer.-
10 * 2. Redistributions in binary form must reproduce the above copyright-
11 * notice, this list of conditions and the following disclaimer in the-
12 * documentation and/or other materials provided with the distribution.-
13 *-
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR-
15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES-
16 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.-
17 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,-
18 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT-
19 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,-
20 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY-
21 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT-
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF-
23 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.-
24 */-
25-
26#include "includes.h"-
27-
28#include <sys/types.h>-
29#include <sys/stat.h>-
30#include <sys/uio.h>-
31-
32#include <fcntl.h>-
33#include <limits.h>-
34#include <pwd.h>-
35#include <stdarg.h>-
36#include <string.h>-
37#include <unistd.h>-
38-
39#include "atomicio.h"-
40#include "xmalloc.h"-
41#include "ssh2.h"-
42#include "packet.h"-
43#include "log.h"-
44#include "sshbuf.h"-
45#include "misc.h"-
46#include "servconf.h"-
47#include "compat.h"-
48#include "sshkey.h"-
49#include "hostfile.h"-
50#include "auth.h"-
51#include "dispatch.h"-
52#include "pathnames.h"-
53#include "sshbuf.h"-
54#include "ssherr.h"-
55-
56#ifdef GSSAPI-
57#include "ssh-gss.h"-
58#endif-
59#include "monitor_wrap.h"-
60#include "ssherr.h"-
61#include "digest.h"-
62-
63/* import */-
64extern ServerOptions options;-
65extern u_char *session_id2;-
66extern u_int session_id2_len;-
67extern struct sshbuf *loginmsg;-
68-
69/* methods */-
70-
71extern Authmethod method_none;-
72extern Authmethod method_pubkey;-
73extern Authmethod method_passwd;-
74extern Authmethod method_kbdint;-
75extern Authmethod method_hostbased;-
76#ifdef GSSAPI-
77extern Authmethod method_gssapi;-
78#endif-
79-
80Authmethod *authmethods[] = {-
81 &method_none,-
82 &method_pubkey,-
83#ifdef GSSAPI-
84 &method_gssapi,-
85#endif-
86 &method_passwd,-
87 &method_kbdint,-
88 &method_hostbased,-
89 NULL-
90};-
91-
92/* protocol */-
93-
94static int input_service_request(int, u_int32_t, struct ssh *);-
95static int input_userauth_request(int, u_int32_t, struct ssh *);-
96-
97/* helper */-
98static Authmethod *authmethod_lookup(Authctxt *, const char *);-
99static char *authmethods_get(Authctxt *authctxt);-
100-
101#define MATCH_NONE 0 /* method or submethod mismatch */-
102#define MATCH_METHOD 1 /* method matches (no submethod specified) */-
103#define MATCH_BOTH 2 /* method and submethod match */-
104#define MATCH_PARTIAL 3 /* method matches, submethod can't be checked */-
105static int list_starts_with(const char *, const char *, const char *);-
106-
107char *-
108auth2_read_banner(void)-
109{-
110 struct stat st;-
111 char *banner = NULL;-
112 size_t len, n;-
113 int fd;-
114-
115 if ((fd = open(options.banner, O_RDONLY)) == -1)
(fd = open(opt...r, 00 )) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
116 return (NULL);
never executed: return ( ((void *)0) );
0
117 if (fstat(fd, &st) == -1) {
fstat(fd, &st) == -1Description
TRUEnever evaluated
FALSEnever evaluated
0
118 close(fd);-
119 return (NULL);
never executed: return ( ((void *)0) );
0
120 }-
121 if (st.st_size <= 0 || st.st_size > 1*1024*1024) {
st.st_size <= 0Description
TRUEnever evaluated
FALSEnever evaluated
st.st_size > 1*1024*1024Description
TRUEnever evaluated
FALSEnever evaluated
0
122 close(fd);-
123 return (NULL);
never executed: return ( ((void *)0) );
0
124 }-
125-
126 len = (size_t)st.st_size; /* truncate */-
127 banner = xmalloc(len + 1);-
128 n = atomicio(read, fd, banner, len);-
129 close(fd);-
130-
131 if (n != len) {
n != lenDescription
TRUEnever evaluated
FALSEnever evaluated
0
132 free(banner);-
133 return (NULL);
never executed: return ( ((void *)0) );
0
134 }-
135 banner[n] = '\0';-
136-
137 return (banner);
never executed: return (banner);
0
138}-
139-
140void-
141userauth_send_banner(const char *msg)-
142{-
143 packet_start(SSH2_MSG_USERAUTH_BANNER);-
144 packet_put_cstring(msg);-
145 packet_put_cstring(""); /* language, unused */-
146 packet_send();-
147 debug("%s: sent", __func__);-
148}
never executed: end of block
0
149-
150static void-
151userauth_banner(void)-
152{-
153 char *banner = NULL;-
154-
155 if (options.banner == NULL)
options.banner == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
156 return;
never executed: return;
0
157-
158 if ((banner = PRIVSEP(auth2_read_banner())) == NULL)
(banner = (use...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
use_privsepDescription
TRUEnever evaluated
FALSEnever evaluated
0
159 goto done;
never executed: goto done;
0
160 userauth_send_banner(banner);-
161-
162done:
code before this statement never executed: done:
0
163 free(banner);-
164}
never executed: end of block
0
165-
166/*-
167 * loop until authctxt->success == TRUE-
168 */-
169void-
170do_authentication2(Authctxt *authctxt)-
171{-
172 struct ssh *ssh = active_state; /* XXX */-
173 ssh->authctxt = authctxt; /* XXX move to caller */-
174 ssh_dispatch_init(ssh, &dispatch_protocol_error);-
175 ssh_dispatch_set(ssh, SSH2_MSG_SERVICE_REQUEST, &input_service_request);-
176 ssh_dispatch_run_fatal(ssh, DISPATCH_BLOCK, &authctxt->success);-
177 ssh->authctxt = NULL;-
178}
never executed: end of block
0
179-
180/*ARGSUSED*/-
181static int-
182input_service_request(int type, u_int32_t seq, struct ssh *ssh)-
183{-
184 Authctxt *authctxt = ssh->authctxt;-
185 u_int len;-
186 int acceptit = 0;-
187 char *service = packet_get_cstring(&len);-
188 packet_check_eom();
never executed: end of block
_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
0
189-
190 if (authctxt == NULL)
authctxt == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
191 fatal("input_service_request: no authctxt");
never executed: fatal("input_service_request: no authctxt");
0
192-
193 if (strcmp(service, "ssh-userauth") == 0) {
never executed: __result = (((const unsigned char *) (const char *) ( service ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "ssh-userauth" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
194 if (!authctxt->success) {
!authctxt->successDescription
TRUEnever evaluated
FALSEnever evaluated
0
195 acceptit = 1;-
196 /* now we can handle user-auth requests */-
197 ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_REQUEST, &input_userauth_request);-
198 }
never executed: end of block
0
199 }
never executed: end of block
0
200 /* XXX all other service requests are denied */-
201-
202 if (acceptit) {
acceptitDescription
TRUEnever evaluated
FALSEnever evaluated
0
203 packet_start(SSH2_MSG_SERVICE_ACCEPT);-
204 packet_put_cstring(service);-
205 packet_send();-
206 packet_write_wait();-
207 } else {
never executed: end of block
0
208 debug("bad service request %s", service);-
209 packet_disconnect("bad service request %s", service);-
210 }
never executed: end of block
0
211 free(service);-
212 return 0;
never executed: return 0;
0
213}-
214-
215#define MIN_FAIL_DELAY_SECONDS 0.005-
216static double-
217user_specific_delay(const char *user)-
218{-
219 char b[512];-
220 size_t len = ssh_digest_bytes(SSH_DIGEST_SHA512);-
221 u_char *hash = xmalloc(len);-
222 double delay;-
223-
224 (void)snprintf(b, sizeof b, "%llu%s",-
225 (unsigned long long)options.timing_secret, user);-
226 if (ssh_digest_memory(SSH_DIGEST_SHA512, b, strlen(b), hash, len) != 0)
ssh_digest_mem...ash, len) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
227 fatal("%s: ssh_digest_memory", __func__);
never executed: fatal("%s: ssh_digest_memory", __func__);
0
228 /* 0-4.2 ms of delay */-
229 delay = (double)PEEK_U32(hash) / 1000 / 1000 / 1000 / 1000;-
230 freezero(hash, len);-
231 debug3("%s: user specific delay %0.3lfms", __func__, delay/1000);-
232 return MIN_FAIL_DELAY_SECONDS + delay;
never executed: return 0.005 + delay;
0
233}-
234-
235static void-
236ensure_minimum_time_since(double start, double seconds)-
237{-
238 struct timespec ts;-
239 double elapsed = monotime_double() - start, req = seconds, remain;-
240-
241 /* if we've already passed the requested time, scale up */-
242 while ((remain = seconds - elapsed) < 0.0)
(remain = seco...elapsed) < 0.0Description
TRUEnever evaluated
FALSEnever evaluated
0
243 seconds *= 2;
never executed: seconds *= 2;
0
244-
245 ts.tv_sec = remain;-
246 ts.tv_nsec = (remain - ts.tv_sec) * 1000000000;-
247 debug3("%s: elapsed %0.3lfms, delaying %0.3lfms (requested %0.3lfms)",-
248 __func__, elapsed*1000, remain*1000, req*1000);-
249 nanosleep(&ts, NULL);-
250}
never executed: end of block
0
251-
252/*ARGSUSED*/-
253static int-
254input_userauth_request(int type, u_int32_t seq, struct ssh *ssh)-
255{-
256 Authctxt *authctxt = ssh->authctxt;-
257 Authmethod *m = NULL;-
258 char *user, *service, *method, *style = NULL;-
259 int authenticated = 0;-
260 double tstart = monotime_double();-
261-
262 if (authctxt == NULL)
authctxt == ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
263 fatal("input_userauth_request: no authctxt");
never executed: fatal("input_userauth_request: no authctxt");
0
264-
265 user = packet_get_cstring(NULL);-
266 service = packet_get_cstring(NULL);-
267 method = packet_get_cstring(NULL);-
268 debug("userauth-request for user %s service %s method %s", user, service, method);-
269 debug("attempt %d failures %d", authctxt->attempt, authctxt->failures);-
270-
271 if ((style = strchr(user, ':')) != NULL)
(style = (__ex...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( ':' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_constant_p ( user )Description
TRUEnever evaluated
FALSEnever evaluated
( ':' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
272 *style++ = 0;
never executed: *style++ = 0;
0
273-
274 if (authctxt->attempt++ == 0) {
authctxt->attempt++ == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
275 /* setup auth context */-
276 authctxt->pw = PRIVSEP(getpwnamallow(user));
use_privsepDescription
TRUEnever evaluated
FALSEnever evaluated
0
277 authctxt->user = xstrdup(user);-
278 if (authctxt->pw && strcmp(service, "ssh-connection")==0) {
never executed: __result = (((const unsigned char *) (const char *) ( service ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "ssh-connection" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
authctxt->pwDescription
TRUEnever evaluated
FALSEnever evaluated
__extension__ ..." )))); }) ==0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
279 authctxt->valid = 1;-
280 debug2("%s: setting up authctxt for %s",-
281 __func__, user);-
282 } else {
never executed: end of block
0
283 /* Invalid user, fake password information */-
284 authctxt->pw = fakepw();-
285#ifdef SSH_AUDIT_EVENTS-
286 PRIVSEP(audit_event(SSH_INVALID_USER));-
287#endif-
288 }
never executed: end of block
0
289#ifdef USE_PAM-
290 if (options.use_pam)-
291 PRIVSEP(start_pam(authctxt));-
292#endif-
293 ssh_packet_set_log_preamble(ssh, "%suser %s",-
294 authctxt->valid ? "authenticating " : "invalid ", user);-
295 setproctitle("%s%s", authctxt->valid ? user : "unknown",-
296 use_privsep ? " [net]" : "");-
297 authctxt->service = xstrdup(service);-
298 authctxt->style = style ? xstrdup(style) : NULL;
styleDescription
TRUEnever evaluated
FALSEnever evaluated
0
299 if (use_privsep)
use_privsepDescription
TRUEnever evaluated
FALSEnever evaluated
0
300 mm_inform_authserv(service, style);
never executed: mm_inform_authserv(service, style);
0
301 userauth_banner();-
302 if (auth2_setup_methods_lists(authctxt) != 0)
auth2_setup_me...authctxt) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
303 packet_disconnect("no authentication methods enabled");
never executed: packet_disconnect("no authentication methods enabled");
0
304 } else if (strcmp(user, authctxt->user) != 0 ||
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( user ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( authctxt->user ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
305 strcmp(service, authctxt->service) != 0) {
never executed: __result = (((const unsigned char *) (const char *) ( service ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( authctxt->service ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
306 packet_disconnect("Change of username or service not allowed: "-
307 "(%s,%s) -> (%s,%s)",-
308 authctxt->user, authctxt->service, user, service);-
309 }
never executed: end of block
0
310 /* reset state */-
311 auth2_challenge_stop(ssh);-
312-
313#ifdef GSSAPI-
314 /* XXX move to auth2_gssapi_stop() */-
315 ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);-
316 ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL);-
317#endif-
318-
319 auth2_authctxt_reset_info(authctxt);-
320 authctxt->postponed = 0;-
321 authctxt->server_caused_failure = 0;-
322-
323 /* try to authenticate user */-
324 m = authmethod_lookup(authctxt, method);-
325 if (m != NULL && authctxt->failures < options.max_authtries) {
m != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
authctxt->fail....max_authtriesDescription
TRUEnever evaluated
FALSEnever evaluated
0
326 debug2("input_userauth_request: try method %s", method);-
327 authenticated = m->userauth(ssh);-
328 }
never executed: end of block
0
329 if (!authctxt->authenticated)
!authctxt->authenticatedDescription
TRUEnever evaluated
FALSEnever evaluated
0
330 ensure_minimum_time_since(tstart,
never executed: ensure_minimum_time_since(tstart, user_specific_delay(authctxt->user));
0
331 user_specific_delay(authctxt->user));
never executed: ensure_minimum_time_since(tstart, user_specific_delay(authctxt->user));
0
332 userauth_finish(ssh, authenticated, method, NULL);-
333-
334 free(service);-
335 free(user);-
336 free(method);-
337 return 0;
never executed: return 0;
0
338}-
339-
340void-
341userauth_finish(struct ssh *ssh, int authenticated, const char *method,-
342 const char *submethod)-
343{-
344 Authctxt *authctxt = ssh->authctxt;-
345 char *methods;-
346 int partial = 0;-
347-
348 if (!authctxt->valid && authenticated)
!authctxt->validDescription
TRUEnever evaluated
FALSEnever evaluated
authenticatedDescription
TRUEnever evaluated
FALSEnever evaluated
0
349 fatal("INTERNAL ERROR: authenticated invalid user %s",
never executed: fatal("INTERNAL ERROR: authenticated invalid user %s", authctxt->user);
0
350 authctxt->user);
never executed: fatal("INTERNAL ERROR: authenticated invalid user %s", authctxt->user);
0
351 if (authenticated && authctxt->postponed)
authenticatedDescription
TRUEnever evaluated
FALSEnever evaluated
authctxt->postponedDescription
TRUEnever evaluated
FALSEnever evaluated
0
352 fatal("INTERNAL ERROR: authenticated and postponed");
never executed: fatal("INTERNAL ERROR: authenticated and postponed");
0
353-
354 /* Special handling for root */-
355 if (authenticated && authctxt->pw->pw_uid == 0 &&
authenticatedDescription
TRUEnever evaluated
FALSEnever evaluated
authctxt->pw->pw_uid == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
356 !auth_root_allowed(ssh, method)) {
!auth_root_all...d(ssh, method)Description
TRUEnever evaluated
FALSEnever evaluated
0
357 authenticated = 0;-
358#ifdef SSH_AUDIT_EVENTS-
359 PRIVSEP(audit_event(SSH_LOGIN_ROOT_DENIED));-
360#endif-
361 }
never executed: end of block
0
362-
363 if (authenticated && options.num_auth_methods != 0) {
authenticatedDescription
TRUEnever evaluated
FALSEnever evaluated
options.num_auth_methods != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
364 if (!auth2_update_methods_lists(authctxt, method, submethod)) {
!auth2_update_...od, submethod)Description
TRUEnever evaluated
FALSEnever evaluated
0
365 authenticated = 0;-
366 partial = 1;-
367 }
never executed: end of block
0
368 }
never executed: end of block
0
369-
370 /* Log before sending the reply */-
371 auth_log(authctxt, authenticated, partial, method, submethod);-
372-
373 /* Update information exposed to session */-
374 if (authenticated || partial)
authenticatedDescription
TRUEnever evaluated
FALSEnever evaluated
partialDescription
TRUEnever evaluated
FALSEnever evaluated
0
375 auth2_update_session_info(authctxt, method, submethod);
never executed: auth2_update_session_info(authctxt, method, submethod);
0
376-
377 if (authctxt->postponed)
authctxt->postponedDescription
TRUEnever evaluated
FALSEnever evaluated
0
378 return;
never executed: return;
0
379-
380#ifdef USE_PAM-
381 if (options.use_pam && authenticated) {-
382 int r;-
383-
384 if (!PRIVSEP(do_pam_account())) {-
385 /* if PAM returned a message, send it to the user */-
386 if (sshbuf_len(loginmsg) > 0) {-
387 if ((r = sshbuf_put(loginmsg, "\0", 1)) != 0)-
388 fatal("%s: buffer error: %s",-
389 __func__, ssh_err(r));-
390 userauth_send_banner(sshbuf_ptr(loginmsg));-
391 packet_write_wait();-
392 }-
393 fatal("Access denied for user %s by PAM account "-
394 "configuration", authctxt->user);-
395 }-
396 }-
397#endif-
398-
399 if (authenticated == 1) {
authenticated == 1Description
TRUEnever evaluated
FALSEnever evaluated
0
400 /* turn off userauth */-
401 ssh_dispatch_set(ssh, SSH2_MSG_USERAUTH_REQUEST, &dispatch_protocol_ignore);-
402 packet_start(SSH2_MSG_USERAUTH_SUCCESS);-
403 packet_send();-
404 packet_write_wait();-
405 /* now we can break out */-
406 authctxt->success = 1;-
407 ssh_packet_set_log_preamble(ssh, "user %s", authctxt->user);-
408 } else {
never executed: end of block
0
409 /* Allow initial try of "none" auth without failure penalty */-
410 if (!partial && !authctxt->server_caused_failure &&
!partialDescription
TRUEnever evaluated
FALSEnever evaluated
!authctxt->ser...caused_failureDescription
TRUEnever evaluated
FALSEnever evaluated
0
411 (authctxt->attempt > 1 || strcmp(method, "none") != 0))
never executed: __result = (((const unsigned char *) (const char *) ( method ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "none" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
authctxt->attempt > 1Description
TRUEnever evaluated
FALSEnever evaluated
__extension__ ... )))); }) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
412 authctxt->failures++;
never executed: authctxt->failures++;
0
413 if (authctxt->failures >= options.max_authtries) {
authctxt->fail....max_authtriesDescription
TRUEnever evaluated
FALSEnever evaluated
0
414#ifdef SSH_AUDIT_EVENTS-
415 PRIVSEP(audit_event(SSH_LOGIN_EXCEED_MAXTRIES));-
416#endif-
417 auth_maxtries_exceeded(authctxt);-
418 }
never executed: end of block
0
419 methods = authmethods_get(authctxt);-
420 debug3("%s: failure partial=%d next methods=\"%s\"", __func__,-
421 partial, methods);-
422 packet_start(SSH2_MSG_USERAUTH_FAILURE);-
423 packet_put_cstring(methods);-
424 packet_put_char(partial);-
425 packet_send();-
426 packet_write_wait();-
427 free(methods);-
428 }
never executed: end of block
0
429}-
430-
431/*-
432 * Checks whether method is allowed by at least one AuthenticationMethods-
433 * methods list. Returns 1 if allowed, or no methods lists configured.-
434 * 0 otherwise.-
435 */-
436int-
437auth2_method_allowed(Authctxt *authctxt, const char *method,-
438 const char *submethod)-
439{-
440 u_int i;-
441-
442 /*-
443 * NB. authctxt->num_auth_methods might be zero as a result of-
444 * auth2_setup_methods_lists(), so check the configuration.-
445 */-
446 if (options.num_auth_methods == 0)
options.num_auth_methods == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
447 return 1;
never executed: return 1;
0
448 for (i = 0; i < authctxt->num_auth_methods; i++) {
i < authctxt->num_auth_methodsDescription
TRUEnever evaluated
FALSEnever evaluated
0
449 if (list_starts_with(authctxt->auth_methods[i], method,
list_starts_wi...ubmethod) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
450 submethod) != MATCH_NONE)
list_starts_wi...ubmethod) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
451 return 1;
never executed: return 1;
0
452 }
never executed: end of block
0
453 return 0;
never executed: return 0;
0
454}-
455-
456static char *-
457authmethods_get(Authctxt *authctxt)-
458{-
459 struct sshbuf *b;-
460 char *list;-
461 int i, r;-
462-
463 if ((b = sshbuf_new()) == NULL)
(b = sshbuf_ne...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
464 fatal("%s: sshbuf_new failed", __func__);
never executed: fatal("%s: sshbuf_new failed", __func__);
0
465 for (i = 0; authmethods[i] != NULL; i++) {
authmethods[i] != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
466 if (strcmp(authmethods[i]->name, "none") == 0)
never executed: __result = (((const unsigned char *) (const char *) ( authmethods[i]->name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( "none" ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
467 continue;
never executed: continue;
0
468 if (authmethods[i]->enabled == NULL ||
authmethods[i]...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
469 *(authmethods[i]->enabled) == 0)
*(authmethods[...>enabled) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
470 continue;
never executed: continue;
0
471 if (!auth2_method_allowed(authctxt, authmethods[i]->name,
!auth2_method_... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
472 NULL))
!auth2_method_... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
473 continue;
never executed: continue;
0
474 if ((r = sshbuf_putf(b, "%s%s", sshbuf_len(b) ? "," : "",
(r = sshbuf_pu...]->name)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
475 authmethods[i]->name)) != 0)
(r = sshbuf_pu...]->name)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
476 fatal("%s: buffer error: %s", __func__, ssh_err(r));
never executed: fatal("%s: buffer error: %s", __func__, ssh_err(r));
0
477 }
never executed: end of block
0
478 if ((list = sshbuf_dup_string(b)) == NULL)
(list = sshbuf...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
479 fatal("%s: sshbuf_dup_string failed", __func__);
never executed: fatal("%s: sshbuf_dup_string failed", __func__);
0
480 sshbuf_free(b);-
481 return list;
never executed: return list;
0
482}-
483-
484static Authmethod *-
485authmethod_lookup(Authctxt *authctxt, const char *name)-
486{-
487 int i;-
488-
489 if (name != NULL)
name != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
490 for (i = 0; authmethods[i] != NULL; i++)
authmethods[i] != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
491 if (authmethods[i]->enabled != NULL &&
authmethods[i]...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
492 *(authmethods[i]->enabled) != 0 &&
*(authmethods[...>enabled) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
493 strcmp(name, authmethods[i]->name) == 0 &&
never executed: __result = (((const unsigned char *) (const char *) ( name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( authmethods[i]->name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
494 auth2_method_allowed(authctxt,
auth2_method_a... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
495 authmethods[i]->name, NULL))
auth2_method_a... ((void *)0) )Description
TRUEnever evaluated
FALSEnever evaluated
0
496 return authmethods[i];
never executed: return authmethods[i];
0
497 debug2("Unrecognized authentication method name: %s",-
498 name ? name : "NULL");-
499 return NULL;
never executed: return ((void *)0) ;
0
500}-
501-
502/*-
503 * Check a comma-separated list of methods for validity. Is need_enable is-
504 * non-zero, then also require that the methods are enabled.-
505 * Returns 0 on success or -1 if the methods list is invalid.-
506 */-
507int-
508auth2_methods_valid(const char *_methods, int need_enable)-
509{-
510 char *methods, *omethods, *method, *p;-
511 u_int i, found;-
512 int ret = -1;-
513-
514 if (*_methods == '\0') {
*_methods == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
515 error("empty authentication method list");-
516 return -1;
never executed: return -1;
0
517 }-
518 omethods = methods = xstrdup(_methods);-
519 while ((method = strsep(&methods, ",")) != NULL) {
(method = __ex...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
520 for (found = i = 0; !found && authmethods[i] != NULL; i++) {
!foundDescription
TRUEnever evaluated
FALSEnever evaluated
authmethods[i] != ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
521 if ((p = strchr(method, ':')) != NULL)
(p = (__extens...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( ':' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_con...t_p ( method )Description
TRUEnever evaluated
FALSEnever evaluated
( ':' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
522 *p = '\0';
never executed: *p = '\0';
0
523 if (strcmp(method, authmethods[i]->name) != 0)
never executed: __result = (((const unsigned char *) (const char *) ( method ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( authmethods[i]->name ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
__extension__ ... )))); }) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
524 continue;
never executed: continue;
0
525 if (need_enable) {
need_enableDescription
TRUEnever evaluated
FALSEnever evaluated
0
526 if (authmethods[i]->enabled == NULL ||
authmethods[i]...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
527 *(authmethods[i]->enabled) == 0) {
*(authmethods[...>enabled) == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
528 error("Disabled method \"%s\" in "-
529 "AuthenticationMethods list \"%s\"",-
530 method, _methods);-
531 goto out;
never executed: goto out;
0
532 }-
533 }
never executed: end of block
0
534 found = 1;-
535 break;
never executed: break;
0
536 }-
537 if (!found) {
!foundDescription
TRUEnever evaluated
FALSEnever evaluated
0
538 error("Unknown authentication method \"%s\" in list",-
539 method);-
540 goto out;
never executed: goto out;
0
541 }-
542 }
never executed: end of block
0
543 ret = 0;-
544 out:
code before this statement never executed: out:
0
545 free(omethods);-
546 return ret;
never executed: return ret;
0
547}-
548-
549/*-
550 * Prune the AuthenticationMethods supplied in the configuration, removing-
551 * any methods lists that include disabled methods. Note that this might-
552 * leave authctxt->num_auth_methods == 0, even when multiple required auth-
553 * has been requested. For this reason, all tests for whether multiple is-
554 * enabled should consult options.num_auth_methods directly.-
555 */-
556int-
557auth2_setup_methods_lists(Authctxt *authctxt)-
558{-
559 u_int i;-
560-
561 if (options.num_auth_methods == 0)
options.num_auth_methods == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
562 return 0;
never executed: return 0;
0
563 debug3("%s: checking methods", __func__);-
564 authctxt->auth_methods = xcalloc(options.num_auth_methods,-
565 sizeof(*authctxt->auth_methods));-
566 authctxt->num_auth_methods = 0;-
567 for (i = 0; i < options.num_auth_methods; i++) {
i < options.num_auth_methodsDescription
TRUEnever evaluated
FALSEnever evaluated
0
568 if (auth2_methods_valid(options.auth_methods[i], 1) != 0) {
auth2_methods_...ds[i], 1) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
569 logit("Authentication methods list \"%s\" contains "-
570 "disabled method, skipping",-
571 options.auth_methods[i]);-
572 continue;
never executed: continue;
0
573 }-
574 debug("authentication methods list %d: %s",-
575 authctxt->num_auth_methods, options.auth_methods[i]);-
576 authctxt->auth_methods[authctxt->num_auth_methods++] =-
577 xstrdup(options.auth_methods[i]);-
578 }
never executed: end of block
0
579 if (authctxt->num_auth_methods == 0) {
authctxt->num_...h_methods == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
580 error("No AuthenticationMethods left after eliminating "-
581 "disabled methods");-
582 return -1;
never executed: return -1;
0
583 }-
584 return 0;
never executed: return 0;
0
585}-
586-
587static int-
588list_starts_with(const char *methods, const char *method,-
589 const char *submethod)-
590{-
591 size_t l = strlen(method);-
592 int match;-
593 const char *p;-
594-
595 if (strncmp(methods, method, l) != 0)
never executed: __result = (((const unsigned char *) (const char *) ( methods ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( method ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__...d , l ))) != 0Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( l )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons..._p ( methods )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( metho...size_t) ( l ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons...t_p ( method )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( metho...size_t) ( l ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
596 return MATCH_NONE;
never executed: return 0;
0
597 p = methods + l;-
598 match = MATCH_METHOD;-
599 if (*p == ':') {
*p == ':'Description
TRUEnever evaluated
FALSEnever evaluated
0
600 if (!submethod)
!submethodDescription
TRUEnever evaluated
FALSEnever evaluated
0
601 return MATCH_PARTIAL;
never executed: return 3;
0
602 l = strlen(submethod);-
603 p += 1;-
604 if (strncmp(submethod, p, l))
never executed: __result = (((const unsigned char *) (const char *) ( submethod ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
never executed: __result = (((const unsigned char *) (const char *) ( p ))[3] - __s2[3]);
never executed: end of block
never executed: end of block
(__extension__...od , p , l )))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( l )Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_cons... ( submethod )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( subme...size_t) ( l ))Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( p )Description
TRUEnever evaluated
FALSEnever evaluated
strlen ( p ) <...size_t) ( l ))Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s1_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 0Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 1Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
__s2_len > 2Description
TRUEnever evaluated
FALSEnever evaluated
__result == 0Description
TRUEnever evaluated
FALSEnever evaluated
0
605 return MATCH_NONE;
never executed: return 0;
0
606 p += l;-
607 match = MATCH_BOTH;-
608 }
never executed: end of block
0
609 if (*p != ',' && *p != '\0')
*p != ','Description
TRUEnever evaluated
FALSEnever evaluated
*p != '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
610 return MATCH_NONE;
never executed: return 0;
0
611 return match;
never executed: return match;
0
612}-
613-
614/*-
615 * Remove method from the start of a comma-separated list of methods.-
616 * Returns 0 if the list of methods did not start with that method or 1-
617 * if it did.-
618 */-
619static int-
620remove_method(char **methods, const char *method, const char *submethod)-
621{-
622 char *omethods = *methods, *p;-
623 size_t l = strlen(method);-
624 int match;-
625-
626 match = list_starts_with(omethods, method, submethod);-
627 if (match != MATCH_METHOD && match != MATCH_BOTH)
match != 1Description
TRUEnever evaluated
FALSEnever evaluated
match != 2Description
TRUEnever evaluated
FALSEnever evaluated
0
628 return 0;
never executed: return 0;
0
629 p = omethods + l;-
630 if (submethod && match == MATCH_BOTH)
submethodDescription
TRUEnever evaluated
FALSEnever evaluated
match == 2Description
TRUEnever evaluated
FALSEnever evaluated
0
631 p += 1 + strlen(submethod); /* include colon */
never executed: p += 1 + strlen(submethod);
0
632 if (*p == ',')
*p == ','Description
TRUEnever evaluated
FALSEnever evaluated
0
633 p++;
never executed: p++;
0
634 *methods = xstrdup(p);-
635 free(omethods);-
636 return 1;
never executed: return 1;
0
637}-
638-
639/*-
640 * Called after successful authentication. Will remove the successful method-
641 * from the start of each list in which it occurs. If it was the last method-
642 * in any list, then authentication is deemed successful.-
643 * Returns 1 if the method completed any authentication list or 0 otherwise.-
644 */-
645int-
646auth2_update_methods_lists(Authctxt *authctxt, const char *method,-
647 const char *submethod)-
648{-
649 u_int i, found = 0;-
650-
651 debug3("%s: updating methods list after \"%s\"", __func__, method);-
652 for (i = 0; i < authctxt->num_auth_methods; i++) {
i < authctxt->num_auth_methodsDescription
TRUEnever evaluated
FALSEnever evaluated
0
653 if (!remove_method(&(authctxt->auth_methods[i]), method,
!remove_method...od, submethod)Description
TRUEnever evaluated
FALSEnever evaluated
0
654 submethod))
!remove_method...od, submethod)Description
TRUEnever evaluated
FALSEnever evaluated
0
655 continue;
never executed: continue;
0
656 found = 1;-
657 if (*authctxt->auth_methods[i] == '\0') {
*authctxt->aut...ods[i] == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
658 debug2("authentication methods list %d complete", i);-
659 return 1;
never executed: return 1;
0
660 }-
661 debug3("authentication methods list %d remaining: \"%s\"",-
662 i, authctxt->auth_methods[i]);-
663 }
never executed: end of block
0
664 /* This should not happen, but would be bad if it did */-
665 if (!found)
!foundDescription
TRUEnever evaluated
FALSEnever evaluated
0
666 fatal("%s: method not in AuthenticationMethods", __func__);
never executed: fatal("%s: method not in AuthenticationMethods", __func__);
0
667 return 0;
never executed: return 0;
0
668}-
669-
670/* Reset method-specific information */-
671void auth2_authctxt_reset_info(Authctxt *authctxt)-
672{-
673 sshkey_free(authctxt->auth_method_key);-
674 free(authctxt->auth_method_info);-
675 authctxt->auth_method_key = NULL;-
676 authctxt->auth_method_info = NULL;-
677}
never executed: end of block
0
678-
679/* Record auth method-specific information for logs */-
680void-
681auth2_record_info(Authctxt *authctxt, const char *fmt, ...)-
682{-
683 va_list ap;-
684 int i;-
685-
686 free(authctxt->auth_method_info);-
687 authctxt->auth_method_info = NULL;-
688-
689 va_start(ap, fmt);-
690 i = vasprintf(&authctxt->auth_method_info, fmt, ap);-
691 va_end(ap);-
692-
693 if (i < 0 || authctxt->auth_method_info == NULL)
i < 0Description
TRUEnever evaluated
FALSEnever evaluated
authctxt->auth...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
694 fatal("%s: vasprintf failed", __func__);
never executed: fatal("%s: vasprintf failed", __func__);
0
695}
never executed: end of block
0
696-
697/*-
698 * Records a public key used in authentication. This is used for logging-
699 * and to ensure that the same key is not subsequently accepted again for-
700 * multiple authentication.-
701 */-
702void-
703auth2_record_key(Authctxt *authctxt, int authenticated,-
704 const struct sshkey *key)-
705{-
706 struct sshkey **tmp, *dup;-
707 int r;-
708-
709 if ((r = sshkey_from_private(key, &dup)) != 0)
(r = sshkey_fr...y, &dup)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
710 fatal("%s: copy key: %s", __func__, ssh_err(r));
never executed: fatal("%s: copy key: %s", __func__, ssh_err(r));
0
711 sshkey_free(authctxt->auth_method_key);-
712 authctxt->auth_method_key = dup;-
713-
714 if (!authenticated)
!authenticatedDescription
TRUEnever evaluated
FALSEnever evaluated
0
715 return;
never executed: return;
0
716-
717 /* If authenticated, make sure we don't accept this key again */-
718 if ((r = sshkey_from_private(key, &dup)) != 0)
(r = sshkey_fr...y, &dup)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
719 fatal("%s: copy key: %s", __func__, ssh_err(r));
never executed: fatal("%s: copy key: %s", __func__, ssh_err(r));
0
720 if (authctxt->nprev_keys >= INT_MAX ||
authctxt->npre... >= 0x7fffffffDescription
TRUEnever evaluated
FALSEnever evaluated
0
721 (tmp = recallocarray(authctxt->prev_keys, authctxt->nprev_keys,
(tmp = recallo...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
722 authctxt->nprev_keys + 1, sizeof(*authctxt->prev_keys))) == NULL)
(tmp = recallo...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
723 fatal("%s: reallocarray failed", __func__);
never executed: fatal("%s: reallocarray failed", __func__);
0
724 authctxt->prev_keys = tmp;-
725 authctxt->prev_keys[authctxt->nprev_keys] = dup;-
726 authctxt->nprev_keys++;-
727-
728}
never executed: end of block
0
729-
730/* Checks whether a key has already been previously used for authentication */-
731int-
732auth2_key_already_used(Authctxt *authctxt, const struct sshkey *key)-
733{-
734 u_int i;-
735 char *fp;-
736-
737 for (i = 0; i < authctxt->nprev_keys; i++) {
i < authctxt->nprev_keysDescription
TRUEnever evaluated
FALSEnever evaluated
0
738 if (sshkey_equal_public(key, authctxt->prev_keys[i])) {
sshkey_equal_p...>prev_keys[i])Description
TRUEnever evaluated
FALSEnever evaluated
0
739 fp = sshkey_fingerprint(authctxt->prev_keys[i],-
740 options.fingerprint_hash, SSH_FP_DEFAULT);-
741 debug3("%s: key already used: %s %s", __func__,-
742 sshkey_type(authctxt->prev_keys[i]),-
743 fp == NULL ? "UNKNOWN" : fp);-
744 free(fp);-
745 return 1;
never executed: return 1;
0
746 }-
747 }
never executed: end of block
0
748 return 0;
never executed: return 0;
0
749}-
750-
751/*-
752 * Updates authctxt->session_info with details of authentication. Should be-
753 * whenever an authentication method succeeds.-
754 */-
755void-
756auth2_update_session_info(Authctxt *authctxt, const char *method,-
757 const char *submethod)-
758{-
759 int r;-
760-
761 if (authctxt->session_info == NULL) {
authctxt->sess...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
762 if ((authctxt->session_info = sshbuf_new()) == NULL)
(authctxt->ses...== ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
763 fatal("%s: sshbuf_new", __func__);
never executed: fatal("%s: sshbuf_new", __func__);
0
764 }
never executed: end of block
0
765-
766 /* Append method[/submethod] */-
767 if ((r = sshbuf_putf(authctxt->session_info, "%s%s%s",
(r = sshbuf_pu...bmethod)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
768 method, submethod == NULL ? "" : "/",
(r = sshbuf_pu...bmethod)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
769 submethod == NULL ? "" : submethod)) != 0)
(r = sshbuf_pu...bmethod)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
770 fatal("%s: append method: %s", __func__, ssh_err(r));
never executed: fatal("%s: append method: %s", __func__, ssh_err(r));
0
771-
772 /* Append key if present */-
773 if (authctxt->auth_method_key != NULL) {
authctxt->auth...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
774 if ((r = sshbuf_put_u8(authctxt->session_info, ' ')) != 0 ||
(r = sshbuf_pu...fo, ' ')) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
775 (r = sshkey_format_text(authctxt->auth_method_key,
(r = sshkey_fo...on_info)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
776 authctxt->session_info)) != 0)
(r = sshkey_fo...on_info)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
777 fatal("%s: append key: %s", __func__, ssh_err(r));
never executed: fatal("%s: append key: %s", __func__, ssh_err(r));
0
778 }
never executed: end of block
0
779-
780 if (authctxt->auth_method_info != NULL) {
authctxt->auth...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
0
781 /* Ensure no ambiguity here */-
782 if (strchr(authctxt->auth_method_info, '\n') != NULL)
(__extension__...!= ((void *)0)Description
TRUEnever evaluated
FALSEnever evaluated
__builtin_constant_p ( '\n' )Description
TRUEnever evaluated
FALSEnever evaluated
!__builtin_con..._method_info )Description
TRUEnever evaluated
FALSEnever evaluated
( '\n' ) == '\0'Description
TRUEnever evaluated
FALSEnever evaluated
0
783 fatal("%s: auth_method_info contains \\n", __func__);
never executed: fatal("%s: auth_method_info contains \\n", __func__);
0
784 if ((r = sshbuf_put_u8(authctxt->session_info, ' ')) != 0 ||
(r = sshbuf_pu...fo, ' ')) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
785 (r = sshbuf_putf(authctxt->session_info, "%s",
(r = sshbuf_pu...od_info)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
786 authctxt->auth_method_info)) != 0) {
(r = sshbuf_pu...od_info)) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
787 fatal("%s: append method info: %s",-
788 __func__, ssh_err(r));-
789 }
never executed: end of block
0
790 }
never executed: end of block
0
791 if ((r = sshbuf_put_u8(authctxt->session_info, '\n')) != 0)
(r = sshbuf_pu...o, '\n')) != 0Description
TRUEnever evaluated
FALSEnever evaluated
0
792 fatal("%s: append: %s", __func__, ssh_err(r));
never executed: fatal("%s: append: %s", __func__, ssh_err(r));
0
793}
never executed: end of block
0
794-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.2