/* Derived from source code of TrueCrypt 7.1a, which is Copyright (c) 2008-2012 TrueCrypt Developers Association and which is governed by the TrueCrypt License 3.0. Modifications and additions to the original source code (contained in this file) and all other portions of this file are Copyright (c) 2013-2017 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 #include #include #include #include "BaseCom.h" #include "BootEncryption.h" #include "Dlgcode.h" #include "Registry.h" using namespace VeraCrypt; HRESULT CreateElevatedComObject (HWND hwnd, REFGUID guid, REFIID iid, void **ppv) { WCHAR monikerName[1024]; WCHAR clsid[1024]; BIND_OPTS3 bo; StringFromGUID2 (guid, clsid, sizeof (clsid) / 2); swprintf_s (monikerName, sizeof (monikerName) / 2, L"Elevation:Administrator!new:%s", clsid); memset (&bo, 0, sizeof (bo)); bo.cbStruct = sizeof (bo); bo.hwnd = hwnd; bo.dwClassContext = CLSCTX_LOCAL_SERVER; // Prevent the GUI from being half-rendered when the UAC prompt "freezes" it ProcessPaintMessages (hwnd, 5000); return CoGetObject (monikerName, &bo, iid, ppv); } BOOL ComGetInstanceBase (HWND hWnd, REFCLSID clsid, REFIID iid, void **tcServer) { BOOL r; if (IsUacSupported ()) { while (true) { r = CreateElevatedComObject (hWnd, clsid, iid, tcServer) == S_OK; if (r) break; else { if (IDRETRY == ErrorRetryCancel ("UAC_INIT_ERROR", hWnd)) continue; else break; } } } else { r = CoCreateInstance (clsid, NULL, CLSCTX_LOCAL_SERVER, iid, tcServer) == S_OK; if (!r) Error ("UAC_INIT_ERROR", hWnd); } return r; } DWORD BaseCom::CallDriver (DWORD ioctl, BSTR input, BSTR *output) { try { BootEncryption bootEnc (NULL); bootEnc.CallDriver (ioctl, (BYTE *) input, !(BYTE *) input ? 0 : ((DWORD *) ((BYTE *) input))[-1], (BYTE *) *output, !(BYTE *) *output ? 0 : ((DWORD *) ((BYTE *) *output))[-1]); } catch (SystemException &) { return GetLastError(); } catch (Exception &e) { e.Show (NULL); return ERROR_EXCEPTION_IN_SERVICE; } catch (...) { return ERROR_EXCEPTION_IN_SERVICE; } return ERROR_SUCCESS; } DWORD BaseCom::CopyFile (BSTR sourceFile, BSTR destinationFile) { if (!::CopyFileW (sourceFile, destinationFile, FALSE)) return GetLastError(); return ERROR_SUCCESS; } DWORD BaseCom::DeleteFile (BSTR file) { if (!::DeleteFileW (file)) return GetLastError(); return ERROR_SUCCESS; } BOOL BaseCom::IsPagingFileActive (BOOL checkNonWindowsPartitionsOnly) { return ::IsPagingFileActive (checkNonWindowsPartitionsOnly); } DWORD BaseCom::ReadWriteFile (BOOL write, BOOL device, BSTR filePath, BSTR *bufferBstr, unsigned __int64 offset, unsigned __int32 size, DWORD *sizeDone) { try { auto_ptr file (device ? new Device (filePath, !write) : new File (filePath, !write)); file->CheckOpened (SRC_POS); file->SeekAt (offset); if (write) { file->Write ((BYTE *) *bufferBstr, size); *sizeDone = size; } else { *sizeDone = file->Read ((BYTE *) *bufferBstr, size); } } catch (SystemException &) { return GetLastError(); } catch (Exception &e) { e.Show (NULL); return ERROR_EXCEPTION_IN_SERVICE; } catch (...) { return ERROR_EXCEPTION_IN_SERVICE; } return ERROR_SUCCESS; } DWORD BaseCom::GetFileSize (BSTR filePath, unsigned __int64 *pSize) { if (!pSize) return ERROR_INVALID_PARAMETER; try { std::wstring path (filePath); File file(filePath, true); file.CheckOpened (SRC_POS); file.GetFileSize (*pSize); } catch (SystemException &) { return GetLastError(); } catch (Exception &e) { e.Show (NULL); return ERROR_EXCEPTION_IN_SERVICE; } catch (...) { return ERROR_EXCEPTION_IN_SERVICE; } return ERROR_SUCCESS; } DWORD BaseCom::DeviceIoControl (BOOL readOnly, BOOL device, BSTR filePath, DWORD dwIoControlCode, BSTR input, BSTR *output) { try { auto_ptr file (device ? new Device (filePath, readOnly == TRUE) : new File (filePath, readOnly == TRUE)); file->CheckOpened (SRC_POS); if (!file->IoCtl (dwIoControlCode, (BYTE *) input, !(BYTE *) input ? 0 : ((DWORD *) ((BYTE *) input))[-1], (BYTE *) *output, !(BYTE *) *output ? 0 : ((DWORD *) ((BYTE *) *output))[-1])) { return GetLastError(); } } catch (SystemException &) { return GetLastError(); } catch (Exception &e) { e.Show (NULL); return ERROR_EXCEPTION_IN_SERVICE; } catch (...) { return ERROR_EXCEPTION_IN_SERVICE; } return ERROR_SUCCESS; } DWORD BaseCom::RegisterFilterDriver (BOOL registerDriver, int filterType) { try { BootEncryption bootEnc (NULL); bootEnc.RegisterFilterDriver (registerDriver ? true : false, (BootEncryption::FilterType) filterType); } catch (SystemE
<!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="https://www.veracrypt.fr/en/Home.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>
<img src="arrow_right.gif" alt=">>" style="margin-top: 5px">
<a href="Streebog.html">Streebog</a>
</p></div>

<div class="wikidoc">
<h1>Streebog</h1>
<p>Streebog is a family of two hash algorithms, Streebog-256 and Streebog-512, defined in the Russian national standard&nbsp;<a href="https://www.tc26.ru/research/polozhenie/GOST_R_34_11-2012_eng.pdf">GOST R 34.11-2012</a> Information Technology - Cryptographic
 Information Security - Hash Function. It is also described in <a href="https://tools.ietf.org/html/rfc6986">
RFC 6986</a>. It is the competitor of NIST SHA-3 standard.</p>
<p>VeraCrypt uses only Streebog-512 which has an output size of 512 bits.</p>
</div>
</body></html>