/* Most of the source code contained in this file is taken from the source code of TrueCrypt 7.0a, which is governed by the TrueCrypt License 3.0 that can be found in the file 'License.txt' in the folder 'TrueCrypt-License'. Modifications and additions to the original source code (contained in this file) and all other portions of this file are Copyright (c) 2009-2010 by Kih-Oskh or Copyright (c) 2012-2013 Josef Schneider Source code here is copied from 'Common/Format.c' with the following changes: - functions removed: GetVolumeDataAreaSize (BOOL hiddenVolume, uint64 volumeSize) TCFormatVolume (volatile FORMAT_VOL_PARAMETERS *volParams) FormatNtfs (int driveNo, int clusterSize) FormatExCallback (int command, DWORD subCommand, PVOID parameter) - variables removed: volatile BOOLEAN FormatExResult; - removed static linkage class from StartFormatWriteThread() and StopFormatWriteThread() - new functions: SetFormatSectorSize(uint32 sector_size) ------------------------------------------------------------------------------- Original legal notice of the TrueCrypt source: Legal Notice: Some portions of the source code contained in this file were derived 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) 2003-2010 TrueCrypt Developers Association and are governed by the TrueCrypt License 3.0 the full text of which is contained in the file License.txt included in TrueCrypt binary and source code distribution packages. */ #include #include #include "Tcdefs.h" #include "Common.h" #include "Crypto.h" #include "Random.h" #include "Volumes.h" #include "Apidrvr.h" #include "Dlgcode.h" #include "Language.h" #include "Progress.h" #include "Resource.h" #include "InitDataArea.h" int FormatWriteBufferSize = 1024 * 1024; static uint32 FormatSectorSize = 0; void SetFormatSectorSize(uint32 sector_size) { FormatSectorSize = sector_size; } int FormatNoFs (HWND hwndDlg, unsigned __int64 startSector, __int64 num_sectors, void * dev, PCRYPTO_INFO cryptoInfo, BOOL quickFormat) { int write_buf_cnt = 0; char sector[TC_MAX_VOLUME_SECTOR_SIZE], *write_buf; unsigned __int64 nSecNo = startSector; int retVal = 0; DWORD err; char temporaryKey[MASTER_KEYDATA_SIZE]; char originalK2[MASTER_KEYDATA_SIZE]; LARGE_INTEGER startOffset; LARGE_INTEGER newOffset; // Seek to start sector startOffset.QuadPart = startSector * FormatSectorSize; if (!SetFilePointerEx ((HANDLE) dev, startOffset, &newOffset, FILE_BEGIN) || newOffset.QuadPart != startOffset.QuadPart) { return ERR_OS_ERROR; } write_buf = (char *)TCalloc (FormatWriteBufferSize); if (!write_buf) return ERR_OUTOFMEMORY; VirtualLock (temporaryKey, sizeof (temporaryKey)); VirtualLock (originalK2, sizeof (originalK2)); memset (sector, 0, sizeof (sector)); // Remember the original secondary key (XTS mode) before generating a temporary one memcpy (originalK2, cryptoInfo->k2, sizeof (cryptoInfo->k2)); /* Fill the rest of the data area with random data */ if(!quickFormat) { /* Generate a random temporary key set to be used for "dummy" encryption that will fill the free disk space (data area) with random data. This is necessary for plausible deniability of hidden volumes. */ // Temporary master key if (!RandgetBytes (hwndDlg, temporaryKey, EAGetKeySize (cryptoInfo->ea), FALSE)) goto fail; // Temporary secondary key (XTS mode) if (!RandgetBytes (hwndDlg, cryptoInfo->k2, sizeof cryptoInfo->k2, FALSE)) goto fail; retVal = EAInit (cryptoInfo->ea, temporaryKey, cryptoInfo->ks); if (retVal != ERR_SUCCESS) goto fail; if (!EAInitMode (cryptoInfo)) { retVal = ERR_MODE_INIT_FAILED; goto fail; } while (num_sectors--) { if (WriteSector (dev, sector, write_buf, &write_buf_cnt, &nSecNo, cryptoInfo) == FALSE) goto fail; } if (!FlushFormatWriteBuffer (dev, write_buf, &write_buf_cnt, &nSecNo, cryptoInfo)) goto fail; } else nSecNo = num_sectors; UpdateProgressBar (nSecNo * FormatSectorSize); // Restore the original secondary key (XTS mode) in case NTFS format fails and the user wants to try FAT immediately memcpy (cryptoInfo->k2, originalK2, sizeof (cryptoInfo->k2)); // Reinitialize the encryption algorithm and mode in case NTFS format fails and the user wants to try FAT immediately retVal = EAInit (cryptoInfo->ea, cryptoInfo->master_keydata, cryptoInfo->ks); if (retVal != ERR_SUCCESS) goto fail; if (!EAInitMode (cryptoInfo)) { retVal = ERR_MODE_INIT_FAILED; goto fail; } burn (temporaryKey, sizeof(temporaryKey)); burn (originalK2, sizeof(originalK2)); VirtualUnlock (temporaryKey, sizeof (temporaryKey)); VirtualUnlock (originalK2, sizeof (originalK2)); TCfree (write_buf); return 0; fail: err = GetLastError(); burn (temporaryKey, sizeof(temporaryKey)); burn (originalK2, sizeof(originalK2)); VirtualUnlock (temporaryKey, sizeof (temporaryKey)); VirtualUnlock (originalK2, sizeof (originalK2)); TCfree (write_buf); SetLastError (err); return (retVal ? retVal : ERR_OS_ERROR); } BOOL WriteSector (void *dev, char *sector, char *write_buf, int *write_buf_cnt, __int64 *nSecNo, PCRYPTO_INFO cryptoInfo) { static __int32 updateTime = 0; (*nSecNo)++; memcpy (write_buf + *write_buf_cnt, sector, FormatSectorSize); (*write_buf_cnt) += FormatSectorSize; if (*write_buf_cnt == FormatWriteBufferSize && !FlushFormatWriteBuffer (dev, write_buf, write_buf_cnt, nSecNo, cryptoInfo)) return FALSE; if (GetTickCount () - updateTime > 25) { if (UpdateProgressBar (*nSecNo * FormatSectorSize)) return FALSE; updateTime = GetTickCount (); } return TRUE; } static volatile BOOL WriteThreadRunning; static volatile BOOL WriteThreadExitRequested; static HANDLE WriteThreadHandle; static byte *WriteThreadBuffer; static HANDLE WriteBufferEmptyEvent; static HANDLE WriteBufferFullEvent; static volatile HANDLE WriteRequestHandle; static volatile int WriteRequestSize; static volatile DWORD WriteRequestResult; static void __cdecl FormatWriteThreadProc (void *arg) { DWORD bytesWritten; SetThreadPriority (GetCurrentThread(), THREAD_PRIORITY_HIGHEST); while (!WriteThreadExitRequested) { if (WaitForSingleObject (WriteBufferFullEvent, INFINITE) == WAIT_FAILED) { handleWin32Error (NULL); break; } if (WriteThreadExitRequested) break; if (!WriteFile (WriteRequestHandle, WriteThreadBuffer, WriteRequestSize, &bytesWritten, NULL)) WriteRequestResult = GetLastError(); else WriteRequestResult = ERROR_SUCCESS; if (!SetEvent (WriteBufferEmptyEvent)) { handleWin32Error (NULL); break; } } WriteThreadRunning = FALSE; _endthread(); } BOOL StartFormatWriteThread () { DWORD sysErr; WriteBufferEmptyEvent = NULL; WriteBufferFullEvent = NULL; WriteThreadBuffer = NULL; WriteBufferEmptyEvent = CreateEvent (NULL, FALSE, TRUE, NULL); if (!WriteBufferEmptyEvent) goto err; WriteBufferFullEvent = CreateEvent (NULL, FALSE, FALSE, NULL); if (!WriteBufferFullEvent) goto err; WriteThreadBuffer = TCalloc (FormatWriteBufferSize); if (!WriteThreadBuffer) { SetLastError (ERROR_OUTOFMEMORY); goto err; } WriteThreadExitRequested = FALSE; WriteRequestResult = ERROR_SUCCESS; WriteThreadHandle = (HANDLE) _beginthread (FormatWriteT
<!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="ru" lang="ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>VeraCrypt - Бесплатное надёжное шифрование дисков с открытым исходным кодом</title>
<meta name="description" content="VeraCrypt это бесплатное программное обеспечение для шифрования дисков с открытым исходным кодом для Windows, Mac OS X (macOS) и Linux. В случае, если злоумышленник вынуждает вас раскрыть пароль, VeraCrypt обеспечивает правдоподобное отрицание наличия шифрования. В отличие от пофайлового шифрования, VeraCrypt шифрует данные в реальном времени (на лету), автоматически, прозрачно, требует очень мало памяти и не использует временные незашифрованные файлы."/>
<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">Начало</a></li>
	  <li><a href="/code/">Исходный код</a></li>
	  <li><a href="Downloads.html">Загрузить</a></li>
	  <li><a class="active" href="Documentation.html">Документация</a></li>
	  <li><a href="Donation.html">Поддержать разработку</a></li>
	  <li><a href="https://sourceforge.net/p/veracrypt/discussion/" target="_blank">Форум</a></li>
	</ul>
