/*** WARNING - THIS CODE HAS NOT BEEN FINISHED! ***/
/*****************************************************************************
* chpms.c - Network MicroSoft Challenge Handshake Authentication Protocol program file.
*
* Copyright (c) 2003 by Marc Boucher, Services Informatiques (MBSI) inc.
* Copyright (c) 1997 by Global Election Systems Inc.  All rights reserved.
*
* 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-08 Guy Lancaster <lancasterg@acm.org>, Global Election Systems Inc.
*	Original based on BSD chap_ms.c.
*****************************************************************************/
/*
 * chap_ms.c - Microsoft MS-CHAP compatible implementation.
 *
 * Copyright (c) 1995 Eric Rosenquist, Strata Software Limited.
 * http://www.strataware.com/
 *
 * 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 Eric Rosenquist.  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.
 */

/*
 * Modifications by Lauri Pesonen / lpesonen@clinet.fi, april 1997
 *
 *   Implemented LANManager type password response to MS-CHAP challenges.
 *   Now pppd provides both NT style and LANMan style blocks, and the
 *   prefered is set by option "ms-lanman". Default is to use NT.
 *   The hash text (StdText) was taken from Win95 RASAPI32.DLL.
 *
 *   You should also use DOMAIN\\USERNAME as described in README.MSCHAP80
 */

#define USE_CRYPT


#include "ppp.h"

#if MSCHAP_SUPPORT > 0

#include "md4.h"
#ifndef USE_CRYPT
#include "des.h"
#endif
#include "chap.h"
#include "chpms.h"
#include "pppdebug.h"


/*************************/
/*** LOCAL DEFINITIONS ***/
/*************************/


/************************/
/*** LOCAL DATA TYPES ***/
/************************/
typedef struct {
    u_char LANManResp[24];
    u_char NTResp[24];
    u_char UseNT;		/* If 1, ignore the LANMan response field */
} MS_ChapResponse;
/* We use MS_CHAP_RESPONSE_LEN, rather than sizeof(MS_ChapResponse),
   in case this struct gets padded. */



/***********************************/
/*** LOCAL FUNCTION DECLARATIONS ***/
/***********************************/

/* XXX Don't know what to do with these. */
extern void setkey(const char *);
extern void encrypt(char *, int);

static void	DesEncrypt (u_char *, u_char *, u_char *);
static void	MakeKey (u_char *, u_char *);

#ifdef USE_CRYPT
static void	Expand (u_char *, u_char *);
static void	Collapse (u_char *, u_char *);
#endif

static void ChallengeResponse(
	u_char *challenge,	/* IN   8 octets */
	u_char *pwHash,		/* IN  16 octets */
	u_char *response	/* OUT 24 octets */
);
static void ChapMS_NT(
	char *rchallenge,
	int rchallenge_len,
	char *secret,
	int secret_len,
	MS_ChapResponse *response
);
static u_char Get7Bits(
	u_char *input,
	int startBit
);


/***********************************/
/*** PUBLIC FUNCTION DEFINITIONS ***/
/***********************************/
void ChapMS(
	chap_state *cstate,
	char *rchallenge,
	int rchallenge_len,
	char *secret,
	int secret_len
)
{
	MS_ChapResponse	response;
#ifdef MSLANMAN
	extern int ms_lanman;
#endif
	
#if 0
	CHAPDEBUG((LOG_INFO, "ChapMS: secret is '%.*s'\n", secret_len, secret));
#endif
	BZERO(&response, sizeof(response));
	
	/* Calculate both always */
	ChapMS_NT(rchallenge, rchallenge_len, secret, secret_len, &response);
	
#ifdef MSLANMAN
	ChapMS_LANMan(rchallenge, rchallenge_len, secret, secret_len, &response);
	
	/* prefered method is set by option  */
	response.UseNT = !ms_lanman;
#else
	response.UseNT = 1;
#endif
	
	BCOPY(&response, cstate->response, MS_CHAP_RESPONSE_LEN);
	cstate->resp_length = MS_CHAP_RESPONSE_LEN;
}


