/*** WARNING - THIS HAS NEVER BEEN FINISHED ***/
/*****************************************************************************
* chap.c - Network Challenge Handshake Authentication Protocol program file.
*
* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
* portions Copyright (c) 1997 by Global Election Systems Inc.
*
* The authors hereby grant permission to use, copy, modify, distribute,
* and license this software and its documentation for any purpose, provided
* that existing copyright notices are retained in all copies and that this
* notice and the following disclaimer are included verbatim in any 
* distributions. No written agreement, license, or royalty fee is required
* for any of the authorized uses.
*
* THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS *AS IS* AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 
* IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
* REVISION HISTORY
*
* 03-01-01 Marc Boucher <marc@mbsi.ca>
*   Ported to lwIP.
* 97-12-04 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
*	Original based on BSD chap.c.
*****************************************************************************/
/*
 * chap.c - Challenge Handshake Authentication Protocol.
 *
 * Copyright (c) 1993 The Australian National University.
 * All rights reserved.
 *
 * 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 Australian National University.  The name of the University
 * 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.
 *
 * Copyright (c) 1991 Gregory M. Christy.
 * All rights reserved.
 *
 * 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 Gregory M. Christy.  The name of the author 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.
 */

#include "ppp.h"
#if PPP_SUPPORT > 0
#include "magic.h"

#if CHAP_SUPPORT > 0

#include "randm.h"
#include "auth.h"
#include "md5.h"
#include "chap.h"
#include "chpms.h"
#include "pppdebug.h"


/*************************/
/*** LOCAL DEFINITIONS ***/
/*************************/


/************************/
/*** LOCAL DATA TYPES ***/
/************************/


/***********************************/
/*** LOCAL FUNCTION DECLARATIONS ***/
/***********************************/
/*
 * Protocol entry points.
 */
static void ChapInit (int);
static void ChapLowerUp (int);
static void ChapLowerDown (int);
static void ChapInput (int, u_char *, int);
static void ChapProtocolReject (int);
static int  ChapPrintPkt (u_char *, int,
			      void (*) (void *, char *, ...), void *);

static void ChapChallengeTimeout (void *);
static void ChapResponseTimeout (void *);
static void ChapReceiveChallenge (chap_state *, u_char *, int, int);
static void ChapRechallenge (void *);
static void ChapReceiveResponse (chap_state *, u_char *, int, int);
static void ChapReceiveSuccess(chap_state *cstate, u_char *inp, u_char id, int len);
static void ChapReceiveFailure(chap_state *cstate, u_char *inp, u_char id, int len);
static void ChapSendStatus (chap_state *, int);
static void ChapSendChallenge (chap_state *);
static void ChapSendResponse (chap_state *);
static void ChapGenChallenge (chap_state *);


/******************************/
/*** PUBLIC DATA STRUCTURES ***/
/******************************/
chap_state chap[NUM_PPP];		/* CHAP state; one for each unit */

struct protent chap_protent = {
    PPP_CHAP,
    ChapInit,
    ChapInput,
    ChapProtocolReject,
    ChapLowerUp,
    ChapLowerDown,
    NULL,
    NULL,
#if 0
    ChapPrintPkt,
    NULL,
#endif
    1,
    "CHAP",
#if 0
    NULL,
    NULL,
    NULL
#endif
};



/*****************************/
/*** LOCAL DATA STRUCTURES ***/
/*****************************/
static char *ChapCodenames[] = {
	"Challenge", "Response", "Success", "Failure"
};



/***********************************/
/*** PUBLIC FUNCTION DEFINITIONS ***/
/***********************************/
/*
 * ChapAuthWithPeer - Authenticate us with our peer (start client).
 *
 */
