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 * 20944f7098SBrian Somers * $Id: auth.c,v 1.14 1997/06/09 03:27:13 brian 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" 286ed9fb2fSBrian Somers #include "loadalias.h" 2953c9f6c0SAtsushi Murai #include "vars.h" 30ed6a16c1SPoul-Henning Kamp #include "filter.h" 3153c9f6c0SAtsushi Murai #include "auth.h" 32ed6a16c1SPoul-Henning Kamp #include "chat.h" 33af57ed9fSAtsushi Murai 34af57ed9fSAtsushi Murai extern FILE *OpenSecret(); 35af57ed9fSAtsushi Murai extern void CloseSecret(); 36af57ed9fSAtsushi Murai 3753c9f6c0SAtsushi Murai LOCAL_AUTH_VALID 38944f7098SBrian Somers LocalAuthInit() 39ed6a16c1SPoul-Henning Kamp { 4053c9f6c0SAtsushi Murai 4153c9f6c0SAtsushi Murai char *p; 4253c9f6c0SAtsushi Murai 4353c9f6c0SAtsushi Murai if (gethostname(VarShortHost, sizeof(VarShortHost))) { 4441db6564SAtsushi Murai return (NOT_FOUND); 4553c9f6c0SAtsushi Murai } 46ed6a16c1SPoul-Henning Kamp p = strchr(VarShortHost, '.'); 47ed6a16c1SPoul-Henning Kamp if (p) 4853c9f6c0SAtsushi Murai *p = '\0'; 4953c9f6c0SAtsushi Murai 5041db6564SAtsushi Murai VarLocalAuth = LOCAL_NO_AUTH; 5153c9f6c0SAtsushi Murai return LocalAuthValidate(SECRETFILE, VarShortHost, ""); 5253c9f6c0SAtsushi Murai 5353c9f6c0SAtsushi Murai } 5453c9f6c0SAtsushi Murai 5553c9f6c0SAtsushi Murai LOCAL_AUTH_VALID 56944f7098SBrian Somers LocalAuthValidate(char *fname, char *system, char *key) 57944f7098SBrian Somers { 5853c9f6c0SAtsushi Murai FILE *fp; 5953c9f6c0SAtsushi Murai int n; 6053c9f6c0SAtsushi Murai char *vector[20]; /* XXX */ 6153c9f6c0SAtsushi Murai char buff[200]; /* XXX */ 6253c9f6c0SAtsushi Murai LOCAL_AUTH_VALID rc; 6353c9f6c0SAtsushi Murai 6453c9f6c0SAtsushi Murai rc = NOT_FOUND; /* No system entry */ 6553c9f6c0SAtsushi Murai fp = OpenSecret(fname); 6653c9f6c0SAtsushi Murai if (fp == NULL) 6753c9f6c0SAtsushi Murai return (rc); 6853c9f6c0SAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 6953c9f6c0SAtsushi Murai if (buff[0] == '#') 7053c9f6c0SAtsushi Murai continue; 7153c9f6c0SAtsushi Murai buff[strlen(buff) - 1] = 0; 7253c9f6c0SAtsushi Murai bzero(vector, sizeof(vector)); 73e68d210eSBrian Somers n = MakeArgs(buff, vector, VECSIZE(vector)); 7453c9f6c0SAtsushi Murai if (n < 1) 7553c9f6c0SAtsushi Murai continue; 7653c9f6c0SAtsushi Murai if (strcmp(vector[0], system) == 0) { 7753c9f6c0SAtsushi Murai if (vector[1] != (char *) NULL && strcmp(vector[1], key) == 0) { 7853c9f6c0SAtsushi Murai rc = VALID; /* Valid */ 7953c9f6c0SAtsushi Murai } else { 8053c9f6c0SAtsushi Murai rc = INVALID; /* Invalid */ 8153c9f6c0SAtsushi Murai } 8253c9f6c0SAtsushi Murai break; 8353c9f6c0SAtsushi Murai } 8453c9f6c0SAtsushi Murai } 8553c9f6c0SAtsushi Murai CloseSecret(fp); 8653c9f6c0SAtsushi Murai return (rc); 8753c9f6c0SAtsushi Murai } 8853c9f6c0SAtsushi Murai 89af57ed9fSAtsushi Murai int 90944f7098SBrian Somers AuthValidate(char *fname, char *system, char *key) 91af57ed9fSAtsushi Murai { 92af57ed9fSAtsushi Murai FILE *fp; 93af57ed9fSAtsushi Murai int n; 94af57ed9fSAtsushi Murai char *vector[20]; 95af57ed9fSAtsushi Murai char buff[200]; 96af57ed9fSAtsushi Murai char passwd[100]; 97af57ed9fSAtsushi Murai 98af57ed9fSAtsushi Murai fp = OpenSecret(fname); 99af57ed9fSAtsushi Murai if (fp == NULL) 100af57ed9fSAtsushi Murai return (0); 101af57ed9fSAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 102af57ed9fSAtsushi Murai if (buff[0] == '#') 103af57ed9fSAtsushi Murai continue; 104af57ed9fSAtsushi Murai buff[strlen(buff) - 1] = 0; 105af57ed9fSAtsushi Murai bzero(vector, sizeof(vector)); 106e68d210eSBrian Somers n = MakeArgs(buff, vector, VECSIZE(vector)); 107af57ed9fSAtsushi Murai if (n < 2) 108af57ed9fSAtsushi Murai continue; 109af57ed9fSAtsushi Murai if (strcmp(vector[0], system) == 0) { 11099c02d39SWarner Losh ExpandString(vector[1], passwd, sizeof(passwd), 0); 111af57ed9fSAtsushi Murai if (strcmp(passwd, key) == 0) { 112af57ed9fSAtsushi Murai CloseSecret(fp); 113af57ed9fSAtsushi Murai bzero(&DefHisAddress, sizeof(DefHisAddress)); 114af57ed9fSAtsushi Murai n -= 2; 115af57ed9fSAtsushi Murai if (n > 0) { 116274e766cSBrian Somers if (ParseAddr(n--, &vector[2], 117274e766cSBrian Somers &DefHisAddress.ipaddr, 118274e766cSBrian Somers &DefHisAddress.mask, 119274e766cSBrian Somers &DefHisAddress.width) == 0) { 120274e766cSBrian Somers return (0); /* Invalid */ 121274e766cSBrian Somers } 122af57ed9fSAtsushi Murai } 123af57ed9fSAtsushi Murai IpcpInit(); 124af57ed9fSAtsushi Murai return (1); /* Valid */ 125af57ed9fSAtsushi Murai } 126af57ed9fSAtsushi Murai } 127af57ed9fSAtsushi Murai } 128af57ed9fSAtsushi Murai CloseSecret(fp); 129af57ed9fSAtsushi Murai return (0); /* Invalid */ 130af57ed9fSAtsushi Murai } 131af57ed9fSAtsushi Murai 132af57ed9fSAtsushi Murai char * 133944f7098SBrian Somers AuthGetSecret(char *fname, char *system, int len, int setaddr) 134af57ed9fSAtsushi Murai { 135af57ed9fSAtsushi Murai FILE *fp; 136af57ed9fSAtsushi Murai int n; 137af57ed9fSAtsushi Murai char *vector[20]; 138af57ed9fSAtsushi Murai char buff[200]; 139af57ed9fSAtsushi Murai static char passwd[100]; 140af57ed9fSAtsushi Murai 141af57ed9fSAtsushi Murai fp = OpenSecret(fname); 142af57ed9fSAtsushi Murai if (fp == NULL) 143af57ed9fSAtsushi Murai return (NULL); 144af57ed9fSAtsushi Murai while (fgets(buff, sizeof(buff), fp)) { 145af57ed9fSAtsushi Murai if (buff[0] == '#') 146af57ed9fSAtsushi Murai continue; 147af57ed9fSAtsushi Murai buff[strlen(buff) - 1] = 0; 148af57ed9fSAtsushi Murai bzero(vector, sizeof(vector)); 149e68d210eSBrian Somers n = MakeArgs(buff, vector, VECSIZE(vector)); 150af57ed9fSAtsushi Murai if (n < 2) 151af57ed9fSAtsushi Murai continue; 152af57ed9fSAtsushi Murai if (strlen(vector[0]) == len && strncmp(vector[0], system, len) == 0) { 15399c02d39SWarner Losh ExpandString(vector[1], passwd, sizeof(passwd), 0); 154af57ed9fSAtsushi Murai if (setaddr) { 155af57ed9fSAtsushi Murai bzero(&DefHisAddress, sizeof(DefHisAddress)); 156af57ed9fSAtsushi Murai } 157af57ed9fSAtsushi Murai n -= 2; 158af57ed9fSAtsushi Murai if (n > 0 && setaddr) { 159927145beSBrian Somers LogPrintf(LogDEBUG, "AuthGetSecret: n = %d, %s\n", n, vector[2]); 160274e766cSBrian Somers if (ParseAddr(n--, &vector[2], 161274e766cSBrian Somers &DefHisAddress.ipaddr, 162274e766cSBrian Somers &DefHisAddress.mask, 163274e766cSBrian Somers &DefHisAddress.width) != 0) 164af57ed9fSAtsushi Murai IpcpInit(); 165af57ed9fSAtsushi Murai } 166af57ed9fSAtsushi Murai return (passwd); 167af57ed9fSAtsushi Murai } 168af57ed9fSAtsushi Murai } 169af57ed9fSAtsushi Murai CloseSecret(fp); 170af57ed9fSAtsushi Murai return (NULL); /* Invalid */ 171af57ed9fSAtsushi Murai } 17253c9f6c0SAtsushi Murai 17353c9f6c0SAtsushi Murai static void 174944f7098SBrian Somers AuthTimeout(struct authinfo * authp) 17553c9f6c0SAtsushi Murai { 17653c9f6c0SAtsushi Murai struct pppTimer *tp; 17753c9f6c0SAtsushi Murai 17853c9f6c0SAtsushi Murai tp = &authp->authtimer; 17953c9f6c0SAtsushi Murai StopTimer(tp); 18053c9f6c0SAtsushi Murai if (--authp->retry > 0) { 18153c9f6c0SAtsushi Murai StartTimer(tp); 18253c9f6c0SAtsushi Murai (authp->ChallengeFunc) (++authp->id); 18353c9f6c0SAtsushi Murai } 18453c9f6c0SAtsushi Murai } 18553c9f6c0SAtsushi Murai 18653c9f6c0SAtsushi Murai void 187944f7098SBrian Somers StartAuthChallenge(struct authinfo * authp) 18853c9f6c0SAtsushi Murai { 18953c9f6c0SAtsushi Murai struct pppTimer *tp; 19053c9f6c0SAtsushi Murai 19153c9f6c0SAtsushi Murai tp = &authp->authtimer; 19253c9f6c0SAtsushi Murai StopTimer(tp); 19353c9f6c0SAtsushi Murai tp->func = AuthTimeout; 19453c9f6c0SAtsushi Murai tp->load = VarRetryTimeout * SECTICKS; 19553c9f6c0SAtsushi Murai tp->state = TIMER_STOPPED; 19653c9f6c0SAtsushi Murai tp->arg = (void *) authp; 19753c9f6c0SAtsushi Murai StartTimer(tp); 19853c9f6c0SAtsushi Murai authp->retry = 3; 19953c9f6c0SAtsushi Murai authp->id = 1; 20053c9f6c0SAtsushi Murai (authp->ChallengeFunc) (authp->id); 20153c9f6c0SAtsushi Murai } 20253c9f6c0SAtsushi Murai 20353c9f6c0SAtsushi Murai void 204944f7098SBrian Somers StopAuthTimer(struct authinfo * authp) 20553c9f6c0SAtsushi Murai { 20653c9f6c0SAtsushi Murai StopTimer(&authp->authtimer); 20753c9f6c0SAtsushi Murai } 208