/**********************************/
/*** LOCAL FUNCTION DEFINITIONS ***/
/**********************************/
static void ChallengeResponse(
	u_char *challenge,	/* IN   8 octets */
	u_char *pwHash,		/* IN  16 octets */
	u_char *response	/* OUT 24 octets */
)
{
	char    ZPasswordHash[21];
	
	BZERO(ZPasswordHash, sizeof(ZPasswordHash));
	BCOPY(pwHash, ZPasswordHash, 16);
	
#if 0
	log_packet(ZPasswordHash, sizeof(ZPasswordHash), "ChallengeResponse - ZPasswordHash", LOG_DEBUG);
#endif
	
	DesEncrypt(challenge, ZPasswordHash +  0, response + 0);
	DesEncrypt(challenge, ZPasswordHash +  7, response + 8);
	DesEncrypt(challenge, ZPasswordHash + 14, response + 16);
	
#if 0
	log_packet(response, 24, "ChallengeResponse - response", LOG_DEBUG);
#endif
}


#ifdef USE_CRYPT
static void DesEncrypt(
	u_char *clear,	/* IN  8 octets */
	u_char *key,	/* IN  7 octets */
	u_char *cipher	/* OUT 8 octets */
)
{
	u_char des_key[8];
	u_char crypt_key[66];
	u_char des_input[66];
	
	MakeKey(key, des_key);
	
	Expand(des_key, crypt_key);
	setkey(crypt_key);
	
#if 0
	CHAPDEBUG((LOG_INFO, "DesEncrypt: 8 octet input : %02X%02X%02X%02X%02X%02X%02X%02X\n",
	       clear[0], clear[1], clear[2], clear[3], clear[4], clear[5], clear[6], clear[7]));
#endif
	
	Expand(clear, des_input);
	encrypt(des_input, 0);
	Collapse(des_input, cipher);
	
#if 0
	CHAPDEBUG((LOG_INFO, "DesEncrypt: 8 octet output: %02X%02X%02X%02X%02X%02X%02X%02X\n",
	       cipher[0], cipher[1], cipher[2], cipher[3], cipher[4], cipher[5], cipher[6], cipher[7]));
#endif
}

#else /* USE_CRYPT */

static void DesEncrypt(
	u_char *clear,	/* IN  8 octets */
	u_char *key,	/* IN  7 octets */
	u_char *cipher	/* OUT 8 octets */
)
{
	des_cblock		des_key;
	des_key_schedule	key_schedule;
	
	MakeKey(key, des_key);
	
	des_set_key(&des_key, key_schedule);
	
#if 0
	CHAPDEBUG((LOG_INFO, "DesEncrypt: 8 octet input : %02X%02X%02X%02X%02X%02X%02X%02X\n",
	       clear[0], clear[1], clear[2], clear[3], clear[4], clear[5], clear[6], clear[7]));
#endif
	
	des_ecb_encrypt((des_cblock *)clear, (des_cblock *)cipher, key_schedule, 1);
	
#if 0
	CHAPDEBUG((LOG_INFO, "DesEncrypt: 8 octet output: %02X%02X%02X%02X%02X%02X%02X%02X\n",
	       cipher[0], cipher[1], cipher[2], cipher[3], cipher[4], cipher[5], cipher[6], cipher[7]));
#endif
}

#endif /* USE_CRYPT */


static u_char Get7Bits(
	u_char *input,
	int startBit
)
{
	register unsigned int	word;
	
	word  = (unsigned)input[startBit / 8] << 8;
	word |= (unsigned)input[startBit / 8 + 1];
	
	word >>= 15 - (startBit % 8 + 7);
	
	return word & 0xFE;
}

#ifdef USE_CRYPT

/* in == 8-byte string (expanded version of the 56-bit key)
 * out == 64-byte string where each byte is either 1 or 0
 * Note that the low-order "bit" is always ignored by by setkey()
 */