void ChapAuthWithPeer(int unit, char *our_name, int digest)
{
	chap_state *cstate = &chap[unit];
	
	cstate->resp_name = our_name;
	cstate->resp_type = digest;
	
	if (cstate->clientstate == CHAPCS_INITIAL ||
			cstate->clientstate == CHAPCS_PENDING) {
		/* lower layer isn't up - wait until later */
		cstate->clientstate = CHAPCS_PENDING;
		return;
	}
	
	/*
	 * We get here as a result of LCP coming up.
	 * So even if CHAP was open before, we will 
	 * have to re-authenticate ourselves.
	 */
	cstate->clientstate = CHAPCS_LISTEN;
}


/*
 * ChapAuthPeer - Authenticate our peer (start server).
 */
void ChapAuthPeer(int unit, char *our_name, int digest)
{
	chap_state *cstate = &chap[unit];
	
	cstate->chal_name = our_name;
	cstate->chal_type = digest;
	
	if (cstate->serverstate == CHAPSS_INITIAL ||
			cstate->serverstate == CHAPSS_PENDING) {
		/* lower layer isn't up - wait until later */
		cstate->serverstate = CHAPSS_PENDING;
		return;
	}
	
	ChapGenChallenge(cstate);
	ChapSendChallenge(cstate);		/* crank it up dude! */
	cstate->serverstate = CHAPSS_INITIAL_CHAL;
}




/**********************************/
/*** LOCAL FUNCTION DEFINITIONS ***/
/**********************************/
/*
 * ChapInit - Initialize a CHAP unit.
 */
static void ChapInit(int unit)
{
	chap_state *cstate = &chap[unit];
	
	BZERO(cstate, sizeof(*cstate));
	cstate->unit = unit;
	cstate->clientstate = CHAPCS_INITIAL;
	cstate->serverstate = CHAPSS_INITIAL;
	cstate->timeouttime = CHAP_DEFTIMEOUT;
	cstate->max_transmits = CHAP_DEFTRANSMITS;
	/* random number generator is initialized in magic_init */
}


/*
 * ChapChallengeTimeout - Timeout expired on sending challenge.
 */
static void ChapChallengeTimeout(void *arg)
{
	chap_state *cstate = (chap_state *) arg;
	
	/* if we aren't sending challenges, don't worry.  then again we */
	/* probably shouldn't be here either */
	if (cstate->serverstate != CHAPSS_INITIAL_CHAL &&
			cstate->serverstate != CHAPSS_RECHALLENGE)
		return;
	
	if (cstate->chal_transmits >= cstate->max_transmits) {
		/* give up on peer */
		CHAPDEBUG((LOG_ERR, "Peer failed to respond to CHAP challenge\n"));
		cstate->serverstate = CHAPSS_BADAUTH;
		auth_peer_fail(cstate->unit, PPP_CHAP);
		return;
	}
	
	ChapSendChallenge(cstate);		/* Re-send challenge */
}


/*
 * ChapResponseTimeout - Timeout expired on sending response.
 */
static void ChapResponseTimeout(void *arg)
{
	chap_state *cstate = (chap_state *) arg;
	
	/* if we aren't sending a response, don't worry. */
	if (cstate->clientstate != CHAPCS_RESPONSE)
		return;
	
	ChapSendResponse(cstate);		/* re-send response */
}


/*
 * ChapRechallenge - Time to challenge the peer again.
 */
static void ChapRechallenge(void *arg)
{
	chap_state *cstate = (chap_state *) arg;
	
	/* if we aren't sending a response, don't worry. */
	if (cstate->serverstate != CHAPSS_OPEN)
		return;
	
	ChapGenChallenge(cstate);
	ChapSendChallenge(cstate);
	cstate->serverstate = CHAPSS_RECHALLENGE;
}


/*
 * ChapLowerUp - The lower layer is up.
 *
 * Start up if we have pending requests.
 */
