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