diff options
Diffstat (limited to 'src/Volume/Cipher.h')
-rw-r--r-- | src/Volume/Cipher.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/src/Volume/Cipher.h b/src/Volume/Cipher.h new file mode 100644 index 00000000..25fc82c9 --- /dev/null +++ b/src/Volume/Cipher.h @@ -0,0 +1,129 @@ +/* + Copyright (c) 2008-2010 TrueCrypt Developers Association. All rights reserved. + + Governed by the TrueCrypt License 3.0 the full text of which is contained in + the file License.txt included in TrueCrypt binary and source code distribution + packages. +*/ + +#ifndef TC_HEADER_Encryption_Ciphers +#define TC_HEADER_Encryption_Ciphers + +#include "Platform/Platform.h" + + +namespace TrueCrypt +{ + class Cipher; + typedef vector < shared_ptr <Cipher> > CipherList; + + class Cipher + { + public: + virtual ~Cipher (); + + virtual void DecryptBlock (byte *data) const; + virtual void DecryptBlocks (byte *data, size_t blockCount) const; + static void EnableHwSupport (bool enable) { HwSupportEnabled = enable; } + virtual void EncryptBlock (byte *data) const; + virtual void EncryptBlocks (byte *data, size_t blockCount) const; + static CipherList GetAvailableCiphers (); + virtual size_t GetBlockSize () const = 0; + virtual const SecureBuffer &GetKey () const { return Key; } + virtual size_t GetKeySize () const = 0; + virtual wstring GetName () const = 0; + virtual shared_ptr <Cipher> GetNew () const = 0; + virtual bool IsHwSupportAvailable () const { return false; } + static bool IsHwSupportEnabled () { return HwSupportEnabled; } + virtual void SetKey (const ConstBufferPtr &key); + + static const int MaxBlockSize = 16; + + protected: + Cipher (); + + virtual void Decrypt (byte *data) const = 0; + virtual void Encrypt (byte *data) const = 0; + virtual size_t GetScheduledKeySize () const = 0; + virtual void SetCipherKey (const byte *key) = 0; + + static bool HwSupportEnabled; + bool Initialized; + SecureBuffer Key; + SecureBuffer ScheduledKey; + + private: + Cipher (const Cipher &); + Cipher &operator= (const Cipher &); + }; + + struct CipherException : public Exception + { + protected: + CipherException () { } + CipherException (const string &message) : Exception (message) { } + CipherException (const string &message, const wstring &subject) : Exception (message, subject) { } + }; + + +#define TC_CIPHER(NAME, BLOCK_SIZE, KEY_SIZE) \ + class TC_JOIN (Cipher,NAME) : public Cipher \ + { \ + public: \ + TC_JOIN (Cipher,NAME) () { } \ + virtual ~TC_JOIN (Cipher,NAME) () { } \ +\ + virtual size_t GetBlockSize () const { return BLOCK_SIZE; }; \ + virtual size_t GetKeySize () const { return KEY_SIZE; }; \ + virtual wstring GetName () const { return L###NAME; }; \ + virtual shared_ptr <Cipher> GetNew () const { return shared_ptr <Cipher> (new TC_JOIN (Cipher,NAME)()); } \ + TC_CIPHER_ADD_METHODS \ +\ + protected: \ + virtual void Decrypt (byte *data) const; \ + virtual void Encrypt (byte *data) const; \ + virtual size_t GetScheduledKeySize () const; \ + virtual void SetCipherKey (const byte *key); \ +\ + private: \ + TC_JOIN (Cipher,NAME) (const TC_JOIN (Cipher,NAME) &); \ + TC_JOIN (Cipher,NAME) &operator= (const TC_JOIN (Cipher,NAME) &); \ + } + +#define TC_CIPHER_ADD_METHODS \ + virtual void DecryptBlocks (byte *data, size_t blockCount) const; \ + virtual void EncryptBlocks (byte *data, size_t blockCount) const; \ + virtual bool IsHwSupportAvailable () const; + + TC_CIPHER (AES, 16, 32); + +#undef TC_CIPHER_ADD_METHODS +#define TC_CIPHER_ADD_METHODS + + TC_CIPHER (Blowfish, 8, 56); + TC_CIPHER (Cast5, 8, 16); + TC_CIPHER (Serpent, 16, 32); + TC_CIPHER (TripleDES, 8, 24); + TC_CIPHER (Twofish, 16, 32); + +#undef TC_CIPHER + + +#define TC_EXCEPTION(NAME) TC_EXCEPTION_DECL(NAME,CipherException) + +#undef TC_EXCEPTION_SET +#define TC_EXCEPTION_SET \ + TC_EXCEPTION (CipherInitError); \ + TC_EXCEPTION (WeakKeyDetected); + + TC_EXCEPTION_SET; + +#undef TC_EXCEPTION + +#if (defined (TC_ARCH_X86) || defined (TC_ARCH_X64)) && !defined (__ppc__) +# define TC_AES_HW_CPU +#endif + +} + +#endif // TC_HEADER_Encryption_Ciphers |