static void ChapLowerUp(int unit)
{
	chap_state *cstate = &chap[unit];
	
	if (cstate->clientstate == CHAPCS_INITIAL)
		cstate->clientstate = CHAPCS_CLOSED;
	else if (cstate->clientstate == CHAPCS_PENDING)
		cstate->clientstate = CHAPCS_LISTEN;
	
	if (cstate->serverstate == CHAPSS_INITIAL)
		cstate->serverstate = CHAPSS_CLOSED;
	else if (cstate->serverstate == CHAPSS_PENDING) {
		ChapGenChallenge(cstate);
		ChapSendChallenge(cstate);
		cstate->serverstate = CHAPSS_INITIAL_CHAL;
	}
}


/*
 * ChapLowerDown - The lower layer is down.
 *
 * Cancel all timeouts.
 */
static void ChapLowerDown(int unit)
{
	chap_state *cstate = &chap[unit];
	
	/* Timeout(s) pending?  Cancel if so. */
	if (cstate->serverstate == CHAPSS_INITIAL_CHAL ||
			cstate->serverstate == CHAPSS_RECHALLENGE)
		UNTIMEOUT(ChapChallengeTimeout, cstate);
	else if (cstate->serverstate == CHAPSS_OPEN
			&& cstate->chal_interval != 0)
		UNTIMEOUT(ChapRechallenge, cstate);
	if (cstate->clientstate == CHAPCS_RESPONSE)
		UNTIMEOUT(ChapResponseTimeout, cstate);
	
	cstate->clientstate = CHAPCS_INITIAL;
	cstate->serverstate = CHAPSS_INITIAL;
}


/*
 * ChapProtocolReject - Peer doesn't grok CHAP.
 */
static void ChapProtocolReject(int unit)
{
	chap_state *cstate = &chap[unit];
	
	if (cstate->serverstate != CHAPSS_INITIAL &&
			cstate->serverstate != CHAPSS_CLOSED)
		auth_peer_fail(unit, PPP_CHAP);
	if (cstate->clientstate != CHAPCS_INITIAL &&
			cstate->clientstate != CHAPCS_CLOSED)
		auth_withpeer_fail(unit, PPP_CHAP);
	ChapLowerDown(unit);		/* shutdown chap */
}


/*
 * ChapInput - Input CHAP packet.
 */
static void ChapInput(int unit, u_char *inpacket, int packet_len)
{
	chap_state *cstate = &chap[unit];
	u_char *inp;
	u_char code, id;
	int len;
	
	/*
	 * Parse header (code, id and length).
	 * If packet too short, drop it.
	 */
	inp = inpacket;
	if (packet_len < CHAP_HEADERLEN) {
		CHAPDEBUG((LOG_INFO, "ChapInput: rcvd short header.\n"));
		return;
	}
	GETCHAR(code, inp);
	GETCHAR(id, inp);
	GETSHORT(len, inp);
	if (len < CHAP_HEADERLEN) {
		CHAPDEBUG((LOG_INFO, "ChapInput: rcvd illegal length.\n"));
		return;
	}
	if (len > packet_len) {
		CHAPDEBUG((LOG_INFO, "ChapInput: rcvd short packet.\n"));
		return;
	}
	len -= CHAP_HEADERLEN;
	
	/*
	 * Action depends on code (as in fact it usually does :-).
	 */
	switch (code) {
	case CHAP_CHALLENGE:
		ChapReceiveChallenge(cstate, inp, id, len);
		break;
	
	case CHAP_RESPONSE:
		ChapReceiveResponse(cstate, inp, id, len);
		break;
	
	case CHAP_FAILURE:
		ChapReceiveFailure(cstate, inp, id, len);
		break;
	
	case CHAP_SUCCESS:
		ChapReceiveSuccess(cstate, inp, id, len);
		break;
	
	default:				/* Need code reject? */
		CHAPDEBUG((LOG_WARNING, "Unknown CHAP code (%d) received.\n", code));
		break;
	}
}


/*
 * ChapReceiveChallenge - Receive Challenge and send Response.
 */
