/* 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. */ #include "Platform/Platform.h" #include "Cipher.h" #include "Crypto/Aes.h" #include "Crypto/Serpent.h" #include "Crypto/Twofish.h" #ifdef TC_AES_HW_CPU # include "Crypto/Aes_hw_cpu.h" #endif namespace VeraCrypt { Cipher::Cipher () : Initialized (false) { } Cipher::~Cipher () { } void Cipher::DecryptBlock (byte *data) const { if (!Initialized) throw NotInitialized (SRC_POS); Decrypt (data); } void Cipher::DecryptBlocks (byte *data, size_t blockCount) const { if (!Initialized) throw NotInitialized (SRC_POS); while (blockCount-- > 0) { Decrypt (data); data += GetBlockSize(); } } void Cipher::EncryptBlock (byte *data) const { if (!Initialized) throw NotInitialized (SRC_POS); Encrypt (data); } void Cipher::EncryptBlocks (byte *data, size_t blockCount) const { if (!Initialized) throw NotInitialized (SRC_POS); while (blockCount-- > 0) { Encrypt (data); data += GetBlockSize(); } } CipherList Cipher::GetAvailableCiphers () { CipherList l; l.push_back (shared_ptr (new CipherAES ())); l.push_back (shared_ptr (new CipherSerpent ())); l.push_back (shared_ptr (new CipherTwofish ())); return l; } void Cipher::SetKey (const ConstBufferPtr &key) { if (key.Size() != GetKeySize ()) throw ParameterIncorrect (SRC_POS); if (!Initialized) ScheduledKey.Allocate (GetScheduledKeySize ()); SetCipherKey (key); Key.CopyFrom (key); Initialized = true; } #define TC_EXCEPTION(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE) #undef TC_EXCEPTION_NODECL #define TC_EXCEPTION_NODECL(TYPE) TC_SERIALIZER_FACTORY_ADD(TYPE) TC_SERIALIZER_FACTORY_ADD_EXCEPTION_SET (CipherException); // AES void CipherAES::Decrypt (byte *data) const { #ifdef TC_AES_HW_CPU if (IsHwSupportAvailable()) aes_hw_cpu_decrypt (ScheduledKey.Ptr() + sizeof (aes_encrypt_ctx), data); else #endif aes_decrypt (data, data, (aes_decrypt_ctx *) (ScheduledKey.Ptr() + sizeof (aes_encrypt_ctx))); } void CipherAES::DecryptBlocks (byte *data, size_t blockCount) const { if (!Initialized) throw NotInitialized (SRC_POS); #ifdef TC_AES_HW_CPU if ((blockCount & (32 - 1)) == 0 && IsHwSupportAvailable()) { while (blockCount > 0) { aes_hw_cpu_decrypt_32_blocks (ScheduledKey.Ptr() + sizeof (aes_encrypt_ctx), data); data += 32 * GetBlockSize(); blockCount -= 32; } } else #endif Cipher::DecryptBlocks (data, blockCount); } void CipherAES::Encrypt (byte *data) const { #ifdef TC_AES_HW_CPU if (IsHwSupportAvailable()) aes_hw_cpu_encrypt (ScheduledKey.Ptr(), data); else #endif aes_encrypt (data, data, (aes_encrypt_ctx *) ScheduledKey.Ptr()); } void CipherAES::EncryptBlocks (byte *data, size_t blockCount) const { if (!Initialized) throw NotInitialized (SRC_POS); #ifdef TC_AES_HW_CPU if ((blockCount & (32 - 1)) == 0 && IsHwSupportAvailable()) { while (blockCount > 0) { aes_hw_cpu_encrypt_32_blocks (ScheduledKey.Ptr(), data); data += 32 * GetBlockSize(); blockCount -= 32; } } else #endif Cipher::EncryptBlocks (data, blockCount); } size_t CipherAES::GetScheduledKeySize () const { return sizeof(aes_encrypt_ctx) + sizeof(aes_decrypt_ctx); } bool CipherAES::IsHwSupportAvailable () const { #ifdef TC_AES_HW_CPU static bool state = false; static bool stateValid = false; if (!stateValid) { state = is_aes_hw_cpu_supported() ? true : false; stateValid = true; } return state && HwSupportEnabled; #else return false; #endif } void CipherAES::SetCipherKey (const byte *key) { if (aes_encrypt_key256 (key, (aes_encrypt_ctx *) ScheduledKey.Ptr()) != EXIT_SUCCESS) throw CipherInitError (SRC_POS); if (aes_decrypt_key256 (key, (aes_decrypt_ctx *) (ScheduledKey.Ptr() + sizeof (aes_encrypt_ctx))) != EXIT_SUCCESS) throw CipherInitError (SRC_POS); } // Serpent void CipherSerpent::Decrypt (byte *data) const { serpent_decrypt (data, data, ScheduledKey); } void CipherSerpent::Encrypt (byte *data) const { serpent_encrypt (data, data, ScheduledKey); } size_t CipherSerpent::GetScheduledKeySize () const { return 140*4; } void CipherSerpent::SetCipherKey (const byte *key) { serpent_set_key (key, ScheduledKey); } // Twofish void CipherTwofish::Decrypt (byte *data) const { twofish_decrypt ((TwofishInstance *) ScheduledKey.Ptr(), (unsigned int *)data, (unsigned int *)data); } void CipherTwofish::Encrypt (byte *data) const { twofish_encrypt ((TwofishInstance *) ScheduledKey.Ptr(), (unsigned int *)data, (unsigned int *)data); } size_t CipherTwofish::GetScheduledKeySize () const { return TWOFISH_KS; } void CipherTwofish::SetCipherKey (const byte *key) { twofish_set_key ((TwofishInstance *) ScheduledKey.Ptr(), (unsigned int *) key); } bool Cipher::HwSupportEnabled = true; } 0-03-10 10:32:38 +0100'>2020-03-10Windows: Fix keyfiles path passed as CLI argument and set as default not alwa...Mounir IDRASSI2-4/+9 2020-03-10Windows: Fix text truncation in password dialog with some languagesMounir IDRASSI1-3/+3 2020-02-11Increment version to 1.24-Update5 and update signed Windows drivers.Mounir IDRASSI20-38/+38 2020-02-10Windows: Implement support for processor groups in the driver and fix build i...Mounir IDRASSI4-62/+138 2020-02-10Windows: Fix warnings reported by Coverity static code analyzerMounir IDRASSI4-17/+37 2020-02-04Windows: Fix groupbox alignment issue in UI of Fprmat wizardMounir IDRASSI1-1/+1 2020-01-29 Adding Processor Groups support for more than 64 processors (#581)techvintage1-3/+57 2020-01-22Windows: restore Visual Studio solution and project files to default configur...VeraCrypt_1.24-Update4Mounir IDRASSI2-1/+3 2020-01-22Windows: use fix for CVE-2019-19501 only when process elevated otherwise it w...Mounir IDRASSI1-1/+22 2020-01-22Increment version to 1.24-Update4 and update Release NotesMounir IDRASSI16-37/+36 2020-01-22Linux: correct OpenSUSE build script to indicate that we link against GTK2 an...Mounir IDRASSI1-2/+2 2020-01-22Windows: Fix regression in Expander and Format when RAM encryption is enable ...Mounir IDRASSI5-2/+217 2020-01-21Windows: Support notifying WAITFOR.EXE Windows command when VeraCrypt.exe exi...Mounir IDRASSI1-0/+54 2020-01-21Windows: Fix failure of Screen Readers (Accessibility support) to reader UI b...Mounir IDRASSI5-3/+97 2020-01-21Windows: don't display mount/dismount examples in help dialog for command lin...Mounir IDRASSI1-2/+2 2020-01-20Linux/MacOSX: Fix regression that limited the size available for hidden volumesMounir IDRASSI1-1/+1 2019-12-22Increment version to 1.24-Update3 for Linux and update Release NotesVeraCrypt_1.24-Update3Mounir IDRASSI2-4/+4 2019-12-22Linux: Modify .deb build scripts to link against statically built wxWidgets o...Mounir IDRASSI2-7/+29 2019-12-21Linux: Fix building and packaging console-only version to remove dependency o...Mounir IDRASSI2-23/+41 2019-12-20Fix the compilation against WxWidgets when NOGUI=1 (#570)Gokturk Yuksek3-1/+8 2019-12-17MacOSX: revert to using wxWidgets 3.1.2 following unexplained crash when usin...VeraCrypt_1.24-Update2Mounir IDRASSI1-2/+2 2019-12-16Linux: Fix build error when linking with old wxWidgets versionMounir IDRASSI1-1/+3 2019-12-16Update version information in preparation for 1.24-Update2 releaseMounir IDRASSI11-16/+16 2019-12-16Update Format wizard bitmap using submission by Andreas Becker (https://githu...Mounir IDRASSI1-0/+0 2019-12-16Windows: make /fastCreateFile switch apply to both UI and command line creati...Mounir IDRASSI1-1/+2 2019-12-16MacOSX: Ensure that the heading bar is always visible when window is moved so...Mounir IDRASSI2-5/+27 2019-12-16MacOSX: Ensure that main window is visible on screen when About is display as...Mounir IDRASSI2-0/+22 2019-12-16MacOSX: fix compilation error caused by missing StringConverter::ToWide metho...Mounir IDRASSI1-1/+1 2019-12-13Windows: check "TrueCrypt Mode" in password dialog when mounting a file conta...Mounir IDRASSI3-1/+11 2019-12-12Windows: Fix the checkbox for skipping verification of Rescue Disk not reflec...Mounir IDRASSI1-0/+1 2019-12-11Linux: fix compilation error when building console-only version of VeraCrypt ...Mounir IDRASSI2-9/+0 2019-12-10MacOSX: link against latest wxWidgets version 3.1.3Mounir IDRASSI1-3/+3 2019-12-10Increment version to 1.24-Update2Mounir IDRASSI20-38/+38 2019-12-10Windows: Align volume size field in Format wizard with other controlsMounir IDRASSI1-1/+1 2019-12-10Windows: Add switch /FastCreateFile for VeraCrypt Format.exe to speedup creat...Mounir IDRASSI3-2/+34 2019-12-09Windows Driver: Reduce memory usage of IOCTL_DISK_VERIFY handler. Now we read...Mounir IDRASSI1-6/+22 2019-12-09Fix wrong check on the define CRYPTOPP_BOOL_X64Mounir IDRASSI1-1/+1 2019-12-09Windows: Add latest 1.24 EFI bootloader files that are signed by Microsoft th...Mounir IDRASSI