-/* $OpenBSD: auth2-gss.c,v 1.15 2006/08/03 03:34:41 deraadt Exp $ */
+/* $OpenBSD: auth2-gss.c,v 1.16 2007/10/29 00:52:45 dtucker Exp $ */
/*
- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
+ * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
static void input_gssapi_exchange_complete(int type, u_int32_t plen, void *ctxt);
static void input_gssapi_errtok(int, u_int32_t, void *);
-static int gssapi_with_mic = 1; /* flag to toggle "gssapi-with-mic" vs.
- "gssapi" */
-
-static int
-userauth_external(Authctxt *authctxt)
-{
- packet_check_eom();
-
- if (authctxt->valid && authctxt->user && authctxt->user[0]) {
- return(PRIVSEP(ssh_gssapi_userok(authctxt->user)));
- }
- return 0;
-}
-
/*
* The 'gssapi_keyex' userauth mechanism.
*/
!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gss_kex_context,
&gssbuf2, &mic)))) {
if (authctxt->valid && authctxt->user && authctxt->user[0]) {
- authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
+ authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
+ authctxt->pw,
+ 1 /* gssapi-keyex */));
}
}
}
authctxt->postponed = 0;
dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
- userauth_finish(authctxt, 0,
- gssapi_with_mic ? "gssapi-with-mic" :
- "gssapi");
+ userauth_finish(authctxt, 0, "gssapi-with-mic");
} else {
if (send_tok.length != 0) {
packet_start(SSH2_MSG_USERAUTH_GSSAPI_TOKEN);
}
if (maj_status == GSS_S_COMPLETE) {
dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL);
- if (flags & GSS_C_INTEG_FLAG && gssapi_with_mic)
+ if (flags & GSS_C_INTEG_FLAG)
dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_MIC,
&input_gssapi_mic);
else
}
static void
-gssapi_set_implicit_username(Authctxt *authctxt)
+gssapi_set_username(Authctxt *authctxt)
{
+ char *lname = NULL;
+
if ((authctxt->user == NULL) || (authctxt->user[0] == '\0')) {
- char *lname = NULL;
- PRIVSEP(ssh_gssapi_localname(&lname));
- if (lname && lname[0] != '\0') {
- if (authctxt->user) xfree(authctxt->user);
- authctxt->user = lname;
- debug("set username to %s from gssapi context", lname);
- authctxt->pw = PRIVSEP(getpwnamallow(authctxt->user));
- if (authctxt->pw) {
- authctxt->valid = 1;
- }
- } else {
- debug("failed to set username from gssapi context");
- packet_send_debug("failed to set username from gssapi context");
- }
- }
- if (authctxt->pw) {
+ PRIVSEP(ssh_gssapi_localname(&lname));
+ if (lname && lname[0] != '\0') {
+ if (authctxt->user) xfree(authctxt->user);
+ authctxt->user = lname;
+ debug("set username to %s from gssapi context", lname);
+ authctxt->pw = PRIVSEP(getpwnamallow(authctxt->user));
+ if (authctxt->pw) {
+ authctxt->valid = 1;
#ifdef USE_PAM
- if (options.use_pam)
- PRIVSEP(start_pam(authctxt));
+ if (options.use_pam)
+ PRIVSEP(start_pam(authctxt));
#endif
+ }
+ } else {
+ debug("failed to set username from gssapi context");
+ packet_send_debug("failed to set username from gssapi context");
+ }
}
}
if (authctxt == NULL || (authctxt->methoddata == NULL && !use_privsep))
fatal("No authentication or GSSAPI context");
- gssapi_set_implicit_username(authctxt);
+ gssapi_set_username(authctxt);
gssctxt = authctxt->methoddata;
/* user should be set if valid but we double-check here */
if (authctxt->valid && authctxt->user && authctxt->user[0]) {
- authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
+ authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
+ authctxt->pw, 0 /* !gssapi-keyex */));
} else {
authenticated = 0;
}
dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_ERRTOK, NULL);
dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_MIC, NULL);
dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_EXCHANGE_COMPLETE, NULL);
- userauth_finish(authctxt, authenticated,
- gssapi_with_mic ? "gssapi-with-mic" : "gssapi");
-}
-
-static int
-userauth_gssapi_with_mic(Authctxt *authctxt)
-{
- gssapi_with_mic = 1;
- return userauth_gssapi(authctxt);
-}
-
-static int
-userauth_gssapi_without_mic(Authctxt *authctxt)
-{
- gssapi_with_mic = 0;
- return userauth_gssapi(authctxt);
+ userauth_finish(authctxt, authenticated, "gssapi-with-mic");
}
static void
if (authctxt == NULL || (authctxt->methoddata == NULL && !use_privsep))
fatal("No authentication or GSSAPI context");
- gssapi_set_implicit_username(authctxt);
-
gssctxt = authctxt->methoddata;
mic.value = packet_get_string(&len);
gssbuf.value = buffer_ptr(&b);
gssbuf.length = buffer_len(&b);
+ gssapi_set_username(authctxt);
+
if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gssctxt, &gssbuf, &mic))))
if (authctxt->valid && authctxt->user && authctxt->user[0]) {
- authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
+ authenticated =
+ PRIVSEP(ssh_gssapi_userok(authctxt->user, authctxt->pw,
+ 0 /* !gssapi-keyex */));
} else {
- authenticated = 0;
+ authenticated = 0;
}
else
logit("GSSAPI MIC check failed");
}
}
-Authmethod method_external = {
- "external-keyx",
- userauth_external,
- &options.gss_authentication
-};
-
Authmethod method_gsskeyex = {
"gssapi-keyex",
userauth_gsskeyex,
Authmethod method_gssapi = {
"gssapi-with-mic",
- userauth_gssapi_with_mic,
- &options.gss_authentication
-};
-
-Authmethod method_gssapi_compat = {
- "gssapi",
- userauth_gssapi_without_mic,
+ userauth_gssapi,
&options.gss_authentication
};