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 * 20ed6a16c1SPoul-Henning Kamp * $Id: auth.c,v 1.5 1995/09/02 17:20:49 amurai Exp $ 21af57ed9fSAtsushi Murai * 22af57ed9fSAtsushi Murai * TODO: 23c3899f8dSAtsushi Murai * o Implement check against with registered IP addresses. 24af57ed9fSAtsushi Murai */ 25af57ed9fSAtsushi Murai #include "fsm.h" 2653c9f6c0SAtsushi Murai #include "lcpproto.h" 27af57ed9fSAtsushi Murai #include "ipcp.h" 2853c9f6c0SAtsushi Murai #include "vars.h" 29ed6a16c1SPoul-Henning Kamp #include "filter.h" 3053c9f6c0SAtsushi Murai #include "auth.h" 31ed6a16c1SPoul-Henning Kamp #include "chat.h" 32af57ed9fSAtsushi Murai 33af57ed9fSAtsushi Murai extern FILE *OpenSecret(); 34af57ed9fSAtsushi Murai extern void CloseSecret(); 35af57ed9fSAtsushi Murai 3653c9f6c0SAtsushi Murai LOCAL_AUTH_VALID 37ed6a16c1SPoul-Henning Kamp LocalAuthInit(void) 38ed6a16c1SPoul-Henning Kamp { 3953c9f6c0SAtsushi Murai 4053c9f6c0SAtsushi Murai char *p; 4153c9f6c0SAtsushi Murai 4253c9f6c0SAtsushi Murai if ( gethostname( VarShortHost, sizeof(VarShortHost))) { 4341db6564SAtsushi Murai return(NOT_FOUND); 4453c9f6c0SAtsushi Murai } 45ed6a16c1SPoul-Henning Kamp p = strchr( VarShortHost, '.' ); 46ed6a16c1SPoul-Henning Kamp if (p) 4753c9f6c0SAtsushi Murai *p = '\0'; 4853c9f6c0SAtsushi Murai 4941db6564SAtsushi Murai VarLocalAuth = LOCAL_NO_AUTH; 5053c9f6c0SAtsushi Murai return LocalAuthValidate( SECRETFILE, VarShortHost, "" ); 5153c9f6c0SAtsushi Murai 5253c9f6c0SAtsushi Murai } 5353c9f6c0SAtsushi Murai 5453c9f6c0SAtsushi Murai LOCAL_AUTH_VALID 5553c9f6c0SAtsushi Murai LocalAuthValidate( char *fname, char *system, char *key) { 5653c9f6c0SAtsushi Murai FILE *fp; 5753c9f6c0SAtsushi Murai int n; 5853c9f6c0SAtsushi Murai char *vector[20]; /* XXX */ 5953c9f6c0SAtsushi Murai char buff[200]; /* XXX */ 6053c9f6c0SAtsushi Murai LOCAL_AUTH_VALID rc; 6153c9f6c0SAtsushi Murai 6253c9f6c0SAtsushi Murai rc = NOT_FOUND; /* No system entry */ 6353c9f6c0SAtsushi Murai fp = OpenSecret(fname); 6453c9f6c0SAtsushi Murai if (fp == NULL) 6553c9f6c0SAtsushi Murai return( rc ); 6653c9f6c0SAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 6753c9f6c0SAtsushi Murai if (buff[0] == '#') 6853c9f6c0SAtsushi Murai continue; 6953c9f6c0SAtsushi Murai buff[strlen(buff)-1] = 0; 7053c9f6c0SAtsushi Murai bzero(vector, sizeof(vector)); 71ed6a16c1SPoul-Henning Kamp n = MakeArgs(buff, vector); 7253c9f6c0SAtsushi Murai if (n < 1) 7353c9f6c0SAtsushi Murai continue; 7453c9f6c0SAtsushi Murai if (strcmp(vector[0], system) == 0) { 7553c9f6c0SAtsushi Murai if ( vector[1] != (char *) NULL && strcmp(vector[1], key) == 0) { 7653c9f6c0SAtsushi Murai rc = VALID; /* Valid */ 7753c9f6c0SAtsushi Murai } else { 7853c9f6c0SAtsushi Murai rc = INVALID; /* Invalid */ 7953c9f6c0SAtsushi Murai } 8053c9f6c0SAtsushi Murai break; 8153c9f6c0SAtsushi Murai } 8253c9f6c0SAtsushi Murai } 8353c9f6c0SAtsushi Murai CloseSecret(fp); 8453c9f6c0SAtsushi Murai return( rc ); 8553c9f6c0SAtsushi Murai } 8653c9f6c0SAtsushi Murai 87af57ed9fSAtsushi Murai int 88af57ed9fSAtsushi Murai AuthValidate(fname, system, key) 89af57ed9fSAtsushi Murai char *fname, *system, *key; 90af57ed9fSAtsushi Murai { 91af57ed9fSAtsushi Murai FILE *fp; 92af57ed9fSAtsushi Murai int n; 93af57ed9fSAtsushi Murai char *vector[20]; 94af57ed9fSAtsushi Murai char buff[200]; 95af57ed9fSAtsushi Murai char passwd[100]; 96af57ed9fSAtsushi Murai 97af57ed9fSAtsushi Murai fp = OpenSecret(fname); 98af57ed9fSAtsushi Murai if (fp == NULL) 99af57ed9fSAtsushi Murai return(0); 100af57ed9fSAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 101af57ed9fSAtsushi Murai if (buff[0] == '#') 102af57ed9fSAtsushi Murai continue; 103af57ed9fSAtsushi Murai buff[strlen(buff)-1] = 0; 104af57ed9fSAtsushi Murai bzero(vector, sizeof(vector)); 105ed6a16c1SPoul-Henning Kamp n = MakeArgs(buff, vector); 106af57ed9fSAtsushi Murai if (n < 2) 107af57ed9fSAtsushi Murai continue; 108af57ed9fSAtsushi Murai if (strcmp(vector[0], system) == 0) { 109af57ed9fSAtsushi Murai ExpandString(vector[1], passwd, 0); 110af57ed9fSAtsushi Murai if (strcmp(passwd, key) == 0) { 111af57ed9fSAtsushi Murai CloseSecret(fp); 112af57ed9fSAtsushi Murai bzero(&DefHisAddress, sizeof(DefHisAddress)); 113af57ed9fSAtsushi Murai n -= 2; 114af57ed9fSAtsushi Murai if (n > 0) { 115af57ed9fSAtsushi Murai ParseAddr(n--, &vector[2], 116af57ed9fSAtsushi Murai &DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width); 117af57ed9fSAtsushi Murai } 118af57ed9fSAtsushi Murai IpcpInit(); 119af57ed9fSAtsushi Murai return(1); /* Valid */ 120af57ed9fSAtsushi Murai } 121af57ed9fSAtsushi Murai } 122af57ed9fSAtsushi Murai } 123af57ed9fSAtsushi Murai CloseSecret(fp); 124af57ed9fSAtsushi Murai return(0); /* Invalid */ 125af57ed9fSAtsushi Murai } 126af57ed9fSAtsushi Murai 127af57ed9fSAtsushi Murai char * 128af57ed9fSAtsushi Murai AuthGetSecret(fname, system, len, setaddr) 129af57ed9fSAtsushi Murai char *fname, *system; 130af57ed9fSAtsushi Murai int len, setaddr; 131af57ed9fSAtsushi Murai { 132af57ed9fSAtsushi Murai FILE *fp; 133af57ed9fSAtsushi Murai int n; 134af57ed9fSAtsushi Murai char *vector[20]; 135af57ed9fSAtsushi Murai char buff[200]; 136af57ed9fSAtsushi Murai static char passwd[100]; 137af57ed9fSAtsushi Murai 138af57ed9fSAtsushi Murai fp = OpenSecret(fname); 139af57ed9fSAtsushi Murai if (fp == NULL) 140af57ed9fSAtsushi Murai return(NULL); 141af57ed9fSAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 142af57ed9fSAtsushi Murai if (buff[0] == '#') 143af57ed9fSAtsushi Murai continue; 144af57ed9fSAtsushi Murai buff[strlen(buff)-1] = 0; 145af57ed9fSAtsushi Murai bzero(vector, sizeof(vector)); 146ed6a16c1SPoul-Henning Kamp n = MakeArgs(buff, vector); 147af57ed9fSAtsushi Murai if (n < 2) 148af57ed9fSAtsushi Murai continue; 149af57ed9fSAtsushi Murai if (strlen(vector[0]) == len && strncmp(vector[0], system, len) == 0) { 150af57ed9fSAtsushi Murai ExpandString(vector[1], passwd, 0); 151af57ed9fSAtsushi Murai if (setaddr) { 152af57ed9fSAtsushi Murai bzero(&DefHisAddress, sizeof(DefHisAddress)); 153af57ed9fSAtsushi Murai } 154af57ed9fSAtsushi Murai n -= 2; 155af57ed9fSAtsushi Murai if (n > 0 && setaddr) { 156af57ed9fSAtsushi Murai #ifdef DEBUG 157af57ed9fSAtsushi Murai LogPrintf(LOG_LCP, "*** n = %d, %s\n", n, vector[2]); 158af57ed9fSAtsushi Murai #endif 159af57ed9fSAtsushi Murai ParseAddr(n--, &vector[2], 160af57ed9fSAtsushi Murai &DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width); 161af57ed9fSAtsushi Murai IpcpInit(); 162af57ed9fSAtsushi Murai } 163af57ed9fSAtsushi Murai return(passwd); 164af57ed9fSAtsushi Murai } 165af57ed9fSAtsushi Murai } 166af57ed9fSAtsushi Murai CloseSecret(fp); 167af57ed9fSAtsushi Murai return(NULL); /* Invalid */ 168af57ed9fSAtsushi Murai } 16953c9f6c0SAtsushi Murai 17053c9f6c0SAtsushi Murai static void 17153c9f6c0SAtsushi Murai AuthTimeout(authp) 17253c9f6c0SAtsushi Murai struct authinfo *authp; 17353c9f6c0SAtsushi Murai { 17453c9f6c0SAtsushi Murai struct pppTimer *tp; 17553c9f6c0SAtsushi Murai 17653c9f6c0SAtsushi Murai tp = &authp->authtimer; 17753c9f6c0SAtsushi Murai StopTimer(tp); 17853c9f6c0SAtsushi Murai if (--authp->retry > 0) { 17953c9f6c0SAtsushi Murai StartTimer(tp); 18053c9f6c0SAtsushi Murai (authp->ChallengeFunc)(++authp->id); 18153c9f6c0SAtsushi Murai } 18253c9f6c0SAtsushi Murai } 18353c9f6c0SAtsushi Murai 18453c9f6c0SAtsushi Murai void 18553c9f6c0SAtsushi Murai StartAuthChallenge(authp) 18653c9f6c0SAtsushi Murai struct authinfo *authp; 18753c9f6c0SAtsushi Murai { 18853c9f6c0SAtsushi Murai struct pppTimer *tp; 18953c9f6c0SAtsushi Murai 19053c9f6c0SAtsushi Murai tp = &authp->authtimer; 19153c9f6c0SAtsushi Murai StopTimer(tp); 19253c9f6c0SAtsushi Murai tp->func = AuthTimeout; 19353c9f6c0SAtsushi Murai tp->load = VarRetryTimeout * SECTICKS; 19453c9f6c0SAtsushi Murai tp->state = TIMER_STOPPED; 19553c9f6c0SAtsushi Murai tp->arg = (void *)authp; 19653c9f6c0SAtsushi Murai StartTimer(tp); 19753c9f6c0SAtsushi Murai authp->retry = 3; 19853c9f6c0SAtsushi Murai authp->id = 1; 19953c9f6c0SAtsushi Murai (authp->ChallengeFunc)(authp->id); 20053c9f6c0SAtsushi Murai } 20153c9f6c0SAtsushi Murai 20253c9f6c0SAtsushi Murai void 20353c9f6c0SAtsushi Murai StopAuthTimer(authp) 20453c9f6c0SAtsushi Murai struct authinfo *authp; 20553c9f6c0SAtsushi Murai { 20653c9f6c0SAtsushi Murai StopTimer(&authp->authtimer); 20753c9f6c0SAtsushi Murai } 208