VeraCrypt
aboutsummaryrefslogtreecommitdiff
path: root/doc/html/Hash Algorithms.html
blob: 9e59aa66bc02a1c734429d64af900352c9b3f912 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>VeraCrypt - Free Open source disk encryption with strong security for the Paranoid</title>
<meta name="description" content="VeraCrypt is free open-source disk encryption software for Windows, Mac OS X and Linux. In case an attacker forces you to reveal the password, VeraCrypt provides plausible deniability. In contrast to file encryption, data encryption performed by VeraCrypt is real-time (on-the-fly), automatic, transparent, needs very little memory, and does not involve temporary unencrypted files."/>
<meta name="keywords" content="encryption, security"/>
<link href="styles.css" rel="stylesheet" type="text/css" />
</head>
<body>

<div>
<a href="Documentation.html"><img src="VeraCrypt128x128.png" alt="VeraCrypt"/></a>
</div>

<div id="menu">
	<ul>
	  <li><a href="Home.html">Home</a></li>
	  <li><a href="/code/">Source Code</a></li>
	  <li><a href="Downloads.html">Downloads</a></li>
	  <li><a class="active" href="Documentation.html">Documentation</a></li>
	  <li><a href="Donation.html">Donate</a></li>
	  <li><a href="https://sourceforge.net/p/veracrypt/discussion/" target="_blank">Forums</a></li>
	</ul>
</div>

<div>
<p>
<a href="Documentation.html">Documentation</a>
<img src="arrow_right.gif" alt=">>" style="margin-top: 5px">
<a href="Hash%20Algorithms.html">Hash Algorithms</a>
</p></div>

<div class="wikidoc">
<h1>Hash Algorithms</h1>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
In the Volume Creation Wizard, in the password change dialog window, and in the Keyfile Generator dialog window, you can select a hash algorithm. A user-selected hash algorithm is used by the VeraCrypt Random Number Generator as a pseudorandom &quot;mixing&quot; function,
 and by the header key derivation function (HMAC based on a hash function, as specified in PKCS #5 v2.0) as a pseudorandom function. When creating a new volume, the Random Number Generator generates the master key, secondary key (XTS mode), and salt. For more
 information, please see the section <a href="Random%20Number%20Generator.html" style="text-align:left; color:#0080c0; text-decoration:none.html">
Random Number Generator</a> and section <a href="Header%20Key%20Derivation.html" style="text-align:left; color:#0080c0; text-decoration:none.html">
Header Key Derivation, Salt, and Iteration Count</a>.</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
VeraCrypt currently supports the following hash algorithms:</div>
<ul style="text-align:left; margin-top:18px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
<li style="text-align:left; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px">
<a href="RIPEMD-160.html"><strong style="text-align:left.html">RIPEMD-160</strong></a>
</li><li style="text-align:left; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px">
<a href="SHA-256.html"><strong style="text-align:left.html">SHA-256</strong></a>
</li><li style="text-align:left; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px">
<a href="SHA-512.html"><strong style="text-align:left.html">SHA-512</strong></a>
</li><li style="text-align:left; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px">
<a href="Whirlpool.html"><strong style="text-align:left.html">Whirlpool</strong></a>
</li><li style="text-align:left; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px">
<strong style="text-align:left"><a href="Streebog.html">Streebog</a></strong>
</li></ul>
<p><a href="RIPEMD-160.html" style="text-align:left; color:#0080c0; text-decoration:none; font-weight:bold.html">Next Section &gt;&gt;</a></p>
</div><div class="ClearBoth"></div></body></html>
ring 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); burn (&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); } }