SmaugWizard/Backup/
SmaugWizard/Backup/L/
SmaugWizard/Boards/
SmaugWizard/Building/
SmaugWizard/Corpses/
SmaugWizard/Councils/
SmaugWizard/Deity/
SmaugWizard/Gods/
SmaugWizard/MudProgs/
SmaugWizard/Player/L/
SmaugWizard/Src/
SmaugWizard/Src/res/
/****************************************************************************
 * [S]imulated [M]edieval [A]dventure multi[U]ser [G]ame      |				*
 * -----------------------------------------------------------|   \\._.//	*
 * SmaugWiz (C) 1998 by Russ Pillsbury (Windows NT version)   |   (0...0)	*
 * -----------------------------------------------------------|    ).:.(	*
 * SMAUG (C) 1994, 1995, 1996 by Derek Snider                 |    {o o}	*
 * -----------------------------------------------------------|   / ' ' \	*
 * SMAUG code team: Thoric, Altrag, Blodkai, Narn, Haus,      |~'~.VxvxV.~'~*
 * Scryn, Swordbearer, Rennard, Tricops, and Gorog.           |				*
 * ------------------------------------------------------------------------ *
 * Merc 2.1 Diku Mud improvments copyright (C) 1992, 1993 by Michael        *
 * Chastain, Michael Quan, and Mitchell Tse.                                *
 * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,          *
 * Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, and Katja Nyboe.    *
 ****************************************************************************/
// Crypt.cpp


#include	"stdafx.h"
//#include	<wincrypt.h>
#include	"smaug.h"
#include	"SmaugWizDoc.h"

//#define		NOCRYPT

CString	Crypt (const char* pwd, const char* name)
{
#ifdef	NOCRYPT
	return pwd;
#endif

#ifdef XXXX
	HCRYPTPROV	hProv = 0;
	HCRYPTKEY	hKey = 0;
	HCRYPTHASH	hHash = 0;
	DWORD		Length;
	CString		Msg;

	// Get handle to user default provider.
	if (! CryptAcquireContext (&hProv, NULL, NULL, PROV_RSA_FULL, 0)) {
		Msg.Format ("Error %x during CryptAcquireContext!\n", GetLastError ());
		goto done;
	}

	// Create hash object.
	if (! CryptCreateHash (hProv, CALG_MD5, 0, 0, &hHash)) {
		Msg.Format ("Error %x during CryptCreateHash!\n", GetLastError ());
		goto done;
	}

	// Hash name string.
	Length = strlen (name);
	if (! CryptHashData (hHash, (BYTE*) name, Length, 0)) {
		Msg.Format ("Error %x during CryptHashData!\n", GetLastError ());
		goto done;
	}

	// Create block cipher session key based on hash of the name.
	if (! CryptDeriveKey (hProv, CALG_RC4, hHash, CRYPT_EXPORTABLE, &hKey)) {
		Msg.Format ("Error %x during CryptDeriveKey!\n", GetLastError ());
		goto done;
	}

	// Use 'hKey' to do something.
	// Now encrypt the password
	char	buf [32];
	strcpy (buf, pwd);
	Length = strlen (pwd);
	if (! CryptEncrypt (hKey, hHash, TRUE, 0, (BYTE*)buf, &Length, sizeof (buf))) {
		Msg.Format ("Error %x during CryptEncrypt!\n", GetLastError ());
		goto done;
	}

done:
	// Destroy hash object.
	if (hHash) CryptDestroyHash (hHash);

	// Destroy session key.
	if (hKey) CryptDestroyKey (hKey);

	// Release provider handle.
	if (hProv) CryptReleaseContext (hProv, 0);

	if (Msg.IsEmpty ()) then return buf;

	gpDoc->LogString (Msg);
	return pwd;
#endif

// Ah hell, I can't make the above work. How about for now a very simple
// encryption just to make the passwords look encrypted.  We'll add 12 to
// the ascii value of each even parity letter, 14 to the ascii value of each
// odd parity letter, and wrap to 32+remainder if over 126!  Since it doesn't
// matter if the passwords can be decrypted or not, we'll also 'round up'
// any result characters between ' ' and '0', by doubling them.

	char	buf [64];
	CString	s = name;
	s += pwd;
	memset (buf, 0, sizeof (buf));

	for (int i=0; i < s.GetLength (); ++i) {
		UINT	c = s.GetAt (i);
		c += (c % 2) ? 12 : 14;
		if (c > 122) then
			c = 32 + (c-122);
		if (c < 48) then c *= 2;
		buf [i] = c;
	}
	return buf;
}