//---------------------------------------------------------------------------
// MircryptionClass.h
//
// New C++ class version for mircryption
//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
// To avoid multiple header instantiations
#ifndef _mircryptionclassh

#define _mircryptionclassh

//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// Application includes
#include "mc_blowfish.h"

#include "md5class.h"

//---------------------------------------------------------------------------

//---------------------------------------------------------------------------
#include <string.h>

#include <stdio.h>

//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// Tag marks
#define MCPS2_STARTTAG		"\xABm\xAB"

#define MCPS2_ENDTAG		"\xBBm\xBB"

#define MCPS2_STARTTAGb		"\xC2\xABm\xC2\xAB"

#define MCPS2_ENDTAGb		"\xC2\xBBm\xC2\xBB"

#define MCPS2_CRC			"@@"

//
#define MCP_DefaultFilename	"MircryptionKeys.txt"

//
#define MAXKEYFILENAMELEN	255

#define MAXKEYSIZE			512

#define MAXSAFEKEYSIZE		200

#define MAXCHANNELNAMESIZE	80

//
#define MAXLINELEN			1000

#define MAXLINELENE			2000

#define MAXRETURNSTRINGLEN	2000

#define CRASHLINELEN		650

//
// most functions fill a return string - your passed return string should be able to hold this number of bytes
//
#define MAGICID				"MeowMeowMeowskido"

#define MIRCRYPTIONERROR	"Mircryption_Error"

#define MIRCRYPTIONCLASSVER	"v1.15.01"

//---------------------------------------------------------------------------




//---------------------------------------------------------------------------
// Stores keys
class MircryptionKeypair
{
friend class MircryptionClass;
protected:
	char channelname[MAXCHANNELNAMESIZE];
	char key[MAXKEYSIZE];
	MircryptionKeypair *nextp;
public:
	MircryptionKeypair() {strcpy(channelname,""); strcpy(key,""); nextp=NULL;};
	MircryptionKeypair(char *ic,char *ik) {strcpy(channelname,ic); strcpy(key,ik); nextp=NULL;};
};
//---------------------------------------------------------------------------


//---------------------------------------------------------------------------
// Main mircryption class
class MircryptionClass
{
protected:
	char keyfilename[MAXKEYFILENAMELEN];
	char masterpassphrase[MAXKEYSIZE];
	bool passphrasesunlockedflag;
	MircryptionKeypair *keypairs;
	int keys;
	bool keyfilebackedup;
	int badtries;
	bool foundencryptedchannels;
	bool gavewarning_lockedkeys;
public:
	MircryptionClass();
	~MircryptionClass();
public:
	// Publically exposed functions
	bool mc_encrypt (char *channelname,char *text, char *returndata);
	bool mc_forceencrypt (char *channelname,char *text, char *returndata);
	bool mc_decrypt (char *channelname,char *text, char *returndata);
	//
	bool mc_encrypt2 (char *channelname,char *text, char *returndata);
	bool mc_encrypt2key (char *key, char *text, char *returndata);
	bool mc_decrypt2 (char *channelname,char *text, char *returndata);
	bool mc_decrypt2key (char *key,char *text, char *returndata);
	//
	bool mc_setkey (char *channelname, char *text, char *returndata);
	bool mc_delkey (char *channelname, char *returndata);
	bool mc_disablekey (char *channelname, char *returndata);
	bool mc_enablekey (char *channelname, char *returndata);
	//
	bool mc_displaykey (char *channelname, char *returndata);
	bool mc_listkeys (char *returndata);
	bool mc_setunlockpassphrase (char *passphrase, char *returndata);
	bool mc_setkeyfilename (char *filename, char *returndata);
	//
	bool mc_iskeyfileunlocked (char *returndata);
	bool mc_isencrypting (char *channelname,char *returndata);
	bool mc_isdecrypting (char *channelname,char *returndata);
	//
	bool mc_md5 (char *text, char *returndata);
public:
	// these are mostly internal commands, but they are defined public for ease of use by others
	// key file management
	bool setunlockpassphrase(char *passphrase);
	bool getunlockpassphrase(char *passphrase) {strcpy(passphrase,masterpassphrase); return true;};
	bool unlock_keys();
	bool verify_keysunlocked();
	bool load_keys_ifnotalready();
	bool load_keys();
	void unloadkeys();
	bool backupkeys();
	bool save_keys();
	// channel key routines
	char *lookup_channelkey(char *channelname,char *key,bool wantencrypted);
	// substring decrypt
	void decrypt2_substring(char *insubstring,char *outstring, char *key);
	char *search_decrypt_string(char *inkey, char *instring);
public:
	int countkeys() {return keys;};
public:
	static void repwhitespaces(char *str);
	static void unrepwhitespaces(char *str);
	static char* mystrstr(char *startp,char *substring);
	//static void CleanMultiservChannelName(char *channelname);
	static void stripnicks(char *str);
	static void mylowercasify(char *str);
protected:
	// IMPORTANT - THESE NEED PLATFORM-DEPENDENT IMPLEMENTATION
	virtual char *get_classversionstring();
	virtual bool present_messagebox(char *messagetext,char *windowtitle);
	virtual bool request_unlockpassphrase();
	virtual bool send_irccommand(char *irccommand,char *text);
	virtual bool display_statustext(char *messagetext);
public:
	void bleachmemory();
	void bleachdelete(char *p);
public:
	static int checkpasswordquality(char *key,char *errorstring);
};
//---------------------------------------------------------------------------



//---------------------------------------------------------------------------
// 01/27/06 to prevent evil attempts to crash by sending nick+chan to big
void mcensuresafebuflen(char *buf, int maxlen);
//---------------------------------------------------------------------------




//---------------------------------------------------------------------------
#endif

//---------------------------------------------------------------------------



syntax highlighted by Code2HTML, v. 0.9.1