static void Expand(u_char *in, u_char *out)
{
	int j, c;
	int i;
	
	for(i = 0; i < 64; in++){
		c = *in;
		for(j = 7; j >= 0; j--)
			*out++ = (c >> j) & 01;
		i += 8;
	}
}

/* The inverse of Expand
 */
static void Collapse(u_char *in, u_char *out)
{
	int j;
	int i;
	unsigned int c;
	
	for (i = 0; i < 64; i += 8, out++) {
		c = 0;
		for (j = 7; j >= 0; j--, in++)
			c |= *in << j;
		*out = c & 0xff;
	}
}
#endif

static void MakeKey(
	u_char *key,		/* IN  56 bit DES key missing parity bits */
	u_char *des_key		/* OUT 64 bit DES key with parity bits added */
)
{
	des_key[0] = Get7Bits(key,  0);
	des_key[1] = Get7Bits(key,  7);
	des_key[2] = Get7Bits(key, 14);
	des_key[3] = Get7Bits(key, 21);
	des_key[4] = Get7Bits(key, 28);
	des_key[5] = Get7Bits(key, 35);
	des_key[6] = Get7Bits(key, 42);
	des_key[7] = Get7Bits(key, 49);
	
#ifndef USE_CRYPT
	des_set_odd_parity((des_cblock *)des_key);
#endif
	
#if 0
	CHAPDEBUG((LOG_INFO, "MakeKey: 56-bit input : %02X%02X%02X%02X%02X%02X%02X\n",
	       key[0], key[1], key[2], key[3], key[4], key[5], key[6]));
	CHAPDEBUG((LOG_INFO, "MakeKey: 64-bit output: %02X%02X%02X%02X%02X%02X%02X%02X\n",
	       des_key[0], des_key[1], des_key[2], des_key[3], des_key[4], des_key[5], des_key[6], des_key[7]));
#endif
}

static void ChapMS_NT(
	char *rchallenge,
	int rchallenge_len,
	char *secret,
	int secret_len,
	MS_ChapResponse *response
)
{
	int			i;
	MDstruct	md4Context;
	u_char		unicodePassword[MAX_NT_PASSWORD * 2];
	static int	low_byte_first = -1;
	
	/* Initialize the Unicode version of the secret (== password). */
	/* This implicitly supports 8-bit ISO8859/1 characters. */
	BZERO(unicodePassword, sizeof(unicodePassword));
	for (i = 0; i < secret_len; i++)
		unicodePassword[i * 2] = (u_char)secret[i];
	
	MDbegin(&md4Context);
	MDupdate(&md4Context, unicodePassword, secret_len * 2 * 8);	/* Unicode is 2 bytes/char, *8 for bit count */
	
	if (low_byte_first == -1)
		low_byte_first = (htons((unsigned short int)1) != 1);
	if (low_byte_first == 0)
		MDreverse((u_long *)&md4Context);  /*  sfb 961105 */
	
	MDupdate(&md4Context, NULL, 0);	/* Tell MD4 we're done */
	
	ChallengeResponse(rchallenge, (char *)md4Context.buffer, response->NTResp);
}

#ifdef MSLANMAN
static u_char *StdText = (u_char *)"KGS!@#$%"; /* key from rasapi32.dll */

static ChapMS_LANMan(
	char *rchallenge,
	int rchallenge_len,
	char *secret,
	int secret_len,
	MS_ChapResponse	*response
)
{
	int			i;
	u_char		UcasePassword[MAX_NT_PASSWORD]; /* max is actually 14 */
	u_char		PasswordHash[16];
	
	/* LANMan password is case insensitive */
	BZERO(UcasePassword, sizeof(UcasePassword));
	for (i = 0; i < secret_len; i++)
		UcasePassword[i] = (u_char)toupper(secret[i]);
	DesEncrypt( StdText, UcasePassword + 0, PasswordHash + 0 );
	DesEncrypt( StdText, UcasePassword + 7, PasswordHash + 8 );
	ChallengeResponse(rchallenge, PasswordHash, response->LANManResp);
}
#endif

#endif /* MSCHAP_SUPPORT */

