auth.c revision 8857
16059Samurai/* 26059Samurai * PPP Secret Key Module 36059Samurai * 46059Samurai * Written by Toshiharu OHNO (tony-o@iij.ad.jp) 56059Samurai * 66059Samurai * Copyright (C) 1994, Internet Initiative Japan, Inc. All rights reserverd. 76059Samurai * 86059Samurai * Redistribution and use in source and binary forms are permitted 96059Samurai * provided that the above copyright notice and this paragraph are 106059Samurai * duplicated in all such forms and that any documentation, 116059Samurai * advertising materials, and other materials related to such 126059Samurai * distribution and use acknowledge that the software was developed 136059Samurai * by the Internet Initiative Japan, Inc. The name of the 146059Samurai * IIJ may not be used to endorse or promote products derived 156059Samurai * from this software without specific prior written permission. 166059Samurai * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 176059Samurai * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 186059Samurai * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 198857Srgrimes * 208857Srgrimes * $Id: auth.c,v 1.3 1995/02/27 10:57:38 amurai Exp $ 218857Srgrimes * 226059Samurai * TODO: 236059Samurai * o Imprement check against with registerd IP addresses. 246059Samurai */ 256059Samurai#include "fsm.h" 266735Samurai#include "lcpproto.h" 276059Samurai#include "ipcp.h" 286735Samurai#include "vars.h" 296735Samurai#include "auth.h" 306059Samurai 316059Samuraiextern FILE *OpenSecret(); 326059Samuraiextern void CloseSecret(); 336059Samurai 346735SamuraiLOCAL_AUTH_VALID 356735SamuraiLocalAuthInit(void){ 366735Samurai 376735Samurai char *p; 386764Samurai 396735Samurai if ( gethostname( VarShortHost, sizeof(VarShortHost))) { 406764Samurai return(NOT_FOUND); 416735Samurai } 426735Samurai if ( p = strchr( VarShortHost, '.' ) ) 436735Samurai *p = '\0'; 446735Samurai 456764Samurai VarLocalAuth = LOCAL_NO_AUTH; 466735Samurai return LocalAuthValidate( SECRETFILE, VarShortHost, "" ); 476735Samurai 486735Samurai} 496735Samurai 506735SamuraiLOCAL_AUTH_VALID 516735SamuraiLocalAuthValidate( char *fname, char *system, char *key) { 526735Samurai FILE *fp; 536735Samurai int n; 546735Samurai char *vector[20]; /* XXX */ 556735Samurai char buff[200]; /* XXX */ 566735Samurai LOCAL_AUTH_VALID rc; 576735Samurai 586735Samurai rc = NOT_FOUND; /* No system entry */ 596735Samurai fp = OpenSecret(fname); 606735Samurai if (fp == NULL) 616735Samurai return( rc ); 626735Samurai while (fgets(buff, sizeof(buff), fp)) { 636735Samurai if (buff[0] == '#') 646735Samurai continue; 656735Samurai buff[strlen(buff)-1] = 0; 666735Samurai bzero(vector, sizeof(vector)); 676735Samurai n = MakeArgs(buff, &vector); 686735Samurai if (n < 1) 696735Samurai continue; 706735Samurai if (strcmp(vector[0], system) == 0) { 716735Samurai if ( vector[1] != (char *) NULL && strcmp(vector[1], key) == 0) { 726735Samurai rc = VALID; /* Valid */ 736735Samurai } else { 746735Samurai rc = INVALID; /* Invalid */ 756735Samurai } 766735Samurai break; 776735Samurai } 786735Samurai } 796735Samurai CloseSecret(fp); 806735Samurai return( rc ); 816735Samurai} 826735Samurai 836059Samuraiint 846059SamuraiAuthValidate(fname, system, key) 856059Samuraichar *fname, *system, *key; 866059Samurai{ 876059Samurai FILE *fp; 886059Samurai int n; 896059Samurai char *vector[20]; 906059Samurai char buff[200]; 916059Samurai char passwd[100]; 926059Samurai 936059Samurai fp = OpenSecret(fname); 946059Samurai if (fp == NULL) 956059Samurai return(0); 966059Samurai while (fgets(buff, sizeof(buff), fp)) { 976059Samurai if (buff[0] == '#') 986059Samurai continue; 996059Samurai buff[strlen(buff)-1] = 0; 1006059Samurai bzero(vector, sizeof(vector)); 1016059Samurai n = MakeArgs(buff, &vector); 1026059Samurai if (n < 2) 1036059Samurai continue; 1046059Samurai if (strcmp(vector[0], system) == 0) { 1056059Samurai ExpandString(vector[1], passwd, 0); 1066059Samurai if (strcmp(passwd, key) == 0) { 1076059Samurai CloseSecret(fp); 1086059Samurai bzero(&DefHisAddress, sizeof(DefHisAddress)); 1096059Samurai n -= 2; 1106059Samurai if (n > 0) { 1116059Samurai ParseAddr(n--, &vector[2], 1126059Samurai &DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width); 1136059Samurai } 1146059Samurai IpcpInit(); 1156059Samurai return(1); /* Valid */ 1166059Samurai } 1176059Samurai } 1186059Samurai } 1196059Samurai CloseSecret(fp); 1206059Samurai return(0); /* Invalid */ 1216059Samurai} 1226059Samurai 1236059Samuraichar * 1246059SamuraiAuthGetSecret(fname, system, len, setaddr) 1256059Samuraichar *fname, *system; 1266059Samuraiint len, setaddr; 1276059Samurai{ 1286059Samurai FILE *fp; 1296059Samurai int n; 1306059Samurai char *vector[20]; 1316059Samurai char buff[200]; 1326059Samurai static char passwd[100]; 1336059Samurai 1346059Samurai fp = OpenSecret(fname); 1356059Samurai if (fp == NULL) 1366059Samurai return(NULL); 1376059Samurai while (fgets(buff, sizeof(buff), fp)) { 1386059Samurai if (buff[0] == '#') 1396059Samurai continue; 1406059Samurai buff[strlen(buff)-1] = 0; 1416059Samurai bzero(vector, sizeof(vector)); 1426059Samurai n = MakeArgs(buff, &vector); 1436059Samurai if (n < 2) 1446059Samurai continue; 1456059Samurai if (strlen(vector[0]) == len && strncmp(vector[0], system, len) == 0) { 1466059Samurai ExpandString(vector[1], passwd, 0); 1476059Samurai if (setaddr) { 1486059Samurai bzero(&DefHisAddress, sizeof(DefHisAddress)); 1496059Samurai } 1506059Samurai n -= 2; 1516059Samurai if (n > 0 && setaddr) { 1526059Samurai#ifdef DEBUG 1536059Samurai LogPrintf(LOG_LCP, "*** n = %d, %s\n", n, vector[2]); 1546059Samurai#endif 1556059Samurai ParseAddr(n--, &vector[2], 1566059Samurai &DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width); 1576059Samurai IpcpInit(); 1586059Samurai } 1596059Samurai return(passwd); 1606059Samurai } 1616059Samurai } 1626059Samurai CloseSecret(fp); 1636059Samurai return(NULL); /* Invalid */ 1646059Samurai} 1656735Samurai 1666735Samuraistatic void 1676735SamuraiAuthTimeout(authp) 1686735Samuraistruct authinfo *authp; 1696735Samurai{ 1706735Samurai struct pppTimer *tp; 1716735Samurai 1726735Samurai tp = &authp->authtimer; 1736735Samurai StopTimer(tp); 1746735Samurai if (--authp->retry > 0) { 1756735Samurai StartTimer(tp); 1766735Samurai (authp->ChallengeFunc)(++authp->id); 1776735Samurai } 1786735Samurai} 1796735Samurai 1806735Samuraivoid 1816735SamuraiStartAuthChallenge(authp) 1826735Samuraistruct authinfo *authp; 1836735Samurai{ 1846735Samurai struct pppTimer *tp; 1856735Samurai 1866735Samurai tp = &authp->authtimer; 1876735Samurai StopTimer(tp); 1886735Samurai tp->func = AuthTimeout; 1896735Samurai tp->load = VarRetryTimeout * SECTICKS; 1906735Samurai tp->state = TIMER_STOPPED; 1916735Samurai tp->arg = (void *)authp; 1926735Samurai StartTimer(tp); 1936735Samurai authp->retry = 3; 1946735Samurai authp->id = 1; 1956735Samurai (authp->ChallengeFunc)(authp->id); 1966735Samurai} 1976735Samurai 1986735Samuraivoid 1996735SamuraiStopAuthTimer(authp) 2006735Samuraistruct authinfo *authp; 2016735Samurai{ 2026735Samurai StopTimer(&authp->authtimer); 2036735Samurai} 204