diff options
Diffstat (limited to 'src/Common/Cache.c')
-rw-r--r-- | src/Common/Cache.c | 230 |
1 files changed, 115 insertions, 115 deletions
diff --git a/src/Common/Cache.c b/src/Common/Cache.c index e32896fa..e5b36590 100644 --- a/src/Common/Cache.c +++ b/src/Common/Cache.c @@ -1,115 +1,115 @@ -/*
- Legal Notice: Some portions of the source code contained in this file were
- derived from the source code of TrueCrypt 7.1a, which is
- Copyright (c) 2003-2012 TrueCrypt Developers Association and which is
- governed by the TrueCrypt License 3.0, also from the source code of
- Encryption for the Masses 2.02a, which is Copyright (c) 1998-2000 Paul Le Roux
- and which is governed by the 'License 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) 2013-2016 IDRIX
- and are governed by the Apache License 2.0 the full text of which is
- contained in the file License.txt included in VeraCrypt binary and source
- code distribution packages. */
-
-#include "Tcdefs.h"
-#include "Crypto.h"
-#include "Fat.h"
-#include "Volumes.h"
-#include "Apidrvr.h"
-#include "Common.h"
-#include "Cache.h"
-
-Password CachedPasswords[CACHE_SIZE];
-int CachedPim[CACHE_SIZE];
-int cacheEmpty = 1;
-static int nPasswordIdx = 0;
-
-int ReadVolumeHeaderWCache (BOOL bBoot, BOOL bCache, BOOL bCachePim, char *header, Password *password, int pkcs5_prf, int pim, BOOL truecryptMode, PCRYPTO_INFO *retInfo)
-{
- int nReturnCode = ERR_PASSWORD_WRONG;
- int i, effectivePim;
-
- /* Attempt to recognize volume using mount password */
- if (password->Length > 0)
- {
- nReturnCode = ReadVolumeHeader (bBoot, header, password, pkcs5_prf, pim, truecryptMode, retInfo, NULL);
-
- /* Save mount passwords back into cache if asked to do so */
- if (bCache && (nReturnCode == 0 || nReturnCode == ERR_CIPHER_INIT_WEAK_KEY))
- {
- for (i = 0; i < CACHE_SIZE; i++)
- {
- if (memcmp (&CachedPasswords[i], password, sizeof (Password)) == 0)
- break;
- }
-
- if (i == CACHE_SIZE)
- {
- /* Store the password */
- CachedPasswords[nPasswordIdx] = *password;
-
- /* Store also PIM if requested, otherwise set to default */
- if (bCachePim && (pim > 0))
- CachedPim[nPasswordIdx] = pim;
- else
- CachedPim[nPasswordIdx] = 0;
-
- /* Try another slot */
- nPasswordIdx = (nPasswordIdx + 1) % CACHE_SIZE;
-
- cacheEmpty = 0;
- }
- else if (bCachePim)
- {
- CachedPim[i] = pim > 0? pim : 0;
- }
- }
- }
- else if (!cacheEmpty)
- {
- /* Attempt to recognize volume using cached passwords */
- for (i = 0; i < CACHE_SIZE; i++)
- {
- if (CachedPasswords[i].Length > 0)
- {
- if (truecryptMode)
- effectivePim = 0;
- else if (pim == -1)
- effectivePim = CachedPim[i];
- else
- effectivePim = pim;
- nReturnCode = ReadVolumeHeader (bBoot, header, &CachedPasswords[i], pkcs5_prf, effectivePim, truecryptMode, retInfo, NULL);
-
- if (nReturnCode != ERR_PASSWORD_WRONG)
- break;
- }
- }
- }
-
- return nReturnCode;
-}
-
-
-void AddPasswordToCache (Password *password, int pim)
-{
- int i;
- for (i = 0; i < CACHE_SIZE; i++)
- {
- if (memcmp (&CachedPasswords[i], password, sizeof (Password)) == 0)
- return;
- }
-
- CachedPasswords[nPasswordIdx] = *password;
- CachedPim[nPasswordIdx] = pim > 0? pim : 0;
- nPasswordIdx = (nPasswordIdx + 1) % CACHE_SIZE;
- cacheEmpty = 0;
-}
-
-
-void WipeCache ()
-{
- burn (CachedPasswords, sizeof (CachedPasswords));
- burn (CachedPim, sizeof (CachedPim));
- nPasswordIdx = 0;
- cacheEmpty = 1;
-}
+/* + Legal Notice: Some portions of the source code contained in this file were + derived from the source code of TrueCrypt 7.1a, which is + Copyright (c) 2003-2012 TrueCrypt Developers Association and which is + governed by the TrueCrypt License 3.0, also from the source code of + Encryption for the Masses 2.02a, which is Copyright (c) 1998-2000 Paul Le Roux + and which is governed by the 'License 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) 2013-2016 IDRIX + and are governed by the Apache License 2.0 the full text of which is + contained in the file License.txt included in VeraCrypt binary and source + code distribution packages. */ + +#include "Tcdefs.h" +#include "Crypto.h" +#include "Fat.h" +#include "Volumes.h" +#include "Apidrvr.h" +#include "Common.h" +#include "Cache.h" + +Password CachedPasswords[CACHE_SIZE]; +int CachedPim[CACHE_SIZE]; +int cacheEmpty = 1; +static int nPasswordIdx = 0; + +int ReadVolumeHeaderWCache (BOOL bBoot, BOOL bCache, BOOL bCachePim, char *header, Password *password, int pkcs5_prf, int pim, BOOL truecryptMode, PCRYPTO_INFO *retInfo) +{ + int nReturnCode = ERR_PASSWORD_WRONG; + int i, effectivePim; + + /* Attempt to recognize volume using mount password */ + if (password->Length > 0) + { + nReturnCode = ReadVolumeHeader (bBoot, header, password, pkcs5_prf, pim, truecryptMode, retInfo, NULL); + + /* Save mount passwords back into cache if asked to do so */ + if (bCache && (nReturnCode == 0 || nReturnCode == ERR_CIPHER_INIT_WEAK_KEY)) + { + for (i = 0; i < CACHE_SIZE; i++) + { + if (memcmp (&CachedPasswords[i], password, sizeof (Password)) == 0) + break; + } + + if (i == CACHE_SIZE) + { + /* Store the password */ + CachedPasswords[nPasswordIdx] = *password; + + /* Store also PIM if requested, otherwise set to default */ + if (bCachePim && (pim > 0)) + CachedPim[nPasswordIdx] = pim; + else + CachedPim[nPasswordIdx] = 0; + + /* Try another slot */ + nPasswordIdx = (nPasswordIdx + 1) % CACHE_SIZE; + + cacheEmpty = 0; + } + else if (bCachePim) + { + CachedPim[i] = pim > 0? pim : 0; + } + } + } + else if (!cacheEmpty) + { + /* Attempt to recognize volume using cached passwords */ + for (i = 0; i < CACHE_SIZE; i++) + { + if (CachedPasswords[i].Length > 0) + { + if (truecryptMode) + effectivePim = 0; + else if (pim == -1) + effectivePim = CachedPim[i]; + else + effectivePim = pim; + nReturnCode = ReadVolumeHeader (bBoot, header, &CachedPasswords[i], pkcs5_prf, effectivePim, truecryptMode, retInfo, NULL); + + if (nReturnCode != ERR_PASSWORD_WRONG) + break; + } + } + } + + return nReturnCode; +} + + +void AddPasswordToCache (Password *password, int pim) +{ + int i; + for (i = 0; i < CACHE_SIZE; i++) + { + if (memcmp (&CachedPasswords[i], password, sizeof (Password)) == 0) + return; + } + + CachedPasswords[nPasswordIdx] = *password; + CachedPim[nPasswordIdx] = pim > 0? pim : 0; + nPasswordIdx = (nPasswordIdx + 1) % CACHE_SIZE; + cacheEmpty = 0; +} + + +void WipeCache () +{ + burn (CachedPasswords, sizeof (CachedPasswords)); + burn (CachedPim, sizeof (CachedPim)); + nPasswordIdx = 0; + cacheEmpty = 1; +} |