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