xref: /freebsd/usr.sbin/ppp/auth.c (revision af57ed9fdcc4e2a81940fc2243c0d3949fc0e00f)
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  *
20af57ed9fSAtsushi Murai  * $Id:$
21af57ed9fSAtsushi Murai  *
22af57ed9fSAtsushi Murai  *	TODO:
23af57ed9fSAtsushi Murai  *		o Imprement check against with registerd IP addresses.
24af57ed9fSAtsushi Murai  */
25af57ed9fSAtsushi Murai #include "fsm.h"
26af57ed9fSAtsushi Murai #include "ipcp.h"
27af57ed9fSAtsushi Murai 
28af57ed9fSAtsushi Murai extern FILE *OpenSecret();
29af57ed9fSAtsushi Murai extern void CloseSecret();
30af57ed9fSAtsushi Murai 
31af57ed9fSAtsushi Murai int
32af57ed9fSAtsushi Murai AuthValidate(fname, system, key)
33af57ed9fSAtsushi Murai char *fname, *system, *key;
34af57ed9fSAtsushi Murai {
35af57ed9fSAtsushi Murai   FILE *fp;
36af57ed9fSAtsushi Murai   int n;
37af57ed9fSAtsushi Murai   char *vector[20];
38af57ed9fSAtsushi Murai   char buff[200];
39af57ed9fSAtsushi Murai   char passwd[100];
40af57ed9fSAtsushi Murai 
41af57ed9fSAtsushi Murai   fp = OpenSecret(fname);
42af57ed9fSAtsushi Murai   if (fp == NULL)
43af57ed9fSAtsushi Murai     return(0);
44af57ed9fSAtsushi Murai   while (fgets(buff, sizeof(buff), fp)) {
45af57ed9fSAtsushi Murai     if (buff[0] == '#')
46af57ed9fSAtsushi Murai       continue;
47af57ed9fSAtsushi Murai     buff[strlen(buff)-1] = 0;
48af57ed9fSAtsushi Murai     bzero(vector, sizeof(vector));
49af57ed9fSAtsushi Murai     n = MakeArgs(buff, &vector);
50af57ed9fSAtsushi Murai     if (n < 2)
51af57ed9fSAtsushi Murai       continue;
52af57ed9fSAtsushi Murai     if (strcmp(vector[0], system) == 0) {
53af57ed9fSAtsushi Murai       ExpandString(vector[1], passwd, 0);
54af57ed9fSAtsushi Murai       if (strcmp(passwd, key) == 0) {
55af57ed9fSAtsushi Murai 	CloseSecret(fp);
56af57ed9fSAtsushi Murai         bzero(&DefHisAddress, sizeof(DefHisAddress));
57af57ed9fSAtsushi Murai         n -= 2;
58af57ed9fSAtsushi Murai         if (n > 0) {
59af57ed9fSAtsushi Murai 	  ParseAddr(n--, &vector[2],
60af57ed9fSAtsushi Murai 	    &DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width);
61af57ed9fSAtsushi Murai 	}
62af57ed9fSAtsushi Murai 	IpcpInit();
63af57ed9fSAtsushi Murai 	return(1);	/* Valid */
64af57ed9fSAtsushi Murai       }
65af57ed9fSAtsushi Murai     }
66af57ed9fSAtsushi Murai   }
67af57ed9fSAtsushi Murai   CloseSecret(fp);
68af57ed9fSAtsushi Murai   return(0);		/* Invalid */
69af57ed9fSAtsushi Murai }
70af57ed9fSAtsushi Murai 
71af57ed9fSAtsushi Murai char *
72af57ed9fSAtsushi Murai AuthGetSecret(fname, system, len, setaddr)
73af57ed9fSAtsushi Murai char *fname, *system;
74af57ed9fSAtsushi Murai int len, setaddr;
75af57ed9fSAtsushi Murai {
76af57ed9fSAtsushi Murai   FILE *fp;
77af57ed9fSAtsushi Murai   int n;
78af57ed9fSAtsushi Murai   char *vector[20];
79af57ed9fSAtsushi Murai   char buff[200];
80af57ed9fSAtsushi Murai   static char passwd[100];
81af57ed9fSAtsushi Murai 
82af57ed9fSAtsushi Murai   fp = OpenSecret(fname);
83af57ed9fSAtsushi Murai   if (fp == NULL)
84af57ed9fSAtsushi Murai     return(NULL);
85af57ed9fSAtsushi Murai   while (fgets(buff, sizeof(buff), fp)) {
86af57ed9fSAtsushi Murai     if (buff[0] == '#')
87af57ed9fSAtsushi Murai       continue;
88af57ed9fSAtsushi Murai     buff[strlen(buff)-1] = 0;
89af57ed9fSAtsushi Murai     bzero(vector, sizeof(vector));
90af57ed9fSAtsushi Murai     n = MakeArgs(buff, &vector);
91af57ed9fSAtsushi Murai     if (n < 2)
92af57ed9fSAtsushi Murai       continue;
93af57ed9fSAtsushi Murai     if (strlen(vector[0]) == len && strncmp(vector[0], system, len) == 0) {
94af57ed9fSAtsushi Murai       ExpandString(vector[1], passwd, 0);
95af57ed9fSAtsushi Murai       if (setaddr) {
96af57ed9fSAtsushi Murai         bzero(&DefHisAddress, sizeof(DefHisAddress));
97af57ed9fSAtsushi Murai       }
98af57ed9fSAtsushi Murai       n -= 2;
99af57ed9fSAtsushi Murai       if (n > 0 && setaddr) {
100af57ed9fSAtsushi Murai #ifdef DEBUG
101af57ed9fSAtsushi Murai 	LogPrintf(LOG_LCP, "*** n = %d, %s\n", n, vector[2]);
102af57ed9fSAtsushi Murai #endif
103af57ed9fSAtsushi Murai 	ParseAddr(n--, &vector[2],
104af57ed9fSAtsushi Murai 	  &DefHisAddress.ipaddr, &DefHisAddress.mask, &DefHisAddress.width);
105af57ed9fSAtsushi Murai 	IpcpInit();
106af57ed9fSAtsushi Murai       }
107af57ed9fSAtsushi Murai       return(passwd);
108af57ed9fSAtsushi Murai     }
109af57ed9fSAtsushi Murai   }
110af57ed9fSAtsushi Murai   CloseSecret(fp);
111af57ed9fSAtsushi Murai   return(NULL);		/* Invalid */
112af57ed9fSAtsushi Murai }
113