static void ChapReceiveChallenge(chap_state *cstate, u_char *inp, int id, int len)
{
	int rchallenge_len;
	u_char *rchallenge;
	int secret_len;
	char secret[MAXSECRETLEN];
	char rhostname[256];
	MD5_CTX mdContext;
	u_char hash[MD5_SIGNATURE_SIZE];
	
	CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: Rcvd id %d.\n", id));
	if (cstate->clientstate == CHAPCS_CLOSED ||
		cstate->clientstate == CHAPCS_PENDING) {
		CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: in state %d\n",
			   cstate->clientstate));
		return;
	}
	
	if (len < 2) {
		CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: rcvd short packet.\n"));
		return;
	}
	
	GETCHAR(rchallenge_len, inp);
	len -= sizeof (u_char) + rchallenge_len;	/* now name field length */
	if (len < 0) {
		CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: rcvd short packet.\n"));
		return;
	}
	rchallenge = inp;
	INCPTR(rchallenge_len, inp);
	
	if (len >= sizeof(rhostname))
		len = sizeof(rhostname) - 1;
	BCOPY(inp, rhostname, len);
	rhostname[len] = '\000';
	
	CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: received name field '%s'\n",
	       rhostname));
	
	/* Microsoft doesn't send their name back in the PPP packet */
	if (ppp_settings.remote_name[0] != 0 && (ppp_settings.explicit_remote || rhostname[0] == 0)) {
		strncpy(rhostname, ppp_settings.remote_name, sizeof(rhostname));
		rhostname[sizeof(rhostname) - 1] = 0;
		CHAPDEBUG((LOG_INFO, "ChapReceiveChallenge: using '%s' as remote name\n",
			   rhostname));
	}
	
	/* get secret for authenticating ourselves with the specified host */
	if (!get_secret(cstate->unit, cstate->resp_name, rhostname,
			    secret, &secret_len, 0)) {
		secret_len = 0;		/* assume null secret if can't find one */
		CHAPDEBUG((LOG_WARNING, "No CHAP secret found for authenticating us to %s\n", rhostname));
	}
	
	/* cancel response send timeout if necessary */
	if (cstate->clientstate == CHAPCS_RESPONSE)
		UNTIMEOUT(ChapResponseTimeout, cstate);
	
	cstate->resp_id = id;
	cstate->resp_transmits = 0;
	
	/*  generate MD based on negotiated type */
	switch (cstate->resp_type) { 
	
	case CHAP_DIGEST_MD5:
		MD5Init(&mdContext);
		MD5Update(&mdContext, &cstate->resp_id, 1);
		MD5Update(&mdContext, (u_char*)secret, secret_len);
		MD5Update(&mdContext, rchallenge, rchallenge_len);
		MD5Final(hash, &mdContext);
		BCOPY(hash, cstate->response, MD5_SIGNATURE_SIZE);
		cstate->resp_length = MD5_SIGNATURE_SIZE;
		break;
	
#ifdef CHAPMS
	case CHAP_MICROSOFT:
		ChapMS(cstate, rchallenge, rchallenge_len, secret, secret_len);
		break;
#endif
	
	default:
		CHAPDEBUG((LOG_INFO, "unknown digest type %d\n", cstate->resp_type));
		return;
	}
	
	BZERO(secret, sizeof(secret));
	ChapSendResponse(cstate);
}


/*
 * ChapReceiveResponse - Receive and process response.
 */
