/*** 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 "lwip/opt.h"

#if PPP_SUPPORT  /* don't build if not configured for use in lwipopts.h */

#if CHAP_SUPPORT /* don't build if not configured for use in lwipopts.h */

#include "ppp.h"
#include "pppdebug.h"

#include "magic.h"
#include "randm.h"
#include "auth.h"
#include "md5.h"
#include "chap.h"
#include "chpms.h"

#include <string.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);
#if 0
static int  ChapPrintPkt (u_char *, int, void (*) (void *, char *, ...), void *);
#endif

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
};


/***********************************/
/*** 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)
{
  LWIP_UNUSED_ARG(id);
  LWIP_UNUSED_ARG(inp);

  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)
{
  LWIP_UNUSED_ARG(id);
  LWIP_UNUSED_ARG(inp);

  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;
}

#if 0
static char *ChapCodenames[] = {
  "Challenge", "Response", "Success", "Failure"
};
/*
 * 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 /* CHAP_SUPPORT */

#endif /* PPP_SUPPORT */
