#ifndef _KVI_CRYPT_H_ #define _KVI_CRYPT_H_ //============================================================================= // // File : kvi_crypt.h // Creation date : Fri Nov 03 2000 01:45:21 CEST by Szymon Stefanek // // This file is part of the KVirc irc client distribution // Copyright (C) 1999-2007 Szymon Stefanek (pragma at kvirc dot net) // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License // as published by the Free Software Foundation; either version 2 // of the License, or (at your opinion) any later version. // // This program is distributed in the HOPE that it will be USEFUL, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. // See the GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, write to the Free Software Foundation, // Inc. ,51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. // //============================================================================= #include "kvi_settings.h" // // Base class for all IRC crypt engines // These intend to encrypt plain text into something // that can be sent through the IRC protocol... // so it should not contain NULL, CR , LF and other // similar stuff... // #include "kvi_qstring.h" #include "kvi_string.h" #include "kvi_heapobject.h" #include "kvi_pointerhashtable.h" #include #ifdef COMPILE_CRYPT_SUPPORT class KviCryptEngine; typedef KviCryptEngine * (*crypt_engine_allocator_func)(); typedef void (*crypt_engine_deallocator_func)(KviCryptEngine *); #endif //COMPILE_CRYPT_SUPPORT // we must include this declaration to make moc happy even // if we're not compiling the crypt support class KVILIB_API KviCryptEngine : public TQObject, public KviHeapObject { TQ_OBJECT friend class KviCryptEngineManager; public: KviCryptEngine(); virtual ~KviCryptEngine(); #ifdef COMPILE_CRYPT_SUPPORT private: crypt_engine_deallocator_func m_deallocFunc; // this is accessed by KviCryptEngineManager only TQString m_szLastError; int m_iMaxEncryptLen; public: void setMaxEncryptLen(int m){ m_iMaxEncryptLen = m; }; int maxEncryptLen(){ return m_iMaxEncryptLen; }; virtual bool init(const char * encKey,int encKeyLen,const char * decKey,int decKeyLen); // // Encrypts utf8 plainText and returns the encrypted // data in outBuffer. The encrypted data must be // suitable for sending thru an IRC (eventually DCC // that is less restrictive) connection and must be utf8 encoded: so // no NULL, CR and LF in the output. // 0x01 should be also avoided since // it is the CTCP delimiter. // Converting the result in a HEX string // is a good trick...also Base64 could be used. // Should return false in case of an error. // Theoretically we could allow NULLs in plainText // but this is not the case of KVIrc. // enum EncryptResult { Encrypted, Encoded, EncryptError }; virtual EncryptResult encrypt(const char * plainText,KviStr &outBuffer); // // Decrypts the utf8 data in inBuffer and puts the decrypted utf8 // stuff in plainText. inBuffer is the thingie // that we got from outBuffer of encrupt() so it // follows the same rules. // Should return false in case of error. // enum DecryptResult { DecryptOkWasEncrypted, DecryptOkWasEncoded, DecryptOkWasPlainText, DecryptError }; virtual DecryptResult decrypt(const char * inBuffer,KviStr &plainText); // // Returns the string containing the description // of the last error or an empty string if there // was no error after the last init() call. // const TQString &lastError(){ return m_szLastError; }; protected: // // The following two should have clear meaning // void clearLastError(){ m_szLastError = ""; }; void setLastError(const TQString &err){ m_szLastError = err; }; #endif //COMPILE_CRYPT_SUPPORT }; #ifdef COMPILE_CRYPT_SUPPORT #define KVI_CRYPTENGINE_CAN_ENCRYPT 1 #define KVI_CRYPTENGINE_CAN_DECRYPT 2 #define KVI_CRYPTENGINE_WANT_ENCRYPT_KEY 4 #define KVI_CRYPTENGINE_WANT_DECRYPT_KEY 8 class KVILIB_API KviCryptEngineDescription : public KviHeapObject { public: KviCryptEngineDescription(){}; virtual ~KviCryptEngineDescription(){}; public: TQString szName; // engine name TQString szDescription; // details TQString szAuthor; // algorithm author int iFlags; // properties crypt_engine_allocator_func allocFunc; // engine allocator crypt_engine_deallocator_func deallocFunc; // deallocation function (if called from outside the origin module) void * providerHandle; // used to identify the provider module }; class KVILIB_API KviCryptEngineManager { public: KviCryptEngineManager(); virtual ~KviCryptEngineManager(); private: KviPointerHashTable * m_pEngineDict; public: const KviPointerHashTable * engineDict(){ return m_pEngineDict; }; void registerEngine(KviCryptEngineDescription * d); void unregisterEngine(const TQString &szName); void unregisterEngines(void * providerHandle); // // Allocates a crypt engine // Please note that the engine may be deleted from outside // so you'd better connect the "destroyed" signal // KviCryptEngine * allocateEngine(const TQString &szName); void deallocateEngine(KviCryptEngine * e); }; #endif //COMPILE_CRYPT_SUPPORT #endif //!_KVI_CRYPT_H_