--- truecrypt/common/crypto.c 2018/04/24 16:48:33 1.1.1.13 +++ truecrypt/common/crypto.c 2018/04/24 16:53:59 1.1.1.15 @@ -5,7 +5,7 @@ Agreement for Encryption for the Masses'. Modifications and additions to the original source code (contained in this file) and all other portions of this file are Copyright (c) 2003-2008 TrueCrypt Foundation and are governed - by the TrueCrypt License 2.4 the full text of which is contained in the + by the TrueCrypt License 2.5 the full text of which is contained in the file License.txt included in TrueCrypt binary and source code distribution packages. */ @@ -14,13 +14,11 @@ #include "Xts.h" #include "Crc.h" #include "Common/Endian.h" - -#ifdef LINUX_DRIVER -#include -#include -#else #include +#ifndef TC_WINDOWS_BOOT +#include "EncryptionThreadPool.h" #endif +#include "Volumes.h" /* Update the following when adding a new cipher or EA: @@ -37,6 +35,8 @@ */ +#ifndef TC_WINDOWS_BOOT_SINGLE_CIPHER_MODE + // Cipher configuration static Cipher Ciphers[] = { @@ -120,16 +120,15 @@ int CipherInit (int cipher, unsigned cha { case AES: #ifndef TC_WINDOWS_BOOT - if (aes_encrypt_key(key, CipherGetKeySize(AES), (aes_encrypt_ctx *) ks) != EXIT_SUCCESS) + if (aes_encrypt_key256 (key, (aes_encrypt_ctx *) ks) != EXIT_SUCCESS) return ERR_CIPHER_INIT_FAILURE; - if (aes_decrypt_key(key, CipherGetKeySize(AES), (aes_decrypt_ctx *) (ks + sizeof(aes_encrypt_ctx))) != EXIT_SUCCESS) + if (aes_decrypt_key256 (key, (aes_decrypt_ctx *) (ks + sizeof(aes_encrypt_ctx))) != EXIT_SUCCESS) return ERR_CIPHER_INIT_FAILURE; #else if (aes_set_key (key, (length_type) CipherGetKeySize(AES), (aes_context *) ks) != 0) return ERR_CIPHER_INIT_FAILURE; #endif - break; case SERPENT: @@ -335,7 +334,9 @@ int EAInit (int ea, unsigned char *key, } -int EAInitMode (PCRYPTO_INFO ci) +#ifndef TC_WINDOWS_BOOT + +BOOL EAInitMode (PCRYPTO_INFO ci) { switch (ci->mode) { @@ -351,7 +352,6 @@ int EAInitMode (PCRYPTO_INFO ci) that the size of each of the volumes is 1024 terabytes). */ break; -#ifndef TC_WINDOWS_BOOT case LRW: switch (CipherGetBlockSize (EAGetFirstCipher (ci->ea))) { @@ -373,7 +373,6 @@ int EAInitMode (PCRYPTO_INFO ci) case OUTER_CBC: // The mode does not need to be initialized or is initialized elsewhere return TRUE; -#endif // TC_WINDOWS_BOOT default: // Unknown/wrong ID @@ -382,7 +381,6 @@ int EAInitMode (PCRYPTO_INFO ci) return TRUE; } -#ifndef TC_WINDOWS_BOOT // Returns name of EA, cascaded cipher names are separated by hyphens char *EAGetName (char *buf, int ea) @@ -658,6 +656,9 @@ BOOL HashIsDeprecated (int hashId) } +#endif // TC_WINDOWS_BOOT_SINGLE_CIPHER_MODE + + #ifdef TC_WINDOWS_BOOT static byte CryptoInfoBufferInUse = 0; @@ -674,10 +675,8 @@ PCRYPTO_INFO crypto_open () memset (cryptoInfo, 0, sizeof (CRYPTO_INFO)); #ifndef DEVICE_DRIVER -#ifdef _WIN32 VirtualLock (cryptoInfo, sizeof (CRYPTO_INFO)); #endif -#endif if (cryptoInfo == NULL) return NULL; @@ -712,10 +711,8 @@ void crypto_close (PCRYPTO_INFO cryptoIn { burn (cryptoInfo, sizeof (CRYPTO_INFO)); #ifndef DEVICE_DRIVER -#ifdef _WIN32 VirtualUnlock (cryptoInfo, sizeof (CRYPTO_INFO)); #endif -#endif TCfree (cryptoInfo); } @@ -728,6 +725,9 @@ void crypto_close (PCRYPTO_INFO cryptoIn } +#ifndef TC_WINDOWS_BOOT_SINGLE_CIPHER_MODE + + #ifndef TC_NO_COMPILER_INT64 void Xor128 (unsigned __int64 *a, unsigned __int64 *b) { @@ -1169,9 +1169,7 @@ DecryptBufferCBC (unsigned __int32 *data // buf: data to be encrypted // len: number of bytes to encrypt; must be divisible by the block size (for cascaded // ciphers divisible by the largest block size used within the cascade) -void EncryptBuffer (unsigned __int8 *buf, - TC_LARGEST_COMPILER_UINT len, - PCRYPTO_INFO cryptoInfo) +void EncryptBuffer (unsigned __int8 *buf, TC_LARGEST_COMPILER_UINT len, PCRYPTO_INFO cryptoInfo) { switch (cryptoInfo->mode) { @@ -1276,7 +1274,7 @@ unsigned __int64 DataUnit2LRWIndex (unsi if (ci->hiddenVolume) dataUnit -= ci->hiddenVolumeOffset / ENCRYPTION_DATA_UNIT_SIZE; else - dataUnit -= HEADER_SIZE / ENCRYPTION_DATA_UNIT_SIZE; // Compensate for the volume header size + dataUnit -= TC_VOLUME_HEADER_SIZE_LEGACY / ENCRYPTION_DATA_UNIT_SIZE; // Compensate for the volume header size switch (blockSize) { @@ -1299,6 +1297,13 @@ unsigned __int64 DataUnit2LRWIndex (unsi // unitNo: sequential number of the data unit with which the buffer starts // nbrUnits: number of data units in the buffer void EncryptDataUnits (unsigned __int8 *buf, const UINT64_STRUCT *structUnitNo, TC_LARGEST_COMPILER_UINT nbrUnits, PCRYPTO_INFO ci) +#ifndef TC_WINDOWS_BOOT +{ + EncryptionThreadPoolDoWork (EncryptDataUnitsWork, buf, structUnitNo, nbrUnits, ci); +} + +void EncryptDataUnitsCurrentThread (unsigned __int8 *buf, const UINT64_STRUCT *structUnitNo, TC_LARGEST_COMPILER_UINT nbrUnits, PCRYPTO_INFO ci) +#endif // !TC_WINDOWS_BOOT { int ea = ci->ea; unsigned __int8 *ks = ci->ks; @@ -1417,9 +1422,7 @@ void EncryptDataUnits (unsigned __int8 * // buf: data to be decrypted // len: number of bytes to decrypt; must be divisible by the block size (for cascaded // ciphers divisible by the largest block size used within the cascade) -void DecryptBuffer (unsigned __int8 *buf, - TC_LARGEST_COMPILER_UINT len, - PCRYPTO_INFO cryptoInfo) +void DecryptBuffer (unsigned __int8 *buf, TC_LARGEST_COMPILER_UINT len, PCRYPTO_INFO cryptoInfo) { switch (cryptoInfo->mode) { @@ -1517,6 +1520,13 @@ void DecryptBuffer (unsigned __int8 *buf // unitNo: sequential number of the data unit with which the buffer starts // nbrUnits: number of data units in the buffer void DecryptDataUnits (unsigned __int8 *buf, const UINT64_STRUCT *structUnitNo, TC_LARGEST_COMPILER_UINT nbrUnits, PCRYPTO_INFO ci) +#ifndef TC_WINDOWS_BOOT +{ + EncryptionThreadPoolDoWork (DecryptDataUnitsWork, buf, structUnitNo, nbrUnits, ci); +} + +void DecryptDataUnitsCurrentThread (unsigned __int8 *buf, const UINT64_STRUCT *structUnitNo, TC_LARGEST_COMPILER_UINT nbrUnits, PCRYPTO_INFO ci) +#endif // !TC_WINDOWS_BOOT { int ea = ci->ea; unsigned __int8 *ks = ci->ks; @@ -1640,10 +1650,6 @@ int GetMaxPkcs5OutSize (void) { int size = 32; -#ifndef max -#define max(a,b) (((a) > (b)) ? (a) : (b)) -#endif - size = max (size, EAGetLargestKeyForMode (XTS) * 2); // Sizes of primary + secondary keys #ifndef TC_WINDOWS_BOOT @@ -1655,3 +1661,98 @@ int GetMaxPkcs5OutSize (void) return size; } + + +#else // TC_WINDOWS_BOOT_SINGLE_CIPHER_MODE + + +#if !defined (TC_WINDOWS_BOOT_AES) && !defined (TC_WINDOWS_BOOT_SERPENT) && !defined (TC_WINDOWS_BOOT_TWOFISH) +#error No cipher defined +#endif + +void EncipherBlock(int cipher, void *data, void *ks) +{ +#ifdef TC_WINDOWS_BOOT_AES + aes_encrypt (data, data, ks); +#elif defined (TC_WINDOWS_BOOT_SERPENT) + serpent_encrypt (data, data, ks); +#elif defined (TC_WINDOWS_BOOT_TWOFISH) + twofish_encrypt (ks, data, data); +#endif +} + +void DecipherBlock(int cipher, void *data, void *ks) +{ +#ifdef TC_WINDOWS_BOOT_AES + aes_decrypt (data, data, (aes_decrypt_ctx *) ((byte *) ks + sizeof(aes_encrypt_ctx))); +#elif defined (TC_WINDOWS_BOOT_SERPENT) + serpent_decrypt (data, data, ks); +#elif defined (TC_WINDOWS_BOOT_TWOFISH) + twofish_decrypt (ks, data, data); +#endif +} + +int EAGetFirst () +{ + return 1; +} + +int EAGetNext (int previousEA) +{ + return 0; +} + +int EAInit (int ea, unsigned char *key, unsigned __int8 *ks) +{ +#ifdef TC_WINDOWS_BOOT_AES + + aes_init(); + + if (aes_encrypt_key256 (key, (aes_encrypt_ctx *) ks) != EXIT_SUCCESS) + return ERR_CIPHER_INIT_FAILURE; + if (aes_decrypt_key256 (key, (aes_decrypt_ctx *) (ks + sizeof (aes_encrypt_ctx))) != EXIT_SUCCESS) + return ERR_CIPHER_INIT_FAILURE; + +#elif defined (TC_WINDOWS_BOOT_SERPENT) + serpent_set_key (key, 32 * 8, ks); +#elif defined (TC_WINDOWS_BOOT_TWOFISH) + twofish_set_key ((TwofishInstance *)ks, (const u4byte *)key, 32 * 8); +#endif + return ERR_SUCCESS; +} + +int EAGetKeySize (int ea) +{ + return 32; +} + +int EAGetFirstCipher (int ea) +{ + return 1; +} + +void EncryptBuffer (unsigned __int8 *buf, TC_LARGEST_COMPILER_UINT len, PCRYPTO_INFO cryptoInfo) +{ + UINT64_STRUCT dataUnitNo; + dataUnitNo.LowPart = 0; dataUnitNo.HighPart = 0; + EncryptBufferXTS (buf, len, &dataUnitNo, 0, cryptoInfo->ks, cryptoInfo->ks2, 1); +} + +void EncryptDataUnits (unsigned __int8 *buf, const UINT64_STRUCT *structUnitNo, TC_LARGEST_COMPILER_UINT nbrUnits, PCRYPTO_INFO ci) +{ + EncryptBufferXTS (buf, nbrUnits * ENCRYPTION_DATA_UNIT_SIZE, structUnitNo, 0, ci->ks, ci->ks2, 1); +} + +void DecryptBuffer (unsigned __int8 *buf, TC_LARGEST_COMPILER_UINT len, PCRYPTO_INFO cryptoInfo) +{ + UINT64_STRUCT dataUnitNo; + dataUnitNo.LowPart = 0; dataUnitNo.HighPart = 0; + DecryptBufferXTS (buf, len, &dataUnitNo, 0, cryptoInfo->ks, cryptoInfo->ks2, 1); +} + +void DecryptDataUnits (unsigned __int8 *buf, const UINT64_STRUCT *structUnitNo, TC_LARGEST_COMPILER_UINT nbrUnits, PCRYPTO_INFO ci) +{ + DecryptBufferXTS (buf, nbrUnits * ENCRYPTION_DATA_UNIT_SIZE, structUnitNo, 0, ci->ks, ci->ks2, 1); +} + +#endif // TC_WINDOWS_BOOT_SINGLE_CIPHER_MODE