1af57ed9fSAtsushi Murai /* 2af57ed9fSAtsushi Murai * PPP Secret Key Module 3af57ed9fSAtsushi Murai * 4af57ed9fSAtsushi Murai * Written by Toshiharu OHNO (tony-o@iij.ad.jp) 5af57ed9fSAtsushi Murai * 6af57ed9fSAtsushi Murai * Copyright (C) 1994, Internet Initiative Japan, Inc. All rights reserverd. 7af57ed9fSAtsushi Murai * 8af57ed9fSAtsushi Murai * Redistribution and use in source and binary forms are permitted 9af57ed9fSAtsushi Murai * provided that the above copyright notice and this paragraph are 10af57ed9fSAtsushi Murai * duplicated in all such forms and that any documentation, 11af57ed9fSAtsushi Murai * advertising materials, and other materials related to such 12af57ed9fSAtsushi Murai * distribution and use acknowledge that the software was developed 13af57ed9fSAtsushi Murai * by the Internet Initiative Japan, Inc. The name of the 14af57ed9fSAtsushi Murai * IIJ may not be used to endorse or promote products derived 15af57ed9fSAtsushi Murai * from this software without specific prior written permission. 16af57ed9fSAtsushi Murai * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 17af57ed9fSAtsushi Murai * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 18af57ed9fSAtsushi Murai * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 19af57ed9fSAtsushi Murai * 20b6e82f33SBrian Somers * $Id: auth.c,v 1.23 1997/11/17 00:42:37 brian Exp $ 21af57ed9fSAtsushi Murai * 22af57ed9fSAtsushi Murai * TODO: 23c3899f8dSAtsushi Murai * o Implement check against with registered IP addresses. 24af57ed9fSAtsushi Murai */ 2575240ed1SBrian Somers #include <sys/param.h> 2675240ed1SBrian Somers #include <netinet/in.h> 2775240ed1SBrian Somers 2875240ed1SBrian Somers #include <stdio.h> 2975240ed1SBrian Somers #include <string.h> 3075240ed1SBrian Somers #include <unistd.h> 3175240ed1SBrian Somers 32b6e82f33SBrian Somers #include "command.h" 3375240ed1SBrian Somers #include "mbuf.h" 3475240ed1SBrian Somers #include "log.h" 3575240ed1SBrian Somers #include "defs.h" 3675240ed1SBrian Somers #include "timer.h" 37af57ed9fSAtsushi Murai #include "fsm.h" 3853c9f6c0SAtsushi Murai #include "lcpproto.h" 39af57ed9fSAtsushi Murai #include "ipcp.h" 406ed9fb2fSBrian Somers #include "loadalias.h" 4153c9f6c0SAtsushi Murai #include "vars.h" 42ed6a16c1SPoul-Henning Kamp #include "filter.h" 4353c9f6c0SAtsushi Murai #include "auth.h" 44ed6a16c1SPoul-Henning Kamp #include "chat.h" 4575240ed1SBrian Somers #include "systems.h" 46af57ed9fSAtsushi Murai 47683cef3cSBrian Somers void 48944f7098SBrian Somers LocalAuthInit() 49ed6a16c1SPoul-Henning Kamp { 5012ef29a8SBrian Somers if (!(mode&MODE_DAEMON)) 5112ef29a8SBrian Somers /* We're allowed in interactive mode */ 52d40f8a5aSBrian Somers VarLocalAuth = LOCAL_AUTH; 538ea8442cSBrian Somers else if (VarHaveLocalAuthKey) 548ea8442cSBrian Somers VarLocalAuth = *VarLocalAuthKey == '\0' ? LOCAL_AUTH : LOCAL_NO_AUTH; 55d40f8a5aSBrian Somers else 56d025849cSBrian Somers switch (LocalAuthValidate(SECRETFILE, VarShortHost, "")) { 57d025849cSBrian Somers case NOT_FOUND: 58d025849cSBrian Somers VarLocalAuth = LOCAL_DENY; 59d025849cSBrian Somers break; 60d025849cSBrian Somers case VALID: 61d025849cSBrian Somers VarLocalAuth = LOCAL_AUTH; 62d025849cSBrian Somers break; 63d025849cSBrian Somers case INVALID: 64d025849cSBrian Somers VarLocalAuth = LOCAL_NO_AUTH; 65d025849cSBrian Somers break; 66d025849cSBrian Somers } 6753c9f6c0SAtsushi Murai } 6853c9f6c0SAtsushi Murai 6953c9f6c0SAtsushi Murai LOCAL_AUTH_VALID 70b6e82f33SBrian Somers LocalAuthValidate(const char *fname, const char *system, const char *key) 71944f7098SBrian Somers { 7253c9f6c0SAtsushi Murai FILE *fp; 7353c9f6c0SAtsushi Murai int n; 74683cef3cSBrian Somers char *vector[3]; 7586e02934SBrian Somers char buff[LINE_LEN]; 7653c9f6c0SAtsushi Murai LOCAL_AUTH_VALID rc; 7753c9f6c0SAtsushi Murai 7853c9f6c0SAtsushi Murai rc = NOT_FOUND; /* No system entry */ 7953c9f6c0SAtsushi Murai fp = OpenSecret(fname); 8053c9f6c0SAtsushi Murai if (fp == NULL) 8153c9f6c0SAtsushi Murai return (rc); 8253c9f6c0SAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 8353c9f6c0SAtsushi Murai if (buff[0] == '#') 8453c9f6c0SAtsushi Murai continue; 8553c9f6c0SAtsushi Murai buff[strlen(buff) - 1] = 0; 8675240ed1SBrian Somers memset(vector, '\0', sizeof(vector)); 87e68d210eSBrian Somers n = MakeArgs(buff, vector, VECSIZE(vector)); 8853c9f6c0SAtsushi Murai if (n < 1) 8953c9f6c0SAtsushi Murai continue; 9053c9f6c0SAtsushi Murai if (strcmp(vector[0], system) == 0) { 91683cef3cSBrian Somers if ((vector[1] == (char *) NULL && (key == NULL || *key == '\0')) || 92683cef3cSBrian Somers (vector[1] != (char *) NULL && strcmp(vector[1], key) == 0)) { 9353c9f6c0SAtsushi Murai rc = VALID; /* Valid */ 9453c9f6c0SAtsushi Murai } else { 9553c9f6c0SAtsushi Murai rc = INVALID; /* Invalid */ 9653c9f6c0SAtsushi Murai } 9753c9f6c0SAtsushi Murai break; 9853c9f6c0SAtsushi Murai } 9953c9f6c0SAtsushi Murai } 10053c9f6c0SAtsushi Murai CloseSecret(fp); 10153c9f6c0SAtsushi Murai return (rc); 10253c9f6c0SAtsushi Murai } 10353c9f6c0SAtsushi Murai 104af57ed9fSAtsushi Murai int 105b6e82f33SBrian Somers AuthValidate(const char *fname, const char *system, const char *key) 106af57ed9fSAtsushi Murai { 107af57ed9fSAtsushi Murai FILE *fp; 108af57ed9fSAtsushi Murai int n; 109683cef3cSBrian Somers char *vector[4]; 11086e02934SBrian Somers char buff[LINE_LEN]; 111af57ed9fSAtsushi Murai char passwd[100]; 112af57ed9fSAtsushi Murai 113af57ed9fSAtsushi Murai fp = OpenSecret(fname); 114af57ed9fSAtsushi Murai if (fp == NULL) 115af57ed9fSAtsushi Murai return (0); 116af57ed9fSAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 117af57ed9fSAtsushi Murai if (buff[0] == '#') 118af57ed9fSAtsushi Murai continue; 119af57ed9fSAtsushi Murai buff[strlen(buff) - 1] = 0; 12075240ed1SBrian Somers memset(vector, '\0', sizeof(vector)); 121e68d210eSBrian Somers n = MakeArgs(buff, vector, VECSIZE(vector)); 122af57ed9fSAtsushi Murai if (n < 2) 123af57ed9fSAtsushi Murai continue; 124af57ed9fSAtsushi Murai if (strcmp(vector[0], system) == 0) { 12599c02d39SWarner Losh ExpandString(vector[1], passwd, sizeof(passwd), 0); 126af57ed9fSAtsushi Murai if (strcmp(passwd, key) == 0) { 127af57ed9fSAtsushi Murai CloseSecret(fp); 12875240ed1SBrian Somers memset(&DefHisAddress, '\0', sizeof(DefHisAddress)); 129af57ed9fSAtsushi Murai n -= 2; 130af57ed9fSAtsushi Murai if (n > 0) { 131b6e82f33SBrian Somers if (ParseAddr(n--, (char const *const *)(vector+2), 132274e766cSBrian Somers &DefHisAddress.ipaddr, 133274e766cSBrian Somers &DefHisAddress.mask, 134274e766cSBrian Somers &DefHisAddress.width) == 0) { 135274e766cSBrian Somers return (0); /* Invalid */ 136274e766cSBrian Somers } 137af57ed9fSAtsushi Murai } 138af57ed9fSAtsushi Murai IpcpInit(); 139af57ed9fSAtsushi Murai return (1); /* Valid */ 140af57ed9fSAtsushi Murai } 141af57ed9fSAtsushi Murai } 142af57ed9fSAtsushi Murai } 143af57ed9fSAtsushi Murai CloseSecret(fp); 144af57ed9fSAtsushi Murai return (0); /* Invalid */ 145af57ed9fSAtsushi Murai } 146af57ed9fSAtsushi Murai 147af57ed9fSAtsushi Murai char * 148b6e82f33SBrian Somers AuthGetSecret(const char *fname, const char *system, int len, int setaddr) 149af57ed9fSAtsushi Murai { 150af57ed9fSAtsushi Murai FILE *fp; 151af57ed9fSAtsushi Murai int n; 152683cef3cSBrian Somers char *vector[4]; 15386e02934SBrian Somers char buff[LINE_LEN]; 154af57ed9fSAtsushi Murai static char passwd[100]; 155af57ed9fSAtsushi Murai 156af57ed9fSAtsushi Murai fp = OpenSecret(fname); 157af57ed9fSAtsushi Murai if (fp == NULL) 158af57ed9fSAtsushi Murai return (NULL); 159af57ed9fSAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 160af57ed9fSAtsushi Murai if (buff[0] == '#') 161af57ed9fSAtsushi Murai continue; 162af57ed9fSAtsushi Murai buff[strlen(buff) - 1] = 0; 16375240ed1SBrian Somers memset(vector, '\0', sizeof(vector)); 164e68d210eSBrian Somers n = MakeArgs(buff, vector, VECSIZE(vector)); 165af57ed9fSAtsushi Murai if (n < 2) 166af57ed9fSAtsushi Murai continue; 167af57ed9fSAtsushi Murai if (strlen(vector[0]) == len && strncmp(vector[0], system, len) == 0) { 16899c02d39SWarner Losh ExpandString(vector[1], passwd, sizeof(passwd), 0); 169af57ed9fSAtsushi Murai if (setaddr) { 17075240ed1SBrian Somers memset(&DefHisAddress, '\0', sizeof(DefHisAddress)); 171af57ed9fSAtsushi Murai } 172af57ed9fSAtsushi Murai n -= 2; 173af57ed9fSAtsushi Murai if (n > 0 && setaddr) { 174927145beSBrian Somers LogPrintf(LogDEBUG, "AuthGetSecret: n = %d, %s\n", n, vector[2]); 175b6e82f33SBrian Somers if (ParseAddr(n--, (char const *const *)(vector+2), 176274e766cSBrian Somers &DefHisAddress.ipaddr, 177274e766cSBrian Somers &DefHisAddress.mask, 178274e766cSBrian Somers &DefHisAddress.width) != 0) 179af57ed9fSAtsushi Murai IpcpInit(); 180af57ed9fSAtsushi Murai } 181af57ed9fSAtsushi Murai return (passwd); 182af57ed9fSAtsushi Murai } 183af57ed9fSAtsushi Murai } 184af57ed9fSAtsushi Murai CloseSecret(fp); 185af57ed9fSAtsushi Murai return (NULL); /* Invalid */ 186af57ed9fSAtsushi Murai } 18753c9f6c0SAtsushi Murai 18853c9f6c0SAtsushi Murai static void 189b6e82f33SBrian Somers AuthTimeout(void *vauthp) 19053c9f6c0SAtsushi Murai { 19153c9f6c0SAtsushi Murai struct pppTimer *tp; 192b6e82f33SBrian Somers struct authinfo *authp = (struct authinfo *)vauthp; 19353c9f6c0SAtsushi Murai 19453c9f6c0SAtsushi Murai tp = &authp->authtimer; 19553c9f6c0SAtsushi Murai StopTimer(tp); 19653c9f6c0SAtsushi Murai if (--authp->retry > 0) { 19753c9f6c0SAtsushi Murai StartTimer(tp); 19853c9f6c0SAtsushi Murai (authp->ChallengeFunc) (++authp->id); 19953c9f6c0SAtsushi Murai } 20053c9f6c0SAtsushi Murai } 20153c9f6c0SAtsushi Murai 20253c9f6c0SAtsushi Murai void 203944f7098SBrian Somers StartAuthChallenge(struct authinfo *authp) 20453c9f6c0SAtsushi Murai { 20553c9f6c0SAtsushi Murai struct pppTimer *tp; 20653c9f6c0SAtsushi Murai 20753c9f6c0SAtsushi Murai tp = &authp->authtimer; 20853c9f6c0SAtsushi Murai StopTimer(tp); 20953c9f6c0SAtsushi Murai tp->func = AuthTimeout; 21053c9f6c0SAtsushi Murai tp->load = VarRetryTimeout * SECTICKS; 21153c9f6c0SAtsushi Murai tp->state = TIMER_STOPPED; 21253c9f6c0SAtsushi Murai tp->arg = (void *) authp; 21353c9f6c0SAtsushi Murai StartTimer(tp); 21453c9f6c0SAtsushi Murai authp->retry = 3; 21553c9f6c0SAtsushi Murai authp->id = 1; 21653c9f6c0SAtsushi Murai (authp->ChallengeFunc) (authp->id); 21753c9f6c0SAtsushi Murai } 21853c9f6c0SAtsushi Murai 21953c9f6c0SAtsushi Murai void 220944f7098SBrian Somers StopAuthTimer(struct authinfo *authp) 22153c9f6c0SAtsushi Murai { 22253c9f6c0SAtsushi Murai StopTimer(&authp->authtimer); 22353c9f6c0SAtsushi Murai } 224