xref: /freebsd/usr.sbin/ppp/pap.c (revision af57ed9fdcc4e2a81940fc2243c0d3949fc0e00f)
1af57ed9fSAtsushi Murai /*
2af57ed9fSAtsushi Murai  *			PPP PAP Module
3af57ed9fSAtsushi Murai  *
4af57ed9fSAtsushi Murai  *	    Written by Toshiharu OHNO (tony-o@iij.ad.jp)
5af57ed9fSAtsushi Murai  *
6af57ed9fSAtsushi Murai  *   Copyright (C) 1993-94, Internet Initiative Japan, Inc.
7af57ed9fSAtsushi Murai  *		     All rights reserverd.
8af57ed9fSAtsushi Murai  *
9af57ed9fSAtsushi Murai  * Redistribution and use in source and binary forms are permitted
10af57ed9fSAtsushi Murai  * provided that the above copyright notice and this paragraph are
11af57ed9fSAtsushi Murai  * duplicated in all such forms and that any documentation,
12af57ed9fSAtsushi Murai  * advertising materials, and other materials related to such
13af57ed9fSAtsushi Murai  * distribution and use acknowledge that the software was developed
14af57ed9fSAtsushi Murai  * by the Internet Initiative Japan, Inc.  The name of the
15af57ed9fSAtsushi Murai  * IIJ may not be used to endorse or promote products derived
16af57ed9fSAtsushi Murai  * from this software without specific prior written permission.
17af57ed9fSAtsushi Murai  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
18af57ed9fSAtsushi Murai  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
19af57ed9fSAtsushi Murai  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
20af57ed9fSAtsushi Murai  *
21af57ed9fSAtsushi Murai  * $Id:$
22af57ed9fSAtsushi Murai  *
23af57ed9fSAtsushi Murai  *	TODO:
24af57ed9fSAtsushi Murai  *		o Imprement retransmission timer.
25af57ed9fSAtsushi Murai  */
26af57ed9fSAtsushi Murai #include "fsm.h"
27af57ed9fSAtsushi Murai #include "lcp.h"
28af57ed9fSAtsushi Murai #include "pap.h"
29af57ed9fSAtsushi Murai #include "vars.h"
30af57ed9fSAtsushi Murai #include "hdlc.h"
31af57ed9fSAtsushi Murai #include "lcpproto.h"
32af57ed9fSAtsushi Murai #include "phase.h"
33af57ed9fSAtsushi Murai 
34af57ed9fSAtsushi Murai static char *papcodes[] = {
35af57ed9fSAtsushi Murai   "???", "REQUEST", "ACK", "NAK"
36af57ed9fSAtsushi Murai };
37af57ed9fSAtsushi Murai 
38af57ed9fSAtsushi Murai static int papid;
39af57ed9fSAtsushi Murai 
40af57ed9fSAtsushi Murai void
41af57ed9fSAtsushi Murai SendPapChallenge()
42af57ed9fSAtsushi Murai {
43af57ed9fSAtsushi Murai   struct fsmheader lh;
44af57ed9fSAtsushi Murai   struct mbuf *bp;
45af57ed9fSAtsushi Murai   u_char *cp;
46af57ed9fSAtsushi Murai   int namelen, keylen, plen;
47af57ed9fSAtsushi Murai 
48af57ed9fSAtsushi Murai   namelen = strlen(VarAuthName);
49af57ed9fSAtsushi Murai   keylen = strlen(VarAuthKey);
50af57ed9fSAtsushi Murai   plen = namelen + keylen + 2;
51af57ed9fSAtsushi Murai #ifdef DEBUG
52af57ed9fSAtsushi Murai   logprintf("namelen = %d, keylen = %d\n", namelen, keylen);
53af57ed9fSAtsushi Murai   LogPrintf(LOG_PHASE, "PAP: %s (%s)\n", VarAuthName, VarAuthKey);
54af57ed9fSAtsushi Murai #endif
55af57ed9fSAtsushi Murai   lh.code = PAP_REQUEST;
56af57ed9fSAtsushi Murai   lh.id = ++papid;
57af57ed9fSAtsushi Murai   lh.length = htons(plen + sizeof(struct fsmheader));
58af57ed9fSAtsushi Murai   bp = mballoc(plen + sizeof(struct fsmheader), MB_FSM);
59af57ed9fSAtsushi Murai   bcopy(&lh, MBUF_CTOP(bp), sizeof(struct fsmheader));
60af57ed9fSAtsushi Murai   cp = MBUF_CTOP(bp) + sizeof(struct fsmheader);
61af57ed9fSAtsushi Murai   *cp++ = namelen;
62af57ed9fSAtsushi Murai   bcopy(VarAuthName, cp, namelen);
63af57ed9fSAtsushi Murai   cp += namelen;
64af57ed9fSAtsushi Murai   *cp++ = keylen;
65af57ed9fSAtsushi Murai   bcopy(VarAuthKey, cp, keylen);
66af57ed9fSAtsushi Murai 
67af57ed9fSAtsushi Murai   HdlcOutput(PRI_NORMAL, PROTO_PAP, bp);
68af57ed9fSAtsushi Murai }
69af57ed9fSAtsushi Murai 
70af57ed9fSAtsushi Murai static void
71af57ed9fSAtsushi Murai SendPapCode(id, code, message)
72af57ed9fSAtsushi Murai int id;
73af57ed9fSAtsushi Murai char *message;
74af57ed9fSAtsushi Murai int code;
75af57ed9fSAtsushi Murai {
76af57ed9fSAtsushi Murai   struct fsmheader lh;
77af57ed9fSAtsushi Murai   struct mbuf *bp;
78af57ed9fSAtsushi Murai   u_char *cp;
79af57ed9fSAtsushi Murai   int plen, mlen;
80af57ed9fSAtsushi Murai 
81af57ed9fSAtsushi Murai   lh.code = code;
82af57ed9fSAtsushi Murai   lh.id = id;
83af57ed9fSAtsushi Murai   mlen = strlen(message);
84af57ed9fSAtsushi Murai   plen = mlen + 1;
85af57ed9fSAtsushi Murai   lh.length = htons(plen + sizeof(struct fsmheader));
86af57ed9fSAtsushi Murai   bp = mballoc(plen + sizeof(struct fsmheader), MB_FSM);
87af57ed9fSAtsushi Murai   bcopy(&lh, MBUF_CTOP(bp), sizeof(struct fsmheader));
88af57ed9fSAtsushi Murai   cp = MBUF_CTOP(bp) + sizeof(struct fsmheader);
89af57ed9fSAtsushi Murai   *cp++ = mlen;
90af57ed9fSAtsushi Murai   bcopy(message, cp, mlen);
91af57ed9fSAtsushi Murai   LogPrintf(LOG_PHASE, "PapOutput: %s\n", papcodes[code]);
92af57ed9fSAtsushi Murai   HdlcOutput(PRI_NORMAL, PROTO_PAP, bp);
93af57ed9fSAtsushi Murai }
94af57ed9fSAtsushi Murai 
95af57ed9fSAtsushi Murai /*
96af57ed9fSAtsushi Murai  * Validate given username and passwrd against with secret table
97af57ed9fSAtsushi Murai  */
98af57ed9fSAtsushi Murai static int
99af57ed9fSAtsushi Murai PapValidate(name, key)
100af57ed9fSAtsushi Murai u_char *name, *key;
101af57ed9fSAtsushi Murai {
102af57ed9fSAtsushi Murai   int nlen, klen;
103af57ed9fSAtsushi Murai 
104af57ed9fSAtsushi Murai   nlen = *name++;
105af57ed9fSAtsushi Murai   klen = *key;
106af57ed9fSAtsushi Murai   *key++ = 0;
107af57ed9fSAtsushi Murai   key[klen] = 0;
108af57ed9fSAtsushi Murai   logprintf("name: %s (%d), key: %s (%d)\n", name, nlen, key, klen);
109af57ed9fSAtsushi Murai   return(AuthValidate(SECRETFILE, name, key));
110af57ed9fSAtsushi Murai }
111af57ed9fSAtsushi Murai 
112af57ed9fSAtsushi Murai void
113af57ed9fSAtsushi Murai PapInput(bp)
114af57ed9fSAtsushi Murai struct mbuf *bp;
115af57ed9fSAtsushi Murai {
116af57ed9fSAtsushi Murai   int len = plength(bp);
117af57ed9fSAtsushi Murai   struct fsmheader *php;
118af57ed9fSAtsushi Murai   struct lcpstate *lcp = &LcpInfo;
119af57ed9fSAtsushi Murai   u_char *cp;
120af57ed9fSAtsushi Murai 
121af57ed9fSAtsushi Murai   if (len >= sizeof(struct fsmheader)) {
122af57ed9fSAtsushi Murai     php = (struct fsmheader *)MBUF_CTOP(bp);
123af57ed9fSAtsushi Murai     if (len >= ntohs(php->length)) {
124af57ed9fSAtsushi Murai       if (php->code < PAP_REQUEST || php->code > PAP_NAK)
125af57ed9fSAtsushi Murai 	php->code = 0;
126af57ed9fSAtsushi Murai       LogPrintf(LOG_PHASE, "PapInput: %s\n", papcodes[php->code]);
127af57ed9fSAtsushi Murai 
128af57ed9fSAtsushi Murai       switch (php->code) {
129af57ed9fSAtsushi Murai       case PAP_REQUEST:
130af57ed9fSAtsushi Murai 	cp = (u_char *) (php + 1);
131af57ed9fSAtsushi Murai 	if (PapValidate(cp, cp + *cp + 1)) {
132af57ed9fSAtsushi Murai 	  SendPapCode(php->id, PAP_ACK, "Greetings!!");
133af57ed9fSAtsushi Murai 	  lcp->auth_ineed = 0;
134af57ed9fSAtsushi Murai 	  if (lcp->auth_iwait == 0)
135af57ed9fSAtsushi Murai 	    NewPhase(PHASE_NETWORK);
136af57ed9fSAtsushi Murai 	} else {
137af57ed9fSAtsushi Murai 	  SendPapCode(php->id, PAP_NAK, "Login incorrect");
138af57ed9fSAtsushi Murai 	  LcpClose();
139af57ed9fSAtsushi Murai 	}
140af57ed9fSAtsushi Murai 	break;
141af57ed9fSAtsushi Murai       case PAP_ACK:
142af57ed9fSAtsushi Murai 	cp = (u_char *)(php + 1);
143af57ed9fSAtsushi Murai 	len = *cp++;
144af57ed9fSAtsushi Murai 	cp[len] = 0;
145af57ed9fSAtsushi Murai 	LogPrintf(LOG_PHASE, "Received PAP_ACK (%s)\n", cp);
146af57ed9fSAtsushi Murai 	if (lcp->auth_iwait == PROTO_PAP) {
147af57ed9fSAtsushi Murai 	  lcp->auth_iwait = 0;
148af57ed9fSAtsushi Murai 	  if (lcp->auth_ineed == 0)
149af57ed9fSAtsushi Murai 	    NewPhase(PHASE_NETWORK);
150af57ed9fSAtsushi Murai 	}
151af57ed9fSAtsushi Murai 	break;
152af57ed9fSAtsushi Murai       case PAP_NAK:
153af57ed9fSAtsushi Murai 	cp = (u_char *)(php + 1);
154af57ed9fSAtsushi Murai 	len = *cp++;
155af57ed9fSAtsushi Murai 	cp[len] = 0;
156af57ed9fSAtsushi Murai 	LogPrintf(LOG_PHASE, "Received PAP_NAK (%s)\n", cp);
157af57ed9fSAtsushi Murai 	LcpClose();
158af57ed9fSAtsushi Murai 	break;
159af57ed9fSAtsushi Murai       }
160af57ed9fSAtsushi Murai     }
161af57ed9fSAtsushi Murai   }
162af57ed9fSAtsushi Murai   pfree(bp);
163af57ed9fSAtsushi Murai }
164