]> andersk Git - openssh.git/blobdiff - auth-chall.c
- (dtucker) [openbsd-compat/setproctitle.c] Ensure SPT_TYPE is defined before
[openssh.git] / auth-chall.c
index e02e99d36a6f55f3f8b22c04a92e94a7fd28dd94..6b7c8bd13ba3793c8e23fc584059c45cba894e3e 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2001 Markus Friedl. All rights reserved.
+ * Copyright (c) 2001 Markus Friedl.  All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  */
 
 #include "includes.h"
-RCSID("$OpenBSD: auth-chall.c,v 1.1 2001/01/18 17:12:43 markus Exp $");
+RCSID("$OpenBSD: auth-chall.c,v 1.8 2001/05/18 14:13:28 markus Exp $");
 
-#include "ssh.h"
 #include "auth.h"
+#include "log.h"
+#include "xmalloc.h"
+
+/* limited protocol v1 interface to kbd-interactive authentication */
+
+extern KbdintDevice *devices[];
+static KbdintDevice *device;
 
-#ifdef SKEY
 char *
-get_challenge(Authctxt *authctxt, char *devs)
+get_challenge(Authctxt *authctxt)
 {
-       static char challenge[1024];
-        struct skey skey;
-       if (skeychallenge(&skey, authctxt->user, challenge) == -1)
+       char *challenge, *name, *info, **prompts;
+       u_int i, numprompts;
+       u_int *echo_on;
+
+       device = devices[0]; /* we always use the 1st device for protocol 1 */
+       if (device == NULL)
                return NULL;
-       strlcat(challenge, "\nS/Key Password: ", sizeof challenge);
-       return challenge;
+       if ((authctxt->kbdintctxt = device->init_ctx(authctxt)) == NULL)
+               return NULL;
+       if (device->query(authctxt->kbdintctxt, &name, &info,
+           &numprompts, &prompts, &echo_on)) {
+               device->free_ctx(authctxt->kbdintctxt);
+               authctxt->kbdintctxt = NULL;
+               return NULL;
+       }
+       if (numprompts < 1)
+               fatal("get_challenge: numprompts < 1");
+       challenge = xstrdup(prompts[0]);
+       for (i = 0; i < numprompts; i++)
+               xfree(prompts[i]);
+       xfree(prompts);
+       xfree(name);
+       xfree(echo_on);
+       xfree(info);
+
+       return (challenge);
 }
 int
-verify_response(Authctxt *authctxt, char *response)
+verify_response(Authctxt *authctxt, const char *response)
 {
-       return (authctxt->valid &&
-           skey_haskey(authctxt->pw->pw_name) == 0 &&
-           skey_passcheck(authctxt->pw->pw_name, response) != -1);
-}
-#else
-/* not available */
-char *
-get_challenge(Authctxt *authctxt, char *devs)
-{
-       return NULL;
+       char *resp[1];
+       int res;
+
+       if (device == NULL)
+               return 0;
+       if (authctxt->kbdintctxt == NULL)
+               return 0;
+       resp[0] = (char *)response;
+       res = device->respond(authctxt->kbdintctxt, 1, resp);
+       if (res == 1) {
+               /* postponed - send a null query just in case */
+               char *name, *info, **prompts;
+               u_int i, numprompts, *echo_on;
+
+               res = device->query(authctxt->kbdintctxt, &name, &info,
+                   &numprompts, &prompts, &echo_on);
+               if (res == 0) {
+                       for (i = 0; i < numprompts; i++)
+                               xfree(prompts[i]);
+                       xfree(prompts);
+                       xfree(name);
+                       xfree(echo_on);
+                       xfree(info);
+               }
+               /* if we received more prompts, we're screwed */
+               res = (numprompts != 0);
+       }
+       device->free_ctx(authctxt->kbdintctxt);
+       authctxt->kbdintctxt = NULL;
+       return res ? 0 : 1;
 }
-int
-verify_response(Authctxt *authctxt, char *response)
+void
+abandon_challenge_response(Authctxt *authctxt)
 {
-       return 0;
+       if (authctxt->kbdintctxt != NULL) {
+               device->free_ctx(authctxt->kbdintctxt);
+               authctxt->kbdintctxt = NULL;
+       }
 }
-#endif
This page took 0.032567 seconds and 4 git commands to generate.