static void ChapReceiveResponse(chap_state *cstate, u_char *inp, int id, int len)
{
	u_char *remmd, remmd_len;
	int secret_len, old_state;
	int code;
	char rhostname[256];
	MD5_CTX mdContext;
	char secret[MAXSECRETLEN];
	u_char hash[MD5_SIGNATURE_SIZE];
	
	CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: Rcvd id %d.\n", id));
	
	if (cstate->serverstate == CHAPSS_CLOSED ||
			cstate->serverstate == CHAPSS_PENDING) {
		CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: in state %d\n",
		cstate->serverstate));
		return;
	}
	
	if (id != cstate->chal_id)
		return;			/* doesn't match ID of last challenge */
	
	/*
	* If we have received a duplicate or bogus Response,
	* we have to send the same answer (Success/Failure)
	* as we did for the first Response we saw.
	*/
	if (cstate->serverstate == CHAPSS_OPEN) {
		ChapSendStatus(cstate, CHAP_SUCCESS);
		return;
	}
	if (cstate->serverstate == CHAPSS_BADAUTH) {
		ChapSendStatus(cstate, CHAP_FAILURE);
		return;
	}
	
	if (len < 2) {
		CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: rcvd short packet.\n"));
		return;
	}
	GETCHAR(remmd_len, inp);		/* get length of MD */
	remmd = inp;			/* get pointer to MD */
	INCPTR(remmd_len, inp);
	
	len -= sizeof (u_char) + remmd_len;
	if (len < 0) {
		CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: rcvd short packet.\n"));
		return;
	}
	
	UNTIMEOUT(ChapChallengeTimeout, cstate);
	
	if (len >= sizeof(rhostname))
		len = sizeof(rhostname) - 1;
	BCOPY(inp, rhostname, len);
	rhostname[len] = '\000';
	
	CHAPDEBUG((LOG_INFO, "ChapReceiveResponse: received name field: %s\n",
				rhostname));
	
	/*
	* Get secret for authenticating them with us,
	* do the hash ourselves, and compare the result.
	*/
	code = CHAP_FAILURE;
	if (!get_secret(cstate->unit, rhostname, cstate->chal_name,
	secret, &secret_len, 1)) {
/*        CHAPDEBUG((LOG_WARNING, TL_CHAP, "No CHAP secret found for authenticating %s\n", rhostname)); */
		CHAPDEBUG((LOG_WARNING, "No CHAP secret found for authenticating %s\n",
		rhostname));
	} else {
	
		/*  generate MD based on negotiated type */
		switch (cstate->chal_type) { 
		
		case CHAP_DIGEST_MD5:		/* only MD5 is defined for now */
			if (remmd_len != MD5_SIGNATURE_SIZE)
				break;			/* it's not even the right length */
			MD5Init(&mdContext);
			MD5Update(&mdContext, &cstate->chal_id, 1);
			MD5Update(&mdContext, (u_char*)secret, secret_len);
			MD5Update(&mdContext, cstate->challenge, cstate->chal_len);
			MD5Final(hash, &mdContext); 
			
			/* compare local and remote MDs and send the appropriate status */
			if (memcmp (hash, remmd, MD5_SIGNATURE_SIZE) == 0)
				code = CHAP_SUCCESS;	/* they are the same! */
			break;
		
		default:
			CHAPDEBUG((LOG_INFO, "unknown digest type %d\n", cstate->chal_type));
		}
	}
	
	BZERO(secret, sizeof(secret));
	ChapSendStatus(cstate, code);
	
	if (code == CHAP_SUCCESS) {
		old_state = cstate->serverstate;
		cstate->serverstate = CHAPSS_OPEN;
		if (old_state == CHAPSS_INITIAL_CHAL) {
			auth_peer_success(cstate->unit, PPP_CHAP, rhostname, len);
		}
		if (cstate->chal_interval != 0)
			TIMEOUT(ChapRechallenge, cstate, cstate->chal_interval);
	} else {
		CHAPDEBUG((LOG_ERR, "CHAP peer authentication failed\n"));
		cstate->serverstate = CHAPSS_BADAUTH;
		auth_peer_fail(cstate->unit, PPP_CHAP);
	}
}

/*
 * ChapReceiveSuccess - Receive Success
 */