</div>

<div>
<p>
<a href="Documentation.html">Документация</a>
<img src="arrow_right.gif" alt=">>" style="margin-top: 5px">
<a href="Plausible%20Deniability.html">Правдоподобное отрицание наличия шифрования</a>
<img src="arrow_right.gif" alt=">>" style="margin-top: 5px">
<a href="Hidden%20Volume.html">Скрытый том</a>
</p></div>

<div class="wikidoc">
<h1>Скрытый том</h1>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
Возможны ситуации, когда кто-то заставит вас сообщить пароль от зашифрованного тома. В ряде случаев вы просто
не сможете отказаться это сделать (например, при вымогательстве). Благополучно выходить из таких ситуаций, не сообщая
пароль от тома с вашими данными, позволяет так называемый скрытый том.</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
<img src="Beginner's Tutorial_Image_024.png" alt="Макет стандартного тома VeraCrypt до и после создания в нём скрытого тома." width="606" height="412"></div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
<em style="text-align:left">Схема обычного тома VeraCrypt до и после создания внутри него скрытого тома.</em></div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
<br style="text-align:left">
Принцип такой: том VeraCrypt создается внутри другого тома VeraCrypt (в свободном месте тома). Даже если смонтирован
внешний том, невозможно гарантированно утверждать, есть ли внутри него скрытый том или его нет*, так как
свободное место в <em style="text-align:left">любом</em> томе VeraCrypt всегда заполняется случайными данными
при его создании**, и никакую часть (несмонтированного) скрытого тома нельзя отличить от случайных данных.
Обратите внимание, что VeraCrypt никак не модифицирует файловую систему (информацию о свободном месте и т. д.)
внутри внешнего тома.</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
<br style="text-align:left">
Пароль для скрытого тома должен существенно отличаться от пароля для внешнего тома. Перед созданием скрытого
тома следует скопировать во внешний том некоторое количество осмысленно выглядящих файлов, которые на самом деле
вам скрывать НЕ требуется.
Эти файлы нужны, чтобы ввести в заблуждение того, кто вынудит вас сообщить пароль. Вы сообщите только пароль
от внешнего тома, но не от скрытого. Файлы, действительно представляющие для вас ценность, останутся в
неприкосновенности в скрытом томе.</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
Скрытый том монтируется так же, как обычный том VeraCrypt: нажмите кнопку
<em style="text-align:left">Выбрать файл</em> или <em style="text-align:left">Выбрать устройство</em>,
выберите внешний (хост) том (важно: убедитесь, что этот том <em style="text-align:left">
не</em> смонтирован). Затем нажмите кнопку <em style="text-align:left">Смонтировать</em> и введите пароль
для скрытого тома. Какой том будет смонтирован – скрытый или внешний – определяется только введённым паролем
(то есть если введён пароль для внешнего тома, то будет смонтирован внешний том, а если указать пароль для скрытого,
то смонтируется скрытый том).</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
Используя введённый пароль, VeraCrypt сначала пытается расшифровать заголовок обычного тома. Если это не удаётся,
выполняется загрузка области, где может находиться заголовок скрытого тома (то есть байты 65 536&ndash;131 071,
содержащие исключительно случайные данные, если внутри тома нет скрытого тома), в ОЗУ и попытка расшифровать
её с помощью указанного пароля. Обратите внимание, что заголовки скрытых томов нельзя идентифицировать,
так как они выглядят как абсолютно случайные данные. Если заголовок успешно расшифрован (информацию о том, как
VeraCrypt определяет, успешно ли он расшифрован, см. в разделе <a href="Encryption%20Scheme.html" style="text-align:left; color:#0080c0; text-decoration:none.html">
Схема шифрования</a>), то из расшифрованного заголовка (который по-прежнему находится в ОЗУ) извлекаются
сведения о размере скрытого тома и выполняется монтирование скрытого тома (по его размеру также определяется
его смещение).</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
Скрытый том можно создавать внутри тома VeraCrypt любого типа, то есть внутри тома на основе файла или тома на
основе устройства (для этого требуются права администратора). Чтобы создать скрытый том VeraCrypt, в главном окне
программы нажмите кнопку <em style="text-align:left">Создать том</em> и выберите
<em style="text-align:left">Создать скрытый том VeraCrypt</em>. В окне мастера будет вся информация, необходимая
для успешного создания скрытого тома VeraCrypt.</div>
<div id="hidden_volume_size_issue" style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
При создании скрытого тома для неопытного пользователя может быть весьма затруднительно или даже вообще невозможно
установить размер скрытого тома так, чтобы тот не перекрывал данные во внешнем томе. Поэтому мастер создания
томов автоматически сканирует карту кластеров внешнего тома (перед созданием внутри него скрытого тома) и определяет
максимально возможный размер скрытого тома.***</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
В случае возникновения каких-либо проблем при создании скрытого тома, см. возможные решения в главе
<a href="Troubleshooting.html" style="text-align:left; color:#0080c0; text-decoration:none.html">
Устранение затруднений</a>.<br style="text-align:left">
<br style="text-align:left">
<br style="text-align:left">
Обратите внимание, что также можно создавать и загружать операционную систему, располагающуюся в скрытом томе
(см. раздел
<a href="Hidden%20Operating%20System.html" style="text-align:left; color:#0080c0; text-decoration:none.html">
Скрытая операционная система</a>, глава <a href="Plausible%20Deniability.html">
Правдоподобное отрицание наличия шифрования</a>).</div>
<hr align="left" size="1" width="189" style="text-align:left; height:0px; border-width:0px 1px 1px; border-style:solid; border-color:#000000">
<p><span style="text-align:left; font-size:10px; line-height:12px">* При условии, что были соблюдены все
инструкции мастера создания томов VeraCrypt, а также требования и меры предосторожности, указанные в подразделе
<a href="Security%20Requirements%20for%20Hidden%20Volumes.html" style="text-align:left; color:#0080c0; text-decoration:none.html">
Требования безопасности и меры предосторожности, касающиеся скрытых томов</a><em style="text-align:left">.</em></span><br style="text-align:left">
<span style="text-align:left; font-size:10px; line-height:12px">** При условии, что отключены опции
<em style="text-align:left">Быстрое форматирование</em> и <em style="text-align:left">Динамический</em>,
а также что том не содержит файловую систему, которая была зашифрована на месте (VeraCrypt не позволяет пользователю
создавать скрытый том внутри такого тома). Информацию о методе заполнения свободного пространства тома случайными
данными см. в главе
<a href="Technical%20Details.html" style="text-align:left; color:#0080c0; text-decoration:none.html">
Технические подробности</a>, раздел <a href="VeraCrypt%20Volume%20Format%20Specification.html" style="text-align:left; color:#0080c0; text-decoration:none.html">
Спецификация формата томов VeraCrypt</a><em style="text-align:left">.</em></span><br style="text-align:left">
<span style="text-align:left; font-size:10px; line-height:12px">*** Мастер сканирует карту кластеров, чтобы
определить размер непрерывной свободной области (если она есть), конец которого совпадает с концом внешнего тома.
Эта область вмещает скрытый том, поэтому её размером ограничивается максимально возможный размер скрытого тома.
В Linux и Mac OS X мастер фактически не сканирует карту кластеров, но драйвер обнаруживает любые данные, записанные
на внешний том, и использует их местоположение, как описано ранее.</span></p>
<p>&nbsp;</p>
<p><a href="Protection%20of%20Hidden%20Volumes.html" style="text-align:left; color:#0080c0; text-decoration:none; font-weight:bold.html">Следующий раздел &gt;&gt;</a></p>
</div><div class="ClearBoth"></div></body></html>