|
|
1.1.1.9 ! root 1: /* ! 2: Legal Notice: The source code contained in this file has been derived from ! 3: the source code of Encryption for the Masses 2.02a, which is Copyright (c) ! 4: Paul Le Roux and which is covered by the 'License Agreement for Encryption ! 5: for the Masses'. Modifications and additions to that source code contained ! 6: in this file are Copyright (c) TrueCrypt Foundation and are covered by the ! 7: TrueCrypt License 2.2 the full text of which is contained in the file ! 8: License.txt included in TrueCrypt binary and source code distribution ! 9: packages. */ 1.1 root 10: 1.1.1.6 root 11: #include "Tcdefs.h" 1.1 root 12: 13: #ifndef NT4_DRIVER 14: #pragma VxD_LOCKED_CODE_SEG 15: #pragma VxD_LOCKED_DATA_SEG 16: #endif 17: 1.1.1.6 root 18: #include "Crypto.h" 19: #include "Fat.h" 20: #include "Volumes.h" 21: #include "Apidrvr.h" 22: #include "Common.h" 23: #include "Cache.h" 24: 25: Password CachedPasswords[CACHE_SIZE]; 1.1 root 26: int cacheEmpty = 1; 1.1.1.6 root 27: static int nPasswordIdx = 0; 1.1 root 28: 29: int 1.1.1.6 root 30: VolumeReadHeaderCache (BOOL bCache, char *header, Password *password, PCRYPTO_INFO *retInfo) 1.1 root 31: { 32: int nReturnCode = ERR_PASSWORD_WRONG; 33: int i; 34: 35: /* Attempt to recognize volume using mount password */ 1.1.1.6 root 36: if (password->Length > 0) 1.1 root 37: { 1.1.1.6 root 38: nReturnCode = VolumeReadHeader (header, password, retInfo); 1.1 root 39: 40: /* Save mount passwords back into cache if asked to do so */ 1.1.1.6 root 41: if (bCache && (nReturnCode == 0 || nReturnCode == ERR_CIPHER_INIT_WEAK_KEY)) 1.1 root 42: { 43: for (i = 0; i < CACHE_SIZE; i++) 44: { 1.1.1.6 root 45: if (memcmp (&CachedPasswords[i], password, sizeof (Password)) == 0) 1.1 root 46: break; 47: } 48: 49: if (i == CACHE_SIZE) 50: { 51: /* Store the password */ 1.1.1.6 root 52: CachedPasswords[nPasswordIdx] = *password; 1.1 root 53: 54: /* Try another slot */ 55: nPasswordIdx = (nPasswordIdx + 1) % CACHE_SIZE; 56: 57: cacheEmpty = 0; 58: } 59: } 60: } 61: else if (!cacheEmpty) 62: { 63: /* Attempt to recognize volume using cached passwords */ 64: for (i = 0; i < CACHE_SIZE; i++) 65: { 1.1.1.6 root 66: if (CachedPasswords[i].Length > 0) 1.1 root 67: { 1.1.1.6 root 68: nReturnCode = VolumeReadHeader (header, &CachedPasswords[i], retInfo); 1.1 root 69: 70: if (nReturnCode != ERR_PASSWORD_WRONG) 71: break; 72: } 73: } 74: } 75: 76: return nReturnCode; 77: } 78: 79: void 80: WipeCache () 81: { 1.1.1.6 root 82: burn (CachedPasswords, sizeof (CachedPasswords)); 1.1 root 83: nPasswordIdx = 0; 84: cacheEmpty = 1; 85: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.