VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/src/Volume
AgeCommit message (Expand)AuthorFilesLines
2019-12-09Linux: fix NOASM compilation (#563) (#568)alt3r 3go1-8/+8
2019-11-15Debug build: fix ParameterIncorrect error on hash benchmark start (#542) (#544)alt3r 3go1-1/+1
2019-11-04Linux/MacOSX: Add switch to force the use of legacy maximum password length (...Mounir IDRASSI1-0/+1
2019-10-24Linux/MacOSX: Better approach to avoid that jitterentropy code is optimized b...Mounir IDRASSI1-1/+3
2019-10-23Linux/MacOSX: Add missing JitterEntropy implementationMounir IDRASSI1-0/+1
2019-10-06MacOSX: fix link error under Xcode 4.6.3VeraCrypt_1.24Mounir IDRASSI2-3/+7
2019-01-28Increase password maximum length to 128 bytes from 64 bytesMounir IDRASSI2-2/+3
2019-01-25Linux/MacOSX crypto: report XTS optimization implemented previously on WindowsMounir IDRASSI1-49/+90
2018-08-10Linux/MacOSX/FreeBSD: In TrueCrypt mode, reject Streebog as KDF since it is n...mounir1-2/+2
2018-06-14Linux/MacOSX/FreeBSD: better handling for mounting systen encrypted disks who...Mounir IDRASSI1-16/+16
2018-06-11Linux/MacOSX/FreeBSD: Support mounting partially encrypted system partitions/...Mounir IDRASSI2-3/+41
2018-03-27Crypto: Add support for 5 new cascades of cipher algorithms (Camellia-Kuznyec...Mounir IDRASSI4-2/+233
2017-11-27SIMD speed optimization for Kuznyechik cipher implementation (up to 2x speedu...Mounir IDRASSI3-1/+50
2017-07-02Linux/MacOSX: use aligned memory for allocating hash context to avoid issues ...Mounir IDRASSI1-5/+5
2017-06-27MacOSX: various changes for assembly files build. Don't use 32-bit assembly c...Mounir IDRASSI1-14/+14
2017-06-23Update IDRIX copyright yearMounir IDRASSI36-36/+36
2017-06-23Linux/MacOSX: use yasm instead of nasm for compiling all assembly files.Mounir IDRASSI1-15/+15
2017-06-23Linux/MacOSX: fix missing namespace in call to Cipher::IsHwSupportEnabledMounir IDRASSI1-1/+1
2017-06-23Crypto: Add optimized SHA-512 and SHA-256 assembly implementations for x86_64...Mounir IDRASSI1-0/+44
2017-06-21Crypto: Add optimized Camellia assembly implementation for x86_64 based on wo...Mounir IDRASSI3-1/+61
2016-12-26Linux & MacOSX: automatically check TrueCryptMode in password dialog when sel...Mounir IDRASSI1-0/+27
2016-12-26MacOSX: use Yasm to build Twofish 64-bit assembly code on OSX since native co...Mounir IDRASSI1-1/+1
2016-12-07Crypto: Add optimized Twofish assembly implementation for x86_64.Mounir IDRASSI3-1/+40
2016-10-17Crypto: Use SIMD optimized Serpent implementation from Botan. 2.5x speed gain...Mounir IDRASSI3-4/+54
2016-10-17Add test vectors for Kuznyechik and GOST89 (the later is deprecated)Mounir IDRASSI4-3/+141
2016-10-17Crypto: deprecate GOST89 so that it can't be used to create new volumes. Keep...Mounir IDRASSI1-1/+1
2016-08-17Linux/MacOSX: Add Streebog to the list of supported hash algorithms used for ...Mounir IDRASSI1-0/+1
2016-08-17Linux: fix various compilation issues under Linux.Mounir IDRASSI2-3/+3
2016-08-15Windows: Add support for Streebog (hash) and kuznyechik (encryption)Mounir IDRASSI11-1/+188
2016-07-29Crypto: Use Hyper-V AES-NI detection workaround when displaying AES hardware ...Mounir IDRASSI1-1/+2
2016-07-25Windows: solve benchmark issue for Whirlpool which caused wrong numbers when ...Mounir IDRASSI1-1/+1
2016-06-19Linux/MacOSX: Solve compilation error linked to Camellia cipher addition.Mounir IDRASSI2-3/+4
2016-06-02Crypto: Add support for Japanese encryption standard Camellia, including for ...Mounir IDRASSI6-1/+102
2016-05-10Remove trailing whitespaceDavid Foerster36-157/+157
2016-01-20Copyright: update dates to include 2016.Mounir IDRASSI36-36/+36
2015-12-31Cryptography: Optimize Whirlpool implementation by using public domain assemb...Mounir IDRASSI1-0/+1
2015-11-30Linux/MacOSX: Implement Unicode passwords suppport. Make validation of parame...Mounir IDRASSI3-101/+10
2015-08-06Update license information to reflect the use of a dual license Apache 2.0 an...Mounir IDRASSI36-170/+314
2015-07-25Linux/MacOSX: remove unused variable.Mounir IDRASSI1-2/+0
2015-07-11Linux: Solve compilation warning (unused variables, pointer cast)Mounir IDRASSI1-3/+0
2015-06-24Linux/MacOSX: restore normal file mode to some source filesMounir IDRASSI7-0/+0
2015-06-24Linux/MacOSX: first dynamic mode implementationMounir IDRASSI8-23/+31
2015-04-26Linux: in command line, support hash algorithm names without '-' as on Window...Mounir IDRASSI1-0/+5
2015-02-08Linux/MacOSX: mark RIPEMD-160 as deprecated like it's the case on Windows. It...Mounir IDRASSI1-0/+1
2015-02-08Activate support of mounting TrueCrypt system partitions.Mounir IDRASSI1-3/+0
2015-01-04Linux/MacOSX: Add support for TrueCrypt 6.x as it was done on Windows.Mounir IDRASSI1-1/+1
2015-01-04Linux/MacOSX: change cascade encryption naming format in the UI as it was don...Mounir IDRASSI2-3/+17
2014-12-30Linux/MacOSX: Implement TrueCrypt conversion and loading support. Correct man...Mounir IDRASSI11-59/+100
2014-12-20Reduce time for reporting wrong password by removing support for legacy hidde...Mounir IDRASSI3-58/+0
2014-12-19Linux/MacOSX: Enhance performance by implementing the possibility to choose t...Mounir IDRASSI5-10/+20
span> Modifications and additions to the original source code (contained in this file) and all other portions of this file are Copyright (c) 2013-2015 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. */ #ifdef __GNUC__ # include <cxxabi.h> #endif #include <locale> #include <typeinfo> #include "Buffer.h" #include "Exception.h" #include "ForEach.h" #include "StringConverter.h" #include "SystemException.h" namespace VeraCrypt { void StringConverter::Erase (string &str) { for (size_t i = 0; i < str.size(); ++i) { str[i] = ' '; } } void StringConverter::Erase (wstring &str) { for (size_t i = 0; i < str.size(); ++i) { str[i] = ' '; } } wstring StringConverter::FromNumber (double number) { wstringstream s; s << number; return s.str(); } wstring StringConverter::FromNumber (int32 number) { wstringstream s; s << number; return s.str(); } wstring StringConverter::FromNumber (uint32 number) { wstringstream s; s << number; return s.str(); } wstring StringConverter::FromNumber (int64 number) { wstringstream s; s << number; return s.str(); } wstring StringConverter::FromNumber (uint64 number) { wstringstream s; s << number; return s.str(); } string StringConverter::GetTrailingNumber (const string &str) { size_t start = str.find_last_not_of ("0123456789"); if (start == string::npos) return str; string s = str.substr (start + 1); if (s.empty ()) throw ParameterIncorrect (SRC_POS); return s; } string StringConverter::GetTypeName (const type_info &typeInfo) { try { #ifdef _MSC_VER // type_info::name() leaks memory as of MS VC++ 8.0 string rawName (typeInfo.raw_name()); size_t cut1 = (rawName.find (".?A") != string::npos) ? 4 : string::npos; size_t cut2 = rawName.find ("@"); size_t cut3 = rawName.find ("@@"); if (cut1 == string::npos || cut2 == string::npos || cut3 == string::npos) return typeInfo.name(); return rawName.substr (cut2 + 1, cut3 - cut2 - 1) + "::" + rawName.substr (cut1, cut2 - cut1); #elif defined (__GNUC__) int status; char *name = abi::__cxa_demangle (typeInfo.name(), nullptr, nullptr, &status); if (name) { string s (name); free (name); return s; } #endif } catch (...) { } return typeInfo.name(); } wstring StringConverter::QuoteSpaces (const wstring &str) { if (str.find (L' ') == string::npos) return str; wstring escaped (L"'"); foreach (wchar_t c, str) { if (c == L'\'') escaped += L'\''; escaped += c; } return escaped + L'\''; } vector <string> StringConverter::Split (const string &str, const string &separators, bool returnEmptyFields) { vector <string> elements; if (!returnEmptyFields) { size_t p = 0; while ((p = str.find_first_not_of (separators, p)) != string::npos) { size_t end = str.find_first_of (separators, p); if (end == string::npos) { elements.push_back (str.substr (p)); break; } elements.push_back (str.substr (p, end - p)); p = end; } } else { string element; elements.push_back (element); foreach (char c, str) { if (separators.find (c) != string::npos) { element.erase(); elements.push_back (element); } else { elements.back() += c; } } } return elements; } string StringConverter::StripTrailingNumber (const string &str) { size_t start = str.find_last_not_of ("0123456789"); if (start == string::npos) return ""; return str.substr (0, start + 1); } wstring StringConverter::ToExceptionString (const exception &ex) { const SystemException *sysEx = dynamic_cast <const SystemException *> (&ex); if (sysEx) return ToWide (sysEx->what()) + L": " + sysEx->SystemText() + L": " + sysEx->GetSubject(); if (ex.what() && !string (ex.what()).empty()) return ToWide (GetTypeName (typeid (ex)) + ": " + ex.what()); return ToWide (GetTypeName (typeid (ex))); } string StringConverter::ToLower (const string &str) { string s; foreach (char c, str) s += tolower (c, locale()); return s; } string StringConverter::ToSingle (const wstring &wstr, bool noThrow) { string str; ToSingle (wstr, str, noThrow); return str; } void StringConverter::ToSingle (const wstring &wstr, string &str, bool noThrow) { try { mbstate_t mbState; Memory::Zero (&mbState, sizeof (mbState)); const wchar_t *src = wstr.c_str(); size_t size = wcsrtombs (nullptr, &src, 0, &mbState); if (size == (size_t) -1) throw StringConversionFailed (SRC_POS, wstr); vector <char> buf (size + 1); Memory::Zero (&mbState, sizeof (mbState)); if ((size = wcsrtombs (&buf[0], &src, buf.size(), &mbState)) == (size_t) -1) throw StringConversionFailed (SRC_POS, wstr); str.clear(); str.insert (0, &buf.front(), size); Memory::Erase (&buf.front(), buf.size()); } catch (...) { if (!noThrow) throw; } } uint32 StringConverter::ToUInt32 (const string &str) { uint32 n; stringstream ss (str); ss >> n; if (ss.fail() || n == 0xffffFFFFU) throw ParameterIncorrect (SRC_POS); return n; } uint32 StringConverter::ToUInt32 (const wstring &str) { uint32 n; wstringstream ss (str); ss >> n; if (ss.fail() || n == 0xffffFFFFU) throw ParameterIncorrect (SRC_POS); return n; } int32 StringConverter::ToInt32 (const string &str) { int32 n; stringstream ss (str); ss >> n; if (ss.fail() || n == 0x7fffFFFF || n == -0x7fffFFFF) throw ParameterIncorrect (SRC_POS); return n; } int32 StringConverter::ToInt32 (const wstring &str) { int32 n; wstringstream ss (str); ss >> n; if (ss.fail() || n == 0x7fffFFFF || n == -0x7fffFFFF) throw ParameterIncorrect (SRC_POS); return n; } uint64 StringConverter::ToUInt64 (const string &str) { uint64 n; stringstream ss (str); ss >> n; if (ss.fail() || n == 0xffffFFFFffffFFFFULL) throw ParameterIncorrect (SRC_POS); return n; } uint64 StringConverter::ToUInt64 (const wstring &str) { uint64 n; wstringstream ss (str); ss >> n; if (ss.fail() || n == 0xffffFFFFffffFFFFULL) throw ParameterIncorrect (SRC_POS); return n; } int64 StringConverter::ToInt64 (const string &str) { int64 n; stringstream ss (str); ss >> n; if (ss.fail() || n == 0x7fffFFFFffffFFFFLL || n == -0x7fffFFFFffffFFFFLL) throw ParameterIncorrect (SRC_POS); return n; } int64 StringConverter::ToInt64 (const wstring &str) { int64 n; wstringstream ss (str); ss >> n; if (ss.fail() || n == 0x7fffFFFFffffFFFFLL || n == -0x7fffFFFFffffFFFFLL) throw ParameterIncorrect (SRC_POS); return n; } string StringConverter::ToUpper (const string &str) { string s; foreach (char c, str) s += toupper (c, locale()); return s; } wstring StringConverter::ToWide (const string &str, bool noThrow) { try { mbstate_t mbState; Memory::Zero (&mbState, sizeof (mbState)); const char *src = str.c_str(); size_t size = mbsrtowcs (nullptr, &src, 0, &mbState); if (size == (size_t) -1) throw StringConversionFailed (SRC_POS); vector <wchar_t> buf (size + 1); Memory::Zero (&mbState, sizeof (mbState)); if ((size = mbsrtowcs (&buf[0], &src, buf.size(), &mbState)) == (size_t) -1) throw StringConversionFailed (SRC_POS); wstring s; s.insert (s.begin(), buf.begin(), buf.begin() + size); return s; } catch (...) { if (noThrow) return L""; throw; } } void StringConverter::ToWideBuffer (const wstring &str, wchar_t *buffer, size_t bufferSize) { if (str.length() < 1) { buffer[0] = 0; return; } BufferPtr ( (byte *) buffer, bufferSize).CopyFrom ( ConstBufferPtr ((byte *) (wstring (str).c_str()), (str.length() + 1) * sizeof (wchar_t) ) ); } string StringConverter::Trim (const string &str) { size_t start = 0; size_t end = str.size(); if (end < 1) return str; foreach (char c, str) { if (c > ' ') break; ++start; } foreach_reverse (char c, str) { if (c > ' ') break; --end; } return str.substr (start, end - start); } }