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