diff options
author | amurai <amurai@FreeBSD.org> | 1995-01-31 06:29:58 +0000 |
---|---|---|
committer | amurai <amurai@FreeBSD.org> | 1995-01-31 06:29:58 +0000 |
commit | 21ef2761fd1e5a4beb483da8bddf767d36540dce (patch) | |
tree | 3aecd1251d1647032ad1455f304eaeeaab4987d0 /usr.sbin/ppp/pap.c | |
parent | 0487956fcf018d602bfe99b0e3398c6f4d55680a (diff) | |
download | FreeBSD-src-21ef2761fd1e5a4beb483da8bddf767d36540dce.zip FreeBSD-src-21ef2761fd1e5a4beb483da8bddf767d36540dce.tar.gz |
Diffstat (limited to 'usr.sbin/ppp/pap.c')
-rw-r--r-- | usr.sbin/ppp/pap.c | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/usr.sbin/ppp/pap.c b/usr.sbin/ppp/pap.c new file mode 100644 index 0000000..3aaa25a --- /dev/null +++ b/usr.sbin/ppp/pap.c @@ -0,0 +1,163 @@ +/* + * PPP PAP Module + * + * Written by Toshiharu OHNO (tony-o@iij.ad.jp) + * + * Copyright (C) 1993-94, Internet Initiative Japan, Inc. + * All rights reserverd. + * + * Redistribution and use in source and binary forms are permitted + * provided that the above copyright notice and this paragraph are + * duplicated in all such forms and that any documentation, + * advertising materials, and other materials related to such + * distribution and use acknowledge that the software was developed + * by the Internet Initiative Japan, Inc. The name of the + * IIJ may not be used to endorse or promote products derived + * from this software without specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED + * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * $Id:$ + * + * TODO: + * o Imprement retransmission timer. + */ +#include "fsm.h" +#include "lcp.h" +#include "pap.h" +#include "vars.h" +#include "hdlc.h" +#include "lcpproto.h" +#include "phase.h" + +static char *papcodes[] = { + "???", "REQUEST", "ACK", "NAK" +}; + +static int papid; + +void +SendPapChallenge() +{ + struct fsmheader lh; + struct mbuf *bp; + u_char *cp; + int namelen, keylen, plen; + + namelen = strlen(VarAuthName); + keylen = strlen(VarAuthKey); + plen = namelen + keylen + 2; +#ifdef DEBUG + logprintf("namelen = %d, keylen = %d\n", namelen, keylen); + LogPrintf(LOG_PHASE, "PAP: %s (%s)\n", VarAuthName, VarAuthKey); +#endif + lh.code = PAP_REQUEST; + lh.id = ++papid; + lh.length = htons(plen + sizeof(struct fsmheader)); + bp = mballoc(plen + sizeof(struct fsmheader), MB_FSM); + bcopy(&lh, MBUF_CTOP(bp), sizeof(struct fsmheader)); + cp = MBUF_CTOP(bp) + sizeof(struct fsmheader); + *cp++ = namelen; + bcopy(VarAuthName, cp, namelen); + cp += namelen; + *cp++ = keylen; + bcopy(VarAuthKey, cp, keylen); + + HdlcOutput(PRI_NORMAL, PROTO_PAP, bp); +} + +static void +SendPapCode(id, code, message) +int id; +char *message; +int code; +{ + struct fsmheader lh; + struct mbuf *bp; + u_char *cp; + int plen, mlen; + + lh.code = code; + lh.id = id; + mlen = strlen(message); + plen = mlen + 1; + lh.length = htons(plen + sizeof(struct fsmheader)); + bp = mballoc(plen + sizeof(struct fsmheader), MB_FSM); + bcopy(&lh, MBUF_CTOP(bp), sizeof(struct fsmheader)); + cp = MBUF_CTOP(bp) + sizeof(struct fsmheader); + *cp++ = mlen; + bcopy(message, cp, mlen); + LogPrintf(LOG_PHASE, "PapOutput: %s\n", papcodes[code]); + HdlcOutput(PRI_NORMAL, PROTO_PAP, bp); +} + +/* + * Validate given username and passwrd against with secret table + */ +static int +PapValidate(name, key) +u_char *name, *key; +{ + int nlen, klen; + + nlen = *name++; + klen = *key; + *key++ = 0; + key[klen] = 0; + logprintf("name: %s (%d), key: %s (%d)\n", name, nlen, key, klen); + return(AuthValidate(SECRETFILE, name, key)); +} + +void +PapInput(bp) +struct mbuf *bp; +{ + int len = plength(bp); + struct fsmheader *php; + struct lcpstate *lcp = &LcpInfo; + u_char *cp; + + if (len >= sizeof(struct fsmheader)) { + php = (struct fsmheader *)MBUF_CTOP(bp); + if (len >= ntohs(php->length)) { + if (php->code < PAP_REQUEST || php->code > PAP_NAK) + php->code = 0; + LogPrintf(LOG_PHASE, "PapInput: %s\n", papcodes[php->code]); + + switch (php->code) { + case PAP_REQUEST: + cp = (u_char *) (php + 1); + if (PapValidate(cp, cp + *cp + 1)) { + SendPapCode(php->id, PAP_ACK, "Greetings!!"); + lcp->auth_ineed = 0; + if (lcp->auth_iwait == 0) + NewPhase(PHASE_NETWORK); + } else { + SendPapCode(php->id, PAP_NAK, "Login incorrect"); + LcpClose(); + } + break; + case PAP_ACK: + cp = (u_char *)(php + 1); + len = *cp++; + cp[len] = 0; + LogPrintf(LOG_PHASE, "Received PAP_ACK (%s)\n", cp); + if (lcp->auth_iwait == PROTO_PAP) { + lcp->auth_iwait = 0; + if (lcp->auth_ineed == 0) + NewPhase(PHASE_NETWORK); + } + break; + case PAP_NAK: + cp = (u_char *)(php + 1); + len = *cp++; + cp[len] = 0; + LogPrintf(LOG_PHASE, "Received PAP_NAK (%s)\n", cp); + LcpClose(); + break; + } + } + } + pfree(bp); +} |