static void ChapReceiveSuccess(chap_state *cstate, u_char *inp, u_char id, int len)
{

	CHAPDEBUG((LOG_INFO, "ChapReceiveSuccess: Rcvd id %d.\n", id));
	
	if (cstate->clientstate == CHAPCS_OPEN)
		/* presumably an answer to a duplicate response */
		return;
	
	if (cstate->clientstate != CHAPCS_RESPONSE) {
		/* don't know what this is */
		CHAPDEBUG((LOG_INFO, "ChapReceiveSuccess: in state %d\n",
			   cstate->clientstate));
		return;
	}
	
	UNTIMEOUT(ChapResponseTimeout, cstate);
	
	/*
	 * Print message.
	 */
	if (len > 0)
		PRINTMSG(inp, len);
	
	cstate->clientstate = CHAPCS_OPEN;
	
	auth_withpeer_success(cstate->unit, PPP_CHAP);
}


/*
 * ChapReceiveFailure - Receive failure.
 */
static void ChapReceiveFailure(chap_state *cstate, u_char *inp, u_char id, int len)
{
	CHAPDEBUG((LOG_INFO, "ChapReceiveFailure: Rcvd id %d.\n", id));
	
	if (cstate->clientstate != CHAPCS_RESPONSE) {
		/* don't know what this is */
		CHAPDEBUG((LOG_INFO, "ChapReceiveFailure: in state %d\n",
			   cstate->clientstate));
		return;
	}
	
	UNTIMEOUT(ChapResponseTimeout, cstate);
	
	/*
	 * Print message.
	 */
	if (len > 0)
		PRINTMSG(inp, len);
	
	CHAPDEBUG((LOG_ERR, "CHAP authentication failed\n"));
	auth_withpeer_fail(cstate->unit, PPP_CHAP);
}


/*
 * ChapSendChallenge - Send an Authenticate challenge.
 */
static void ChapSendChallenge(chap_state *cstate)
{
	u_char *outp;
	int chal_len, name_len;
	int outlen;
	
	chal_len = cstate->chal_len;
	name_len = strlen(cstate->chal_name);
	outlen = CHAP_HEADERLEN + sizeof (u_char) + chal_len + name_len;
	outp = outpacket_buf[cstate->unit];
	
	MAKEHEADER(outp, PPP_CHAP);		/* paste in a CHAP header */
	
	PUTCHAR(CHAP_CHALLENGE, outp);
	PUTCHAR(cstate->chal_id, outp);
	PUTSHORT(outlen, outp);
	
	PUTCHAR(chal_len, outp);		/* put length of challenge */
	BCOPY(cstate->challenge, outp, chal_len);
	INCPTR(chal_len, outp);
	
	BCOPY(cstate->chal_name, outp, name_len);	/* append hostname */
	
	pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN);
	
	CHAPDEBUG((LOG_INFO, "ChapSendChallenge: Sent id %d.\n", cstate->chal_id));
	
	TIMEOUT(ChapChallengeTimeout, cstate, cstate->timeouttime);
	++cstate->chal_transmits;
}


/*
 * ChapSendStatus - Send a status response (ack or nak).
 */
static void ChapSendStatus(chap_state *cstate, int code)
{
	u_char *outp;
	int outlen, msglen;
	char msg[256];
	
	if (code == CHAP_SUCCESS)
		strcpy(msg, "Welcome!");
	else
		strcpy(msg, "I don't like you.  Go 'way.");
	msglen = strlen(msg);
	
	outlen = CHAP_HEADERLEN + msglen;
	outp = outpacket_buf[cstate->unit];
	
	MAKEHEADER(outp, PPP_CHAP);		/* paste in a header */
	
	PUTCHAR(code, outp);
	PUTCHAR(cstate->chal_id, outp);
	PUTSHORT(outlen, outp);
	BCOPY(msg, outp, msglen);
	pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN);
	
	CHAPDEBUG((LOG_INFO, "ChapSendStatus: Sent code %d, id %d.\n", code,
	       cstate->chal_id));
}

/*
 * ChapGenChallenge is used to generate a pseudo-random challenge string of
 * a pseudo-random length between min_len and max_len.  The challenge
 * string and its length are stored in *cstate, and various other fields of
 * *cstate are initialized.
 */

static void ChapGenChallenge(chap_state *cstate)
{
	int chal_len;
	u_char *ptr = cstate->challenge;
	int i;
	
	/* pick a random challenge length between MIN_CHALLENGE_LENGTH and 
	   MAX_CHALLENGE_LENGTH */  
	chal_len = (unsigned)
				((((magic() >> 16) *
			        (MAX_CHALLENGE_LENGTH - MIN_CHALLENGE_LENGTH)) >> 16)
			     + MIN_CHALLENGE_LENGTH);
	cstate->chal_len = chal_len;
	cstate->chal_id = ++cstate->id;
	cstate->chal_transmits = 0;
	
	/* generate a random string */
	for (i = 0; i < chal_len; i++ )
		*ptr++ = (char) (magic() & 0xff);
}

/*
 * ChapSendResponse - send a response packet with values as specified
 * in *cstate.
 */
/* ARGSUSED */
static void ChapSendResponse(chap_state *cstate)
{
	u_char *outp;
	int outlen, md_len, name_len;
	
	md_len = cstate->resp_length;
	name_len = strlen(cstate->resp_name);
	outlen = CHAP_HEADERLEN + sizeof (u_char) + md_len + name_len;
	outp = outpacket_buf[cstate->unit];
	
	MAKEHEADER(outp, PPP_CHAP);
	
	PUTCHAR(CHAP_RESPONSE, outp);	/* we are a response */
	PUTCHAR(cstate->resp_id, outp);	/* copy id from challenge packet */
	PUTSHORT(outlen, outp);			/* packet length */
	
	PUTCHAR(md_len, outp);			/* length of MD */
	BCOPY(cstate->response, outp, md_len);		/* copy MD to buffer */
	INCPTR(md_len, outp);
	
	BCOPY(cstate->resp_name, outp, name_len);	/* append our name */
	
	/* send the packet */
	pppWrite(cstate->unit, outpacket_buf[cstate->unit], outlen + PPP_HDRLEN);
	
	cstate->clientstate = CHAPCS_RESPONSE;
	TIMEOUT(ChapResponseTimeout, cstate, cstate->timeouttime);
	++cstate->resp_transmits;
}

/*
 * ChapPrintPkt - print the contents of a CHAP packet.
 */
static int ChapPrintPkt(
	u_char *p,
	int plen,
	void (*printer) (void *, char *, ...),
	void *arg
)
{
	int code, id, len;
	int clen, nlen;
	u_char x;
	
	if (plen < CHAP_HEADERLEN)
		return 0;
	GETCHAR(code, p);
	GETCHAR(id, p);
	GETSHORT(len, p);
	if (len < CHAP_HEADERLEN || len > plen)
		return 0;
	
	if (code >= 1 && code <= sizeof(ChapCodenames) / sizeof(char *))
		printer(arg, " %s", ChapCodenames[code-1]);
	else
		printer(arg, " code=0x%x", code);
	printer(arg, " id=0x%x", id);
	len -= CHAP_HEADERLEN;
	switch (code) {
	case CHAP_CHALLENGE:
	case CHAP_RESPONSE:
		if (len < 1)
			break;
		clen = p[0];
		if (len < clen + 1)
			break;
		++p;
		nlen = len - clen - 1;
		printer(arg, " <");
		for (; clen > 0; --clen) {
			GETCHAR(x, p);
			printer(arg, "%.2x", x);
		}
		printer(arg, ">, name = %.*Z", nlen, p);
		break;
	case CHAP_FAILURE:
	case CHAP_SUCCESS:
		printer(arg, " %.*Z", len, p);
		break;
	default:
		for (clen = len; clen > 0; --clen) {
			GETCHAR(x, p);
			printer(arg, " %.2x", x);
		}
	}
	
	return len + CHAP_HEADERLEN;
}

#endif

#endif /* PPP_SUPPORT */
