auth-skey.c revision 99046
1/* 2 * Copyright (c) 2001 Markus Friedl. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 15 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 16 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 17 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 18 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 19 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 20 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 22 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 23 */ 24#include "includes.h" 25RCSID("$OpenBSD: auth-skey.c,v 1.19 2002/06/19 00:27:55 deraadt Exp $"); 26RCSID("$FreeBSD: head/crypto/openssh/auth-skey.c 99046 2002-06-29 10:44:37Z des $"); 27 28#ifdef SKEY 29 30#ifdef OPIE 31#include <opie.h> 32#define skey opie 33#define skeychallenge(k, u, c) opiechallenge((k), (u), (c)) 34#define skey_haskey(u) opie_haskey((u)) 35#define skey_passcheck(u, r) opie_passverify((u), (r)) 36#else 37#include <skey.h> 38#endif 39 40#include "xmalloc.h" 41#include "auth.h" 42#include "monitor_wrap.h" 43 44static void * 45skey_init_ctx(Authctxt *authctxt) 46{ 47 return authctxt; 48} 49 50int 51skey_query(void *ctx, char **name, char **infotxt, 52 u_int* numprompts, char ***prompts, u_int **echo_on) 53{ 54 Authctxt *authctxt = ctx; 55 char challenge[1024], *p; 56 int len; 57 struct skey skey; 58 59 if (skeychallenge(&skey, authctxt->user, challenge) == -1) 60 return -1; 61 62 *name = xstrdup(""); 63 *infotxt = xstrdup(""); 64 *numprompts = 1; 65 *prompts = xmalloc(*numprompts * sizeof(char*)); 66 *echo_on = xmalloc(*numprompts * sizeof(u_int)); 67 (*echo_on)[0] = 0; 68 69 len = strlen(challenge) + strlen(SKEY_PROMPT) + 1; 70 p = xmalloc(len); 71 strlcpy(p, challenge, len); 72 strlcat(p, SKEY_PROMPT, len); 73 (*prompts)[0] = p; 74 75 return 0; 76} 77 78int 79skey_respond(void *ctx, u_int numresponses, char **responses) 80{ 81 Authctxt *authctxt = ctx; 82 83 if (authctxt->valid && 84 numresponses == 1 && 85 skey_haskey(authctxt->pw->pw_name) == 0 && 86 skey_passcheck(authctxt->pw->pw_name, responses[0]) != -1) 87 return 0; 88 return -1; 89} 90 91static void 92skey_free_ctx(void *ctx) 93{ 94 /* we don't have a special context */ 95} 96 97KbdintDevice skey_device = { 98 "skey", 99 skey_init_ctx, 100 skey_query, 101 skey_respond, 102 skey_free_ctx 103}; 104 105KbdintDevice mm_skey_device = { 106 "skey", 107 skey_init_ctx, 108 mm_skey_query, 109 mm_skey_respond, 110 skey_free_ctx 111}; 112#endif /* SKEY */ 113