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