xref: /freebsd/usr.sbin/ppp/auth.c (revision ed6a16c1817628e876636bd19662b56620f1a4f7)
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