Compare commits

..
Author SHA1 Message Date
Mounir IDRASSI f9089b0202 Linux: improve AppImage portability
Bundle the FUSE2 userspace library inside the AppImage AppDir and make AppRun prefer APPDIR/usr/lib. This lets the bundled VeraCrypt binary resolve libfuse.so.2 on systems where FUSE2 userspace packages are no longer installed by default.

Name AppImage artifacts according to the GTK backend detected during the build. GTK3 builds keep the default VeraCrypt-<version>-<arch>.AppImage name, while GTK2 builds use a gtk2-legacy suffix to distinguish the legacy compatibility artifact.

Include immintrin.h in the Argon2 AVX2 implementation so GCC toolchains such as the one on CentOS 7 see the AVX2 intrinsic types when compiling with -mavx2.

Refs: https://github.com/veracrypt/VeraCrypt/issues/1595
2026-05-26 23:46:33 +09:00
Mounir IDRASSI 4ad36447b2 Linux: fix CentOS 6 build with GCC 4.4
CentOS 6 builds VeraCrypt with GCC 4.4.7 and -std=c++0x. That compiler does not support range-based for loops, and its libstdc++ does not provide std::string::back() or std::string::pop_back().

Avoid those constructs in the affected Unix/Linux code paths: use VeraCrypt's existing foreach helper when iterating PKCS#11 object handles, and use indexing plus erase() when trimming trailing slashes from PATH entries.

This keeps the code valid for newer Linux toolchains while restoring compatibility with the CentOS 6 build environment.
2026-05-26 21:04:52 +09:00
Mounir IDRASSI 9b20099255 Build: harden OpenWrt package input handling
Stage VeraCrypt and wxWidgets sources under the SDK package directory before rendering the OpenWrt package Makefile. The generated recipe now refers only to fixed package-local paths, so checkout and work directory names are no longer parsed as GNU Make syntax or passed unquoted through recipe source arguments.

Validate VeraCrypt and wxWidgets version tokens before substituting them into generated package metadata. This prevents unexpected Make metacharacters from entering the generated OpenWrt recipe while preserving normal dotted release versions.

Quote OpenWrt QEMU test container-size values with the existing shell quoting helper, matching the password handling and preventing user-supplied size text from being split or interpreted by the guest shell.
2026-05-26 18:16:33 +09:00
Mounir IDRASSI d0bc546614 OpenBSD: fix CLI build and PCSC exit handling
OpenBSD builds were relying on ggod to generate embedded resource
headers. That tool is not available on a stock OpenBSD 7.9 install,
and using base od directly is not a safe substitute because it emits
zero-padded decimal values such as 060 and 098. Those tokens are then
included in C++ source and parsed as octal constants, which either
changes values or fails compilation.

Use hexdump with an explicit unsigned-byte format for OpenBSD. It is
part of the base system and emits unpadded decimal byte values suitable
for the existing resource-header pipeline.

The text-mode binary also crashed on normal process exit on OpenBSD,
including after --version, --test, create, mount, list, and dismount.
GDB showed the crash in libpcsclite_real during SCardReleaseContext(),
called from the static SCardManager destructor. This happened even for
commands that did not use EMV or security-token support because the
static manager constructor eagerly initialized PC/SC at startup.

Avoid eager PC/SC initialization and exit-time finalization on OpenBSD.
The existing call sites still initialize PC/SC lazily when EMV/token
operations need it, while ordinary CLI commands no longer touch
pcsc-lite and no longer crash during static destruction.

Validated on OpenBSD 7.9 amd64 with:
- gmake NOGUI=1 -j2
- veracrypt --text --version
- veracrypt --text --test
- device-hosted create/mount/list/dismount smoke test through doas/vnd

Refs #1589.
Refs #1593.
2026-05-26 17:58:04 +09:00
Mounir IDRASSI 6774de941d OpenBSD: honor doas user for mount ownership and FUSE access
VeraCrypt derives the real (non-root) user from SUDO_UID/SUDO_GID
to set default mount-point ownership and the FUSE service access
filter. On OpenBSD, privileged commands are normally run through doas,
which exposes the invoking login name via DOAS_USER and does not set
the sudo variables. As a result, VeraCrypt launched through doas
attributes both to root instead of the invoking user.

When the sudo identity variables are absent, resolve DOAS_USER through
the password database and use that uid/gid for default mount-point
ownership and the VeraCrypt FUSE service access filter. sudo behavior
is unchanged.

This is a correctness fix for the doas launch path. It is not confirmed
to resolve the non-root ext2fs EACCES reported in the linked issues:
that failure occurs at the ext2fs layer reached through vnd, whose
backing-image I/O runs as root and is therefore already permitted by
the access filter.

Refs #1589.
Refs #1593.
2026-05-26 11:07:40 +09:00
Mounir IDRASSI 5d7a2a78b8 OpenBSD: fix device-hosted volume sizing
OpenBSD device length detection was returning the raw disk sector count from DIOCGPDINFO directly. That value is not bytes and it describes the physical/default disk label, which caused VeraCrypt to expose an incorrectly sized FUSE backing image through vnd for device-hosted volumes.

Use the current disklabel from DIOCGDINFO, derive the opened partition from the device minor number, and return the selected partition size in bytes. Keep the raw c partition on the whole-disk path by using DL_GETDSIZE there.

Also reject sector-misaligned device-hosted sizes during volume creation so new malformed OpenBSD device-hosted volumes are not created. Do not reject existing malformed headers at mount time, so users can still mount old OpenBSD-created volumes for recovery.

Refs #1589.

Refs #1593.
2026-05-26 11:04:54 +09:00
Mounir IDRASSI 0190270f9d Add OpenWrt package build and QEMU test scripts
Add OpenWrt SDK packaging under src/Build for console-only x86/64 builds. The build helper prepares the SDK, renders a local package recipe, builds VeraCrypt with the OpenWrt musl toolchain, uses wxWidgets 3.2.10 as static wxBase, enables FUSE3, and skips release self-tests during cross compilation.

Add a package template that installs the console binary, mount.veracrypt, and license files only. The package declares bash for mount.veracrypt and keeps runtime dependencies focused on the direct userland requirements.

Add a documented QEMU runtime test path that boots the matching OpenWrt image, installs the locally built package set with opkg, runs the VeraCrypt version and algorithm self-tests, and exercises a small filesystem=none container mount/unmount flow.

Allow wxbuild callers to pass WX_CONFIGURE_EXTRA_FLAGS so OpenWrt cross configure flags can be passed into the wxWidgets build without carrying an OpenWrt-specific source patch.
2026-05-26 10:39:21 +09:00
Mounir IDRASSI 3c771c07fc Windows: set version to 1.26.28.1 and update signed Windows drivers 2026-05-26 10:10:11 +09:00
Mounir IDRASSI a173a11cfe Linux: parallelize header KDF autodetection
Extend the Unix encryption thread pool to run key-derivation work items and use it when mounting volumes without an explicitly selected KDF. This brings Linux/macOS header PRF autodetection closer to the Windows path while keeping selected-KDF mounts unchanged.

Fixes #1610.
2026-05-25 21:54:14 +09:00
Mounir IDRASSI 66ddd29c91 Windows: report missing EFI boot loader clearly
When preparing UEFI system encryption, check for the standard Windows bootmgfw.efi path before reading it. If it is absent, show the existing VeraCrypt diagnostic instead of surfacing a generic file-not-found error from the elevated COM path.
2026-05-25 17:06:10 +09:00
Mounir IDRASSI 0d86b9b3e6 Document system favorite VHD startup limitation
Clarify that Windows startup-managed VHD/VHDX files, including Dev Drive backing images, cannot live on system favorite volumes because they are accessed before those volumes are mounted.

Document that native-boot VHD/VHDX files also cannot live on system favorite volumes and remain subject to the existing VeraCrypt pre-boot authentication limitation for operating systems installed within VHD/VHDX files.

Mention a delayed/retrying attach workaround for non-boot-critical VHD/VHDX files after VeraCryptSystemFavorites mounts the host volume.

Closes #1605.
2026-05-25 16:25:48 +09:00
Mounir IDRASSI 5bd9277970 Windows: fix MSI Start Menu folder upgrades
Use a stable VeraCrypt Start Menu folder for MSI installs instead of deriving it from the versioned product name. Refresh the shortcut component identities for the new folder location and add upgrade-time cleanup for old versioned VeraCrypt Start Menu folders while preserving folders that contain non-VeraCrypt content.

Fixes #1631.
2026-05-25 04:50:49 +09:00
Mounir IDRASSI 854f85f013 Linux: fix language loading when running as AppImage
Fixes #1624

The language file path was hardcoded to /usr/share/veracrypt/languages/
which doesn't exist inside an AppImage runtime. Language files are
actually located under $APPDIR/usr/share/veracrypt/languages/ when
running from an AppImage.

This affected both the language file loading in Resources.cpp and the
language enumeration in PreferencesDialog.cpp, causing the language
selection to show only "System default" and "English" regardless of
which translations were packaged in the AppImage.
2026-05-24 21:47:11 +09:00
Mounir IDRASSI fc2efd0b8f Linux: suppress redundant already-running dialog
When a second GUI process successfully notifies the running instance through the show-request FIFO, the handoff is not an error. Avoid showing the informational modal before exiting, and let the running instance restore the main window on any show request.

Also initialize the GTK indicator menu item pointers to NULL and guard the show/hide label update, preventing a latent crash in SetBackgroundMode when the indicator menu has not been built (e.g. background task disabled in preferences) -- a path made more reachable by the FIFO timer now invoking SetBackgroundMode unconditionally on incoming show requests.

Fixes #1447.

Closes #1745.

Refs #461.
2026-05-22 23:45:04 +09:00
Mounir IDRASSI d1f73ce429 Windows driver: queue volume flushes as ordered barriers
Route IRP_MJ_FLUSH_BUFFERS through EncryptedIoQueue for mounted writable non-system volumes. Flushes are represented as zero-length queue items handled by the I/O thread, so ZwFlushBuffersFile runs after earlier encrypted write fragments before completing to the caller.

Also perform a best-effort ZwFlushBuffersFile before closing writable mounted-volume host handles, after the encrypted I/O queue has drained, so clean dismount/shutdown paths push the host file or raw device before close.

This keeps the change focused on ordinary mounted-volume flush ordering and avoids system-encryption, boot-drive, and header-update paths.
2026-05-22 18:29:14 +09:00
Mounir IDRASSI 79bee911be Linux/macOS: enable quick format for file containers
Allow normal file-hosted containers to use quick format in the Unix volume creation path by sizing the host file with ftruncate before backup headers are written.

Enable the GUI checkbox for normal file containers and honor --quick in text mode. Update the Unix HTML documentation for the weaker deniability properties of sparse or unwritten host regions.
2026-05-22 10:46:30 +09:00
Mounir IDRASSI 1fd2fb06cd Build: avoid awk warning in version extraction 2026-05-21 23:43:49 +09:00
Mounir IDRASSI c3ce2db9ac Document fixed Argon2id header key size
Argon2id includes the requested output length in its computation, so deriving 192 bytes and using a prefix is not equivalent to deriving only the selected cipher's key material length. This differs from PBKDF2, where the prefix property made this detail invisible.

VeraCrypt derives the maximum header key material currently needed by the supported cipher/cascade set, which is 192 bytes, and then uses the required prefix for the selected encryption algorithm. For AES-XTS this means the first 64 bytes of the 192-byte Argon2id output are used.

Make this design rule explicit in code and documentation by introducing ARGON2_HEADER_KEYDATA_SIZE instead of relying implicitly on GetMaxPkcs5OutSize. If a future cipher or cascade requires more than 192 bytes, that must be handled as an explicit format/design change.

Document the 192-byte Argon2id header KDF output requirement so third-party implementations derive the same header key material.

References: https://github.com/veracrypt/VeraCrypt/issues/1614
2026-05-21 18:10:06 +09:00
Mr-UpdateandGitHub c4acb6a0be Update Language.de.xml (#1742)
* Update Language.de.xml

- Translation completed

* Update Language.de.xml
2026-05-21 08:27:49 +09:00
Mounir IDRASSI b97b0f2c06 macOS: fix TC_VERSION extraction in makefiles 2026-05-20 08:38:42 +02:00
Mounir IDRASSI 21f773cd6d docs: fix Argon2id default PIM 2026-05-20 14:33:06 +09:00
Mounir IDRASSI aaffec8b5c Windows: support new Microsoft EFI CA bootloaders
Embed both Microsoft UEFI CA 2011 and 2023 signed DCS EFI sets and select the 2023 set only when the firmware db trusts the required 2023 third-party CAs.

Fall back to the 2011 EFI set when firmware db state cannot be determined, preserving pre-existing compatibility behavior and recording the reason in HKLM diagnostics.

Refresh installed ESP modules during PostOOBE repair, keep backups before replacing existing DCS modules, and use the selected EFI set when creating rescue media.

Record the selected EFI bootloader resource set and selection reason in HKLM, allow larger firmware db variables on systems with many Secure Boot certificates, and remove diagnostic registry keys on uninstall.

Fix MSI SetupDLL COM typelib version constants so unregister targets the current Main and Format COM typelib versions.

References: https://github.com/veracrypt/VeraCrypt/issues/1655
2026-05-20 14:07:47 +09:00
Mounir IDRASSI 4f71883ac1 Windows: Add new signed EFI bootloader files (2011CA and 2023CA) 2026-05-20 14:05:27 +09:00
Mounir IDRASSIandGitHub 964ecde6a1 Linux: add Arch package build support (#1740) 2026-05-20 09:38:38 +09:00
Thomas De RockerandGitHub 86082f3bf5 Update Language.nl.xml (#1741) 2026-05-19 18:33:06 +09:00
Marius KjærstadandGitHub 1f256ae3f2 Update to Norwegian Bokmål translation (#1738)
* Update to Norwegian Bokmål translation

* Issues found by Idrassi
2026-05-19 13:25:03 +09:00
109 changed files with 3500 additions and 337 deletions
+4
View File
@@ -4,6 +4,10 @@
# CLion
.idea/
# Python build/test artifacts
__pycache__/
*.py[cod]
# VC Linux build artifacts
*.o
*.o0
+4 -4
View File
@@ -1671,12 +1671,12 @@
<entry lang="de" key="PIM_ARGON2_LARGE_WARNING">Sie haben einen Argon2-PIM-Wert gewählt, der größer ist als der Standardwert von VeraCrypt.\nBitte beachten Sie, dass dies mehr Arbeitsspeicher erfordern und zu einer deutlich langsameren Einbindung führen kann.</entry>
<entry lang="de" key="PIM_ARGON2_SMALL_WARNING">Sie haben einen Argon2-PIM-Wert gewählt, der kleiner als der Standardwert von VeraCrypt ist. Bitte beachten Sie, dass ein zu schwaches Passwort die Sicherheit beeinträchtigen kann.\n\nBestätigen Sie, dass Sie ein sicheres Passwort verwenden?</entry>
<entry lang="de" key="PIM_ARGON2_REQUIRE_LONG_PASSWORD">Das Passwort muss mindestens 20 Zeichen lang sein, damit der angegebene Argon2-PIM verwendet werden kann.\nKürzere Passwörter können nur verwendet werden, wenn der Argon2-PIM-Wert 12 oder größer ist.</entry>
<entry lang="en" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER">Mount NTFS volumes with an in-kernel Linux driver</entry>
<entry lang="en" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER_HELP">Linux only. When enabled and no explicit filesystem type was supplied, VeraCrypt probes the decrypted virtual device with blkid -p and mounts detected NTFS filesystems with an available in-kernel NTFS driver, bypassing mount helpers such as ntfs-3g. VeraCrypt uses ntfs when it is positively identified as a modern read/write driver or expected on Linux 7.1 or later, and otherwise uses ntfs3. If NTFS detection fails, VeraCrypt uses the normal automatic filesystem selection. If no supported in-kernel NTFS driver is available or loadable, mounting fails. This opt-in option can avoid suspend or hibernate hangs caused by frozen user-space FUSE filesystems.</entry>
<entry lang="en" key="LINUX_KERNEL_NTFS_DRIVER_UNAVAILABLE">No supported in-kernel NTFS driver is available or loadable. To use the system default NTFS backend, disable the NTFS kernel-driver preference or do not request kernel NTFS explicitly.</entry>
<entry lang="de" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER">NTFS-Volumes mit einem Linux-Kernel-Treiber einbinden</entry>
<entry lang="de" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER_HELP">Nur Linux. Wenn diese Option aktiviert ist und kein expliziter Dateisystemtyp angegeben wurde, untersucht VeraCrypt das entschlüsselte virtuelle Gerät mit 'blkid -p' und hängt erkannte NTFS-Dateisysteme mit einem verfügbaren NTFS-Treiber im Kernel ein, wobei Einhängehelfer wie ntfs-3g umgangen werden. VeraCrypt verwendet ntfs, wenn dieser eindeutig als moderner Lese-/Schreibtreiber identifiziert wird oder ab Linux-Kernel 7.1 erwartet wird, anderenfalls wird ntfs3 verwendet. Wenn die NTFS-Erkennung fehlschlägt, verwendet VeraCrypt die normale automatische Dateisystemauswahl. Wenn kein unterstützter NTFS-Treiber im Kernel verfügbar oder ladbar ist, schlägt das Einhängen fehl. Diese aktivierbare Option kann Hänger beim Suspendieren oder im Ruhezustand vermeiden, die durch eingefrorene FUSE-Dateisysteme im Benutzerbereich verursacht werden.</entry>
<entry lang="de" key="LINUX_KERNEL_NTFS_DRIVER_UNAVAILABLE">Es ist kein unterstützter NTFS-Kerneltreiber verfügbar oder ladbar. Um das standardmäßige NTFS-Backend des Systems zu verwenden, deaktivieren Sie die Einstellung für den NTFS-Kerneltreiber oder fordern Sie den NTFS-Treiber im Kernel nicht explizit an.</entry>
<entry lang="de" key="LINUX_EMERGENCY_UNMOUNT_WARNING">Das normale Aushängen des Volumes {0} ist fehlgeschlagen. Dies kann passieren, wenn Anwendungen noch Dateien oder Verzeichnisse auf dem Volume geöffnet haben oder wenn das zugrunde liegende Gerät getrennt wurde und die Einbindung veraltet ist.\n\nWenn das Gerät noch angeschlossen ist, wählen Sie „Nein“, schließen Sie die Anwendungen, die das Volume verwenden, und versuchen Sie erneut, das Volume auszuhängen.\n\nWenn das Gerät getrennt wurde oder die Einbindung veraltet ist, kann VeraCrypt eine Notfallbereinigung versuchen, indem es das Dateisystem verzögert trennt und VeraCrypt-Kernelobjekte entfernt oder deren Entfernung plant. Ausstehende Schreibvorgänge sind möglicherweise fehlgeschlagen, Daten können verloren gegangen sein, und die Bereinigung bleibt möglicherweise ausstehend, bis Anwendungen geöffnete Dateien schließen. Überprüfen Sie das Dateisystem mit 'fsck' oder dem entsprechenden Reparaturtool, bevor Sie es wieder verwenden.\n\nWeiter?</entry>
<entry lang="de" key="LINUX_EMERGENCY_UNMOUNTED">Die Notfallbereinigung für das Volume {0} wurde gestartet. Falls das Volume getrennt wurde, die Einbindung veraltet war oder Schreibvorgänge ausstehend waren, überprüfen Sie das Dateisystem mit 'fsck' oder dem entsprechenden Reparaturtool, bevor Sie es erneut verwenden.</entry>
<entry lang="de" key="FORMAT_STAGE_WRITING_DATA">Volumendaten werden erstellt. Bitte warten.</entry>
<entry lang="de" key="FORMAT_STAGE_WRITING_DATA">Volume-Daten werden erstellt. Bitte warten.</entry>
<entry lang="de" key="FORMAT_STAGE_WRITING_BACKUP_HEADER">Abschluss der Volume-Erstellung: Schreiben der Kopfdatensicherung.</entry>
<entry lang="de" key="FORMAT_STAGE_FLUSHING_DATA">Abschluss der Volume-Erstellung: Daten werden auf die Festplatte geschrieben. Bei großen Volumes oder langsamen Speichergeräten bzw. USB-Speichern kann dies einige Minuten dauern.</entry>
<entry lang="de" key="FORMAT_STAGE_FINISHED">Die Erstellung des Volumes wird abgeschlossen.</entry>
+67 -67
View File
@@ -11,7 +11,7 @@
<entry lang="nb" key="IDC_BROWSE">Bla &amp;gjennom...</entry>
<entry lang="nb" key="IDC_DESKTOP_ICON">Legg til VeraCrypt-ikon på &amp;skrivebordet</entry>
<entry lang="nb" key="IDC_DONATE">Doner nå...</entry>
<entry lang="nb" key="IDC_FILE_TYPE">Assosier .hc-fil&amp;utvidelsen med VeraCrypt</entry>
<entry lang="nb" key="IDC_FILE_TYPE">Tilknytt .hc-filutvidelsen &amp;med VeraCrypt</entry>
<entry lang="nb" key="IDC_OPEN_CONTAINING_FOLDER">&amp;Åpne målplasseringen når ferdig</entry>
<entry lang="nb" key="IDC_PROG_GROUP">Legg til VeraCrypt i &amp;Start-menyen</entry>
<entry lang="nb" key="IDC_SYSTEM_RESTORE">Opprett system&amp;gjenopprettingspunkt</entry>
@@ -29,7 +29,7 @@
<entry lang="nb" key="IDC_CIPHER_TEST">&amp;Test</entry>
<entry lang="nb" key="IDC_DEVICE_TRANSFORM_MODE_FORMAT">Opprett kryptert volum og formater det</entry>
<entry lang="nb" key="IDC_DEVICE_TRANSFORM_MODE_INPLACE">Krypter partisjonen på plass</entry>
<entry lang="nb" key="IDC_DISPLAY_KEYS">Vis genererte nøkler (deres deler)</entry>
<entry lang="nb" key="IDC_DISPLAY_KEYS">Vis genererte nøkler (deler av dem)</entry>
<entry lang="nb" key="IDC_DISPLAY_POOL_CONTENTS">Vis poolinnhold</entry>
<entry lang="nb" key="IDC_DOWNLOAD_CD_BURN_SOFTWARE">Last ned CD/DVD-brenneprogramvare</entry>
<entry lang="nb" key="IDC_FILE_CONTAINER">Opprett en kryptert filbeholder</entry>
@@ -82,15 +82,15 @@
<entry lang="nb" key="IDT_FORMAT_OPTIONS">Alternativer</entry>
<entry lang="nb" key="IDT_HASH_ALGO">Hash-algoritme</entry>
<entry lang="nb" key="IDT_HEADER_KEY">Hodenøkkel:</entry>
<entry lang="nb" key="IDT_LEFT">Venstre</entry>
<entry lang="nb" key="IDT_LEFT">Gjenstår</entry>
<entry lang="nb" key="IDT_MASTER_KEY">Hovednøkkel:</entry>
<entry lang="nb" key="IDT_MULTI_BOOT">Velg dette alternativet hvis det er installert to eller flere operativsystemer på denne datamaskinen.\n\nFor eksempel:\n- Windows XP og Windows XP\n- Windows XP og Windows Vista\n- Windows og Mac OS X\n- Windows og Linux\n- Windows, Linux og Mac OS X</entry>
<entry lang="nb" key="IDT_NON_SYS_DEVICE">Krypterer en ikke-systempartisjon på en intern eller ekstern disk (f.eks. en minnepinne). Kan eventuelt opprette et skjult volum.</entry>
<entry lang="nb" key="IDT_PARTIAL_POOL_CONTENTS">Gjeldende poolinnhold (delvis)</entry>
<entry lang="nb" key="IDT_PASS">Bestått</entry>
<entry lang="nb" key="IDT_PASS">Runde</entry>
<entry lang="nb" key="IDT_PASSWORD">Passord:</entry>
<entry lang="nb" key="IDT_PIM">Volum PIM:</entry>
<entry lang="nb" key="IDT_OLD_PIM">Volum PIM:</entry>
<entry lang="nb" key="IDT_PIM">Volum-PIM:</entry>
<entry lang="nb" key="IDT_OLD_PIM">Volum-PIM:</entry>
<entry lang="nb" key="IDT_PROGRESS">Fremdrift:</entry>
<entry lang="nb" key="IDT_RANDOM_POOL">Tilfeldig pool:</entry>
<entry lang="nb" key="IDT_SINGLE_BOOT">Velg dette alternativet hvis det bare er ett operativsystem installert på denne datamaskinen (selv om det har flere brukere).</entry>
@@ -112,7 +112,7 @@
<entry lang="nb" key="IDC_BROWSE_FILES">Bla gjennom...</entry>
<entry lang="nb" key="IDC_CACHE">Mellomlagre passord og nøkkelfil&amp;er i minnet</entry>
<entry lang="nb" key="IDC_CLOSE_BKG_TASK_WHEN_NOVOL">Avslutt når det ikke er noen monterte volum</entry>
<entry lang="nb" key="IDC_CLOSE_TOKEN_SESSION_AFTER_MOUNT">&amp;Lukk token sesjon (logg ut) etter at et volum er montert</entry>
<entry lang="nb" key="IDC_CLOSE_TOKEN_SESSION_AFTER_MOUNT">&amp;Lukk tokensesjon (logg ut) etter at et volum er montert</entry>
<entry lang="nb" key="IDC_COPY_EXPANDER">Inkluder VeraCrypt Volume Expander</entry>
<entry lang="nb" key="IDC_COPY_WIZARD">Inkluder Veiviser for VeraCrypt-volumopprettelse</entry>
<entry lang="nb" key="IDC_CREATE">Opprett</entry>
@@ -123,10 +123,10 @@
<entry lang="nb" key="IDC_ENABLE_KEYFILES">Bruk nøkkelfiler</entry>
<entry lang="nb" key="IDC_ENABLE_NEW_KEYFILES">Bruk nøkkelfiler</entry>
<entry lang="nb" key="IDC_EXIT">A&amp;vslutt</entry>
<entry lang="nb" key="IDC_FAVORITES_HELP_LINK">Hjelp om favorittvolum</entry>
<entry lang="nb" key="IDC_FAVORITE_DISABLE_HOTKEY">Ikke monter valgt volum når hurtigtasten 'Monter Favorittvolumer' trykkes</entry>
<entry lang="nb" key="IDC_FAVORITES_HELP_LINK">Hjelp om favorittvolumer</entry>
<entry lang="nb" key="IDC_FAVORITE_DISABLE_HOTKEY">Ikke monter valgt volum når &amp;hurtigtasten 'Monter favorittvolumer' trykkes</entry>
<entry lang="nb" key="IDC_FAVORITE_MOUNT_ON_ARRIVAL">Monter valgt volum når dets vertsenhet blir &amp;tilkoblet</entry>
<entry lang="nb" key="IDC_FAVORITE_MOUNT_ON_LOGON">Monter valgt volum ved pålog&amp;ning</entry>
<entry lang="nb" key="IDC_FAVORITE_MOUNT_ON_LOGON">Monter valgt volum ved påloggi&amp;ng</entry>
<entry lang="nb" key="IDC_FAVORITE_MOUNT_READONLY">Monter valgt volum som skrivebeskytt&amp;et</entry>
<entry lang="nb" key="IDC_FAVORITE_MOUNT_REMOVABLE">Monter valgt volum som fjern&amp;bart medium</entry>
<entry lang="nb" key="IDC_FAVORITE_MOVE_DOWN">Flytt &amp;ned</entry>
@@ -135,8 +135,8 @@
<entry lang="nb" key="IDC_FAVORITE_REMOVE">&amp;Fjern</entry>
<entry lang="nb" key="IDC_FAVORITE_USE_LABEL_IN_EXPLORER">Bruk favorittetiketten som stasjonsetikett i Filutforsker</entry>
<entry lang="nb" key="IDC_FAV_VOL_OPTIONS_GLOBAL_SETTINGS_BOX">Globale innstillinger</entry>
<entry lang="nb" key="IDC_HK_UNMOUNT_BALLOON_TOOLTIP">Vis ballongtips etter vellykket hurtigtast-demontering</entry>
<entry lang="nb" key="IDC_HK_UNMOUNT_PLAY_SOUND">Spill systemvarsellyd etter vellykket hurtigtast-demontering</entry>
<entry lang="nb" key="IDC_HK_UNMOUNT_BALLOON_TOOLTIP">Vis ballongtips etter vellykket demontering med hurtigtast</entry>
<entry lang="nb" key="IDC_HK_UNMOUNT_PLAY_SOUND">Spill systemvarsellyd etter vellykket demontering med hurtigtast</entry>
<entry lang="nb" key="IDC_HK_MOD_ALT">Alt</entry>
<entry lang="nb" key="IDC_HK_MOD_CTRL">Ctrl</entry>
<entry lang="nb" key="IDC_HK_MOD_SHIFT">Skift</entry>
@@ -174,19 +174,19 @@
<entry lang="nb" key="IDC_PRESERVE_TIMESTAMPS">Behold endringsdato på filbeholdere</entry>
<entry lang="nb" key="IDC_RESET_HOTKEYS">Nullstill</entry>
<entry lang="nb" key="IDC_SELECT_DEVICE">Velg en&amp;het...</entry>
<entry lang="nb" key="IDC_SELECT_FILE">Velg &amp;Fil...</entry>
<entry lang="nb" key="IDC_SELECT_PKCS11_MODULE">Velg &amp;Bibliotek...</entry>
<entry lang="nb" key="IDC_SELECT_FILE">Velg &amp;fil...</entry>
<entry lang="nb" key="IDC_SELECT_PKCS11_MODULE">Velg &amp;bibliotek...</entry>
<entry lang="nb" key="IDC_SHOW_PASSWORD_CHPWD_NEW">Vis passord</entry>
<entry lang="nb" key="IDC_SHOW_PASSWORD_CHPWD_ORI">Vis passord</entry>
<entry lang="nb" key="IDC_TRAVEL_OPEN_EXPLORER">Åpne &amp;Filutforsker-vindu for montert volum</entry>
<entry lang="nb" key="IDC_TRAV_CACHE_PASSWORDS">&amp;Mellomlagre passord i driverminne</entry>
<entry lang="nb" key="IDC_TRUECRYPT_MODE">&amp;TrueCrypt-modus</entry>
<entry lang="nb" key="IDC_UNMOUNTALL">Demonter &amp;Alle</entry>
<entry lang="nb" key="IDC_UNMOUNTALL">Demonter &amp;alle</entry>
<entry lang="nb" key="IDC_VOLUME_PROPERTIES">&amp;Volumegenskaper...</entry>
<entry lang="nb" key="IDC_VOLUME_TOOLS">&amp;Volumverktøy...</entry>
<entry lang="nb" key="IDC_WIPE_CACHE">&amp;Slett mellomlager</entry>
<entry lang="nb" key="IDD_DEFAULT_MOUNT_PARAMETERS">VeraCrypt monteringsparametere</entry>
<entry lang="nb" key="IDD_FAVORITE_VOLUMES">VeraCrypt favorittvolum</entry>
<entry lang="nb" key="IDD_FAVORITE_VOLUMES">VeraCrypt favorittvolumer</entry>
<entry lang="nb" key="IDD_HOTKEYS_DLG">VeraCrypt systemdekkende hurtigtaster</entry>
<entry lang="nb" key="IDD_MOUNT_DLG">VeraCrypt</entry>
<entry lang="nb" key="IDD_PASSWORDCHANGE_DLG">Endre passord eller nøkkelfiler</entry>
@@ -195,7 +195,7 @@
<entry lang="nb" key="IDD_PREFERENCES_DLG">VeraCrypt preferanser</entry>
<entry lang="nb" key="IDD_SYSENC_SETTINGS">VeraCrypt systemkrypteringsinnstillinger</entry>
<entry lang="nb" key="IDD_TOKEN_PREFERENCES">VeraCrypt preferanser for sikkerhetstoken</entry>
<entry lang="nb" key="IDD_TRAVELER_DLG">Oppsett for VeraCrypt reisedisk</entry>
<entry lang="nb" key="IDD_TRAVELER_DLG">Oppsett for VeraCrypt-reisedisk</entry>
<entry lang="nb" key="IDD_VOLUME_PROPERTIES">Egenskaper for VeraCrypt-volum</entry>
<entry lang="nb" key="IDM_ABOUT">Om</entry>
<entry lang="nb" key="IDM_ADD_REMOVE_VOL_KEYFILES">Legg til / fjern nøkkelfiler fra volum...</entry>
@@ -302,13 +302,13 @@
<entry lang="nb" key="IDT_TRAVEL_ROOT">Opprett reisediskfiler i (rotmappen til reisedisken):</entry>
<entry lang="nb" key="IDT_VOLUME">Volum</entry>
<entry lang="nb" key="IDT_WINDOWS_RELATED_SETTING">Windows</entry>
<entry lang="nb" key="IDC_ADD_KEYFILE_PATH">Legg til &amp;Sti...</entry>
<entry lang="nb" key="IDC_ADD_KEYFILE_PATH">Legg til &amp;sti...</entry>
<entry lang="nb" key="IDC_AUTO">&amp;Autotest alle</entry>
<entry lang="nb" key="IDC_CONTINUE">&amp;Fortsett</entry>
<entry lang="nb" key="IDC_DECRYPT">&amp;Dekrypter</entry>
<entry lang="nb" key="IDC_DELETE">&amp;Slett</entry>
<entry lang="nb" key="IDC_ENCRYPT">&amp;Krypter</entry>
<entry lang="nb" key="IDC_EXPORT">&amp;Eksport...</entry>
<entry lang="nb" key="IDC_EXPORT">&amp;Eksporter...</entry>
<entry lang="nb" key="IDC_GENERATE_AND_SAVE_KEYFILE">Generer og lagre nøkkelfil...</entry>
<entry lang="nb" key="IDC_GENERATE_KEYFILE">&amp;Generer tilfeldig nøkkelfil...</entry>
<entry lang="nb" key="IDC_GET_LANG_PACKS">Last ned språkpakke</entry>
@@ -428,7 +428,7 @@
<entry lang="nb" key="DEVICE_IN_USE_INFO">ADVARSEL: Noen av de monterte enhetene/partisjonene var allerede i bruk!\n\nÅ ignorere dette kan føre til uønskede resultater inkludert systemustabilitet.\n\nVi anbefaler sterkt at du lukker eventuelle programmer som kan bruke enhetene/partisjonene.</entry>
<entry lang="nb" key="DEVICE_PARTITIONS_ERR">Den valgte enheten inneholder partisjoner.\n\nFormatering av enheten kan føre til systemustabilitet og/eller datakorrupsjon. Velg en partisjon på enheten, eller fjern alle partisjoner på enheten for å la VeraCrypt formatere den sikkert.</entry>
<entry lang="nb" key="DEVICE_PARTITIONS_ERR_W_INPLACE_ENC_NOTE">Den valgte ikke-systemenheten inneholder partisjoner.\n\nKrypterte enhetsbaserte VeraCrypt-volum kan opprettes innenfor enheter som ikke inneholder noen partisjoner (inkludert harddisker og SSD-er). En enhet som inneholder partisjoner kan krypteres helt på plass (ved hjelp av en enkelt hovednøkkel) bare hvis det er disken der Windows er installert og hvorfra den starter.\n\nHvis du vil kryptere den valgte ikke-systemenheten ved hjelp av en enkel hovednøkkel, må du fjerne alle partisjoner på enheten først for å la VeraCrypt formatere den sikkert (formatering av en enhet som inneholder partisjoner kan føre til systemustabilitet og/eller datakorrupsjon). Alternativt kan du kryptere hver partisjon på disken individuelt (hver partisjon vil bli kryptert ved hjelp av en annen hovednøkkel).\n\nMerk: Hvis du vil fjerne alle partisjoner fra en GPT-disk, kan det hende du må konvertere den til en MBR-disk (ved bruk av f.eks. 'Datamaskinhåndtering'-verktøyet) for å fjerne skjulte partisjoner.</entry>
<entry lang="nb" key="WHOLE_NONSYS_DEVICE_ENC_CONFIRM">Advarsel: Hvis du krypterer hele enheten (i motsetning til å kryptere bare en partisjon på den), vil operativsystemer betrakte enheten som ny, tom og uformatert (den vil ikke inneholde en partisjonstabell) og kan spontant initialisere enheten (eller spørre deg om du vil gjøre det), som kan skade volumet. Videre vil det ikke være mulig å montere volumet konsekvent som favoritt (f.eks. når drivenummeret endres) eller å tilordne en favorittvolumetikett til den.\n\nFor å unngå dette kan du vurdere å opprette en partisjon på enheten og kryptere partisjonen i stedet.\n\nEr du sikker på at du vil kryptere hele enheten?</entry>
<entry lang="nb" key="WHOLE_NONSYS_DEVICE_ENC_CONFIRM">Advarsel: Hvis du krypterer hele enheten (i motsetning til å kryptere bare en partisjon på den), vil operativsystemer betrakte enheten som ny, tom og uformatert (den vil ikke inneholde en partisjonstabell) og kan spontant initialisere enheten (eller spørre deg om du vil gjøre det), som kan skade volumet. Videre vil det ikke være mulig å montere volumet konsekvent som favoritt (f.eks. når enhetsnummeret endres) eller å tilordne en favorittvolumetikett til den.\n\nFor å unngå dette kan du vurdere å opprette en partisjon på enheten og kryptere partisjonen i stedet.\n\nEr du sikker på at du vil kryptere hele enheten?</entry>
<entry lang="nb" key="AFTER_FORMAT_DRIVE_LETTER_WARN">VIKTIG: Vennligst husk at dette volumet IKKE kan monteres/tilgås ved å bruke stasjonsbokstaven %c:, som foreløpig er tildelt det!\n\nFor å montere dette volumet, klikk 'Automonter Enheter' i hovedvinduet til VeraCrypt (alternativt klikker du 'Velg Enhet' i hovedvinduet til VeraCrypt, velger denne partisjonen/enheten, og klikker 'Monter'). Volumet vil bli montert til en annen stasjonsbokstav, som du velger fra listen i hovedvinduet til VeraCrypt.\n\nDen opprinnelige stasjonsbokstaven %c: bør bare brukes i tilfelle du må fjerne krypteringen fra partisjonen/enheten (f.eks. hvis du ikke lenger trenger kryptering). I et slikt tilfelle, høyreklikk stasjonsbokstaven %c: i 'Datamaskin' (eller 'Min datamaskin')-listen og velg 'Formater'. Ellers bør stasjonsbokstaven %c: aldri brukes (med mindre du fjerner den, som beskrevet f.eks. i VeraCrypt FAQ, og tildeler den en annen partisjon/enhet).</entry>
<entry lang="nb" key="OS_NOT_SUPPORTED_FOR_NONSYS_INPLACE_ENC">På-plass-kryptering av ikke-systemvolum støttes ikke på versjonen av operativsystemet du bruker (det støttes bare på Windows Vista og senere versjoner av Windows).\n\nÅrsaken er at denne versjonen av Windows ikke støtter krymping av et filsystem (filsystemet må krympes for å gi plass til volummetadata og sikkerhetskopedata for volum).</entry>
<entry lang="nb" key="ONLY_NTFS_SUPPORTED_FOR_NONSYS_INPLACE_ENC">Den valgte partisjonen ser ikke ut til å inneholde et NTFS-filsystem. Bare partisjoner som inneholder et NTFS-filsystem kan krypteres på plass.\n\nMerk: Årsaken er at Windows ikke støtter krymping av andre typer filsystemer (filsystemet må krympes for å gi plass til volummetadata og sikkerhetskopidata for volum).</entry>
@@ -567,7 +567,7 @@
<entry lang="nb" key="MAX_HIDVOL_SIZE_GB">Maksimal mulig størrelse på skjult volum for dette volumet er %.2f GiB.</entry>
<entry lang="nb" key="MAX_HIDVOL_SIZE_TB">Maksimal mulig størrelse på skjult volum for dette volumet er %.2f TiB.</entry>
<entry lang="nb" key="MOUNTED_NOPWCHANGE">Volumpassord/nøkkelfiler kan ikke endres mens volumet er montert. Vennligst demonter volumet først.</entry>
<entry lang="nb" key="MOUNTED_NO_PKCS5_PRF_CHANGE">Hodenøkkel avledningsalgoritmen kan ikke endres mens volumet er montert. Vennligst demonter volumet først.</entry>
<entry lang="nb" key="MOUNTED_NO_PKCS5_PRF_CHANGE">Avledningsalgoritmen for hodenøkkelen kan ikke endres mens volumet er montert. Vennligst demonter volumet først.</entry>
<entry lang="nb" key="MOUNT_BUTTON">&amp;Monter</entry>
<entry lang="nb" key="NEW_VERSION_REQUIRED">En nyere versjon av VeraCrypt er nødvendig for å montere dette volumet.</entry>
<entry lang="nb" key="VOL_CREATION_WIZARD_NOT_FOUND">Feil: Klarte ikke å finne veiviser for volumopprettelse.\n\nVennligst forsikre deg om at filen 'VeraCrypt Format.exe' befinner seg i mappen der hovedapplikasjonen VeraCrypt (VeraCrypt.exe) er plassert. Hvis den ikke er det, vennligst reinstaller VeraCrypt, eller lokaliser 'VeraCrypt Format.exe' på disken og kjør den.</entry>
@@ -609,14 +609,14 @@
<entry lang="nb" key="IDD_PCDM_CHANGE_PKCS5_PRF">Angi hodenøkkel avledningsalgoritme</entry>
<entry lang="nb" key="IDD_PCDM_ADD_REMOVE_VOL_KEYFILES">Legg til/Fjern nøkkelfiler fra Volum</entry>
<entry lang="nb" key="IDD_PCDM_REMOVE_ALL_KEYFILES_FROM_VOL">Fjern alle nøkkelfiler fra volum</entry>
<entry lang="nb" key="PASSWORD_CHANGED">Passord, PIM og/eller nøkkelfil(er) er endret med suksess.\n\nVIKTIG: Vennligst sørg for at du har lest seksjonen 'Endring av Passord og Nøkkelfiler' i kapitlet 'Sikkerhetskrav og Forholdsregler' i VeraCrypt Brukerveiledning.</entry>
<entry lang="nb" key="PASSWORD_CHANGED">Passord, PIM og/eller nøkkelfil(er) er endret.\n\nVIKTIG: Vennligst sørg for at du har lest seksjonen 'Endring av passord og nøkkelfiler' i kapitlet 'Sikkerhetskrav og forholdsregler' i VeraCrypt-brukerveiledningen.</entry>
<entry lang="nb" key="FAVORITE_PIM_CHANGED">Dette volumet er registrert som et System Favoritt og dets PIM ble endret.\nVil du at VeraCrypt automatisk oppdaterer System Favoritt-konfigurasjonen (administratorrettigheter nødvendig)?\n\nVennligst merk at hvis du svarer nei, må du oppdatere System Favoritten manuelt.</entry>
<entry lang="nb" key="SYS_PASSWORD_CHANGED_ASK_RESCUE_DISK">VIKTIG: Hvis du ikke har ødelagt VeraCrypt Redningsdisken din, kan systempartisjonen/disken fremdeles dekrypteres ved hjelp av det gamle passordet (ved å starte VeraCrypt Redningsdisk og skrive inn det gamle passordet). Du bør opprette en ny VeraCrypt Redningsdisk og deretter ødelegge den gamle.\n\nVil du opprette en ny VeraCrypt Redningsdisk?</entry>
<entry lang="nb" key="SYS_HKD_ALGO_CHANGED_ASK_RESCUE_DISK">Merk at VeraCrypt Redningsdisk fortsatt bruker den forrige algoritmen. Hvis du anser den forrige algoritmen som usikker, bør du opprette en ny VeraCrypt Redningsdisk og deretter ødelegge den gamle.\n\nVil du opprette en ny VeraCrypt Redningsdisk?</entry>
<entry lang="nb" key="KEYFILES_NOTE">Merk at VeraCrypt aldri endrer nøkkelfilinnholdet. Du kan velge mer enn en nøkkelfil (rekkefølgen spiller ingen rolle). Hvis du legger til en mappe, vil alle ikke-skjulte filer som finnes i den bli brukt som nøkkelfiler. Klikk 'Legg til Tokenfiler' for å velge nøkkelfiler lagret på sikkerhetstokens eller smartkort (eller for å importere nøkkelfiler til sikkerhetstokens eller smartkort).</entry>
<entry lang="nb" key="KEYFILE_CHANGED">Nøkkelfil(er) er lagt til/fjernet med suksess.</entry>
<entry lang="nb" key="KEYFILE_EXPORTED">Nøkkelfil er eksportert.</entry>
<entry lang="nb" key="PKCS5_PRF_CHANGED">Hodenøkkel avledningsalgoritmen er satt med suksess.</entry>
<entry lang="nb" key="KEYFILE_CHANGED">Nøkkelfil(er) er lagt til/fjernet.</entry>
<entry lang="nb" key="KEYFILE_EXPORTED">Nøkkelfilen er eksportert.</entry>
<entry lang="nb" key="PKCS5_PRF_CHANGED">Avledningsalgoritmen for hodenøkkelen er endret.</entry>
<entry lang="nb" key="NONSYS_INPLACE_ENC_RESUME_PASSWORD_PAGE_HELP">Vennligst skriv inn passordet og/eller nøkkelfil(er) for det ikke-systemvolumet hvor du ønsker å gjenoppta prosessen med kryptering/dekryptering på plass.\n\nMerknad: Etter at du klikker Neste, vil VeraCrypt forsøke å finne alle ikke-systemvolumer der krypteringen/dekrypteringen har blitt avbrutt og der VeraCrypt volummeta-data kunne dekodes ved bruk av de oppgitte passordet og/eller nøkkelfilene. Hvis mer enn ett volum finnes, vil du måtte velge ett av dem i neste trinn.</entry>
<entry lang="nb" key="NONSYS_INPLACE_ENC_RESUME_VOL_SELECT_HELP">Vennligst velg ett av de oppførte volumene. Listen inneholder hvert tilgjengelige ikke-systemvolum hvor krypterings-/dekrypteringsprosessen har blitt avbrutt og hvor volummeta-dataen ble vellykket dekodet ved bruk av det oppgitte passordet og/eller nøkkelfilene.</entry>
<entry lang="nb" key="NONSYS_INPLACE_DEC_PASSWORD_PAGE_HELP">Vennligst skriv inn passordet og/eller nøkkelfil(er) for det ikke-system VeraCrypt volumet du ønsker å dekryptere.</entry>
@@ -631,7 +631,7 @@
<entry lang="nb" key="PASSWORD_HIDVOL_TITLE">Passord til skjult volum</entry>
<entry lang="nb" key="PASSWORD_HIDDEN_OS_TITLE">Passord for skjult operativsystem</entry>
<entry lang="nb" key="PASSWORD_LENGTH_WARNING">ADVARSEL: Korte passord er lette å knekke ved bruk av brute force-teknikker!\n\nVi anbefaler å velge et passord som består av 20 eller flere tegn. Er du sikker på at du vil bruke et kort passord?</entry>
<entry lang="nb" key="PASSWORD_TITLE">Volum passord</entry>
<entry lang="nb" key="PASSWORD_TITLE">Volumpassord</entry>
<entry lang="nb" key="PASSWORD_WRONG">Operasjonen mislyktes på grunn av en eller flere av følgende:\n - Feil passord.\n - Feil Volum PIM nummer.\n - Feil PRF (hash).\n - Ikke et gyldig volum.</entry>
<entry lang="nb" key="PASSWORD_OR_KEYFILE_WRONG">Operasjonen mislyktes på grunn av en eller flere av følgende:\n - Feil nøkkelfil(er).\n - Feil passord.\n - Feil Volum PIM nummer.\n - Feil PRF (hash).\n - Ikke et gyldig volum.</entry>
<entry lang="nb" key="PASSWORD_OR_MODE_WRONG">Operasjonen mislyktes på grunn av en eller flere av følgende:\n - Feil monteringsmodus.\n - Feil passord.\n - Feil Volum PIM nummer.\n - Feil PRF (hash).\n - Ikke et gyldig volum.</entry>
@@ -649,7 +649,7 @@
<entry lang="nb" key="PIM_LARGE_WARNING">Du har valgt en PIM-verdi som er større enn VeraCrypt standardverdi.\nVennligst merk at dette vil føre til mye langsommere montering/oppstart.</entry>
<entry lang="nb" key="PIM_SMALL_WARNING">Du har valgt en PIM (Personal Iterations Multiplier) som er mindre enn den standard VeraCrypt verdien. Vennligst merk at hvis passordet ditt ikke er sterkt nok, kan dette føre til redusert sikkerhet.\n\nBekrefter du at du bruker et sterkt passord?</entry>
<entry lang="nb" key="PIM_SYSENC_TOO_BIG">Maksimalverdi for PIM (Personal Iterations Multiplier) for systemkryptering er 65535.</entry>
<entry lang="nb" key="PIM_TITLE">Volum PIM</entry>
<entry lang="nb" key="PIM_TITLE">Volum-PIM</entry>
<entry lang="nb" key="HIDDEN_FILES_PRESENT_IN_KEYFILE_PATH">\n\nADVARSEL: Skjulte filer har blitt funnet i en nøkkelfilsøkesti. Slike skjulte filer kan ikke brukes som nøkkelfiler. Hvis du trenger å bruke dem som nøkkelfiler, fjern deres 'Skjult'-attributt (høyreklikk hver av dem, velg 'Egenskaper', fjern 'Skjult' og klikk OK). Merk: Skjulte filer er synlige bare hvis det tilsvarende alternativet er aktivert (Datamaskin > Organiser > 'Mappe- og søkealternativer' > Visning).</entry>
<entry lang="nb" key="HIDDEN_VOL_PROT_PASSWORD_US_KEYB_LAYOUT">Hvis du forsøker å beskytte et skjult volum som inneholder et skjult system, vennligst sørg for at du bruker det standard amerikanske tastaturoppsettet når du skriver inn passordet for det skjulte volumet. Dette kreves på grunn av at passordet må tastes inn i pre-boot-miljøet (før Windows starter) der ikke-amerikanske tastaturoppsett ikke er tilgjengelige.</entry>
<entry lang="nb" key="FOUND_NO_PARTITION_W_DEFERRED_INPLACE_ENC">VeraCrypt har ikke funnet noe volum hvor prosessen med kryptering/dekryptering på plass har blitt avbrutt og hvor volummeta-data kunne dekodes ved bruk av det oppgitte passordet og/eller nøkkelfiler.\n\nVennligst forsikre deg om at passordet og/eller nøkkelfilene er korrekte og at partisjonen/volumet ikke brukes av systemet eller applikasjoner (inkludert antivirusprogramvare).</entry>
@@ -688,8 +688,8 @@
<entry lang="nb" key="TWO_LAYER_CASCADE_HELP">To chiffer i en kaskade som opererer i XTS-modus. Hver blokk er først kryptert med %s (%d-bit nøkkel) og deretter med %s (%d- bit nøkkel). Hvert chiffer bruker sin egen nøkkel. Alle nøkler er gjensidig uavhengige.</entry>
<entry lang="nb" key="THREE_LAYER_CASCADE_HELP">Tre chiffer i en kaskade som opererer i XTS-modus. Hver blokk er først kryptert med %s (%d-bit nøkkel), deretter med %s (%d-bit nøkkel), og til slutt med %s (%d-bit nøkkel). Hvert chiffer bruker sin egen nøkkel. Alle nøkler er gjensidig uavhengige.</entry>
<entry lang="nb" key="AUTORUN_MAY_NOT_ALWAYS_WORK">Merk at, avhengig av operativsystemets konfigurasjon, kan disse autokjør- og automonteringsfunksjonene bare virke når reisediskfilene er opprettet på et ikke-skrivbart CD/DVD-lignende medium. Vær oppmerksom på at dette ikke er en feil i VeraCrypt (det er en begrensning i Windows).</entry>
<entry lang="nb" key="TRAVELER_DISK_CREATED">VeraCrypt reisedisk har blitt opprettet.\n\nMerk at du trenger administratortillatelser for å kjøre VeraCrypt i bærbar modus. Vær også oppmerksom på at, etter å ha undersøkt registerfilen, kan det være mulig å fastslå at VeraCrypt ble kjørt på et Windows-system selv om det kjøres i bærbar modus.</entry>
<entry lang="nb" key="TC_TRAVELER_DISK">VeraCrypt reisedisk</entry>
<entry lang="nb" key="TRAVELER_DISK_CREATED">VeraCrypt-reisedisken er opprettet.\n\nMerk at du trenger administratortillatelser for å kjøre VeraCrypt i bærbar modus. Vær også oppmerksom på at det, etter å ha undersøkt registerfilen, kan være mulig å fastslå at VeraCrypt ble kjørt på et Windows-system selv om det kjøres i bærbar modus.</entry>
<entry lang="nb" key="TC_TRAVELER_DISK">VeraCrypt-reisedisk</entry>
<entry lang="nb" key="TWOFISH_HELP">Designet av Bruce Schneier, John Kelsey, Doug Whiting, David Wagner, Chris Hall og Niels Ferguson. Publisert i 1998. 256-bit nøkkel, 128-bit blokk. Operasjonsmodus er XTS. Twofish var en av AES-finalistene.</entry>
<entry lang="nb" key="MORE_INFO_ABOUT">Mer informasjon om %s</entry>
<entry lang="nb" key="UNKNOWN">Ukjent</entry>
@@ -838,7 +838,7 @@
<entry lang="nb" key="SETUP_FINISHED_TITLE_DON">VeraCrypt har blitt installert</entry>
<entry lang="nb" key="SETUP_FINISHED_UPGRADE_TITLE_DON">VeraCrypt har blitt oppgradert</entry>
<entry lang="nb" key="SETUP_FINISHED_INFO_DON">Vennligst vurdér å gi en donasjon. Du kan klikke Fullfør når som helst for å lukke installasjonsprogrammet.</entry>
<entry lang="nb" key="EXTRACTION_OPTIONS_TITLE">Pakk ut alternativer</entry>
<entry lang="nb" key="EXTRACTION_OPTIONS_TITLE">Alternativer for utpakking</entry>
<entry lang="nb" key="EXTRACTION_OPTIONS_INFO">Her kan du sette forskjellige alternativer for å kontrollere utpakkingsprosessen.</entry>
<entry lang="nb" key="EXTRACTION_PROGRESS_INFO">Vennligst vent mens filene blir pakket ut.</entry>
<entry lang="nb" key="EXTRACTION_FINISHED_TITLE_DON">Filer pakket ut</entry>
@@ -862,11 +862,11 @@
<entry lang="nb" key="CANT_VERIFY_PACKAGE_INTEGRITY">Kan ikke verifisere integriteten av denne distribusjonspakken.</entry>
<entry lang="nb" key="EXTRACTION_FAILED">Utpakking feilet.</entry>
<entry lang="nb" key="ROLLBACK">Installeringen har blitt rullet tilbake.</entry>
<entry lang="nb" key="INSTALL_OK">VeraCrypt har blitt installert.</entry>
<entry lang="nb" key="SETUP_UPDATE_OK">VeraCrypt har blitt oppdatert.</entry>
<entry lang="nb" key="UPGRADE_OK_REBOOT_REQUIRED">VeraCrypt har blitt oppgradert med suksess. Men før du kan begynne å bruke det, må datamaskinen startes på nytt.\n\nVil du starte den på nytt nå?</entry>
<entry lang="nb" key="INSTALL_OK">VeraCrypt er installert.</entry>
<entry lang="nb" key="SETUP_UPDATE_OK">VeraCrypt er oppdatert.</entry>
<entry lang="nb" key="UPGRADE_OK_REBOOT_REQUIRED">VeraCrypt er oppgradert. Før du kan begynne å bruke det, må datamaskinen startes på nytt.\n\nVil du starte den på nytt nå?</entry>
<entry lang="nb" key="SYS_ENC_UPGRADE_FAILED">Oppgradering av VeraCrypt mislyktes!\n\nVIKTIG: Før du slår av eller starter systemet på nytt, anbefaler vi sterkt at du bruker Systemgjenoppretting (Start-menyen > Alle programmer > Tilbehør > Systemverktøy > Systemgjenoppretting) for å gjenopprette systemet til gjenopprettingspunktet med navnet 'VeraCrypt-installering'. Hvis Systemgjenoppretting ikke er tilgjengelig, bør du prøve å installere den opprinnelige eller den nye versjonen av VeraCrypt igjen før du slår av eller starter systemet på nytt.</entry>
<entry lang="nb" key="UNINSTALL_OK">VeraCrypt har blitt avinstallert.\n\nKlikk 'Fullfør' for å fjerne VeraCrypt installasjonsprogrammet og mappen %s. Merk at mappen ikke vil bli fjernet hvis den inneholder filer som ikke ble installert av VeraCrypt installasjonsprogrammet eller opprettet av VeraCrypt.</entry>
<entry lang="nb" key="UNINSTALL_OK">VeraCrypt er avinstallert.\n\nKlikk 'Fullfør' for å fjerne VeraCrypt-installasjonsprogrammet og mappen %s. Merk at mappen ikke vil bli fjernet hvis den inneholder filer som ikke ble installert av VeraCrypt-installasjonsprogrammet eller opprettet av VeraCrypt.</entry>
<entry lang="nb" key="REMOVING_REG">Fjerner VeraCrypt registeroppføringer.</entry>
<entry lang="nb" key="ADDING_REG">Legger til registeroppføring.</entry>
<entry lang="nb" key="REMOVING_APPDATA">Fjern applikasjonsspesifikke data.</entry>
@@ -938,15 +938,15 @@
<entry lang="nb" key="ENTER_NORMAL_VOL_PASSWORD">Skriv inn passord for det normale/ytre volumet</entry>
<entry lang="nb" key="ENTER_HIDDEN_VOL_PASSWORD">Skriv inn passord for det skjulte volumet</entry>
<entry lang="nb" key="ENTER_HEADER_BACKUP_PASSWORD">Skriv inn passord for hodet lagret i sikkerhetskopifil</entry>
<entry lang="nb" key="KEYFILE_CREATED">Nøkkelfiler har blitt opprettet med suksess.</entry>
<entry lang="nb" key="KEYFILE_CREATED">Nøkkelfilene er opprettet.</entry>
<entry lang="nb" key="KEYFILE_INCORRECT_NUMBER">Antall nøkkelfiler du har oppgitt er ugyldig.</entry>
<entry lang="nb" key="KEYFILE_INCORRECT_SIZE">Nøkkelfilstørrelsen må være minst 64 byte.</entry>
<entry lang="nb" key="KEYFILE_EMPTY_BASE_NAME">Vennligst skriv inn et navn for nøkkelfilene som skal genereres</entry>
<entry lang="nb" key="KEYFILE_INVALID_BASE_NAME">Basisnavnet på nøkkelfilene er ugyldig</entry>
<entry lang="nb" key="KEYFILE_ALREADY_EXISTS">Nøkkelfilen '%s' eksisterer allerede.\nVil du overskrive den? Genereringsprosessen vil stoppes hvis du svarer Nei.</entry>
<entry lang="nb" key="HEADER_DAMAGED_AUTO_USED_HEADER_BAK">ADVARSEL: Hodet til dette volumet er skadet! VeraCrypt brukte automatisk sikkerhetskopien av volumhodet innebygd i volumet.\n\nDu bør reparere volumhodet ved å velge 'Verktøy' > 'Gjenopprett volumhodet'.</entry>
<entry lang="nb" key="VOL_HEADER_BACKED_UP">Volumhodet har blitt sikkerhetskopiert med suksess.\n\nVIKTIG: Å gjenopprette volumhodet ved bruk av denne sikkerhetskopifilen vil også gjenopprette gjeldende volumpassord. Dessuten, hvis nøkkelfil(er) er nødvendig for å montere volumet, vil de samme nøkkelfilene være nødvendige for å montere volumet igjen etter at volumhodet er gjenopprettet.\n\nADVARSEL: Denne sikkerhetskopien av volumhode kan bare brukes til å gjenopprette hodet til dette bestemte volumet. Hvis du bruker denne sikkerhetskopien av hodet for å gjenopprette hodet til et annet volum, vil du kunne montere volumet, men du vil IKKE kunne dekryptere noen data lagret i volumet (fordi du vil endre hovednøkkelen).</entry>
<entry lang="nb" key="VOL_HEADER_RESTORED">Volumhodet har blitt gjenopprettet med suksess.\n\nVIKTIG: Vennligst merk at et gammelt passord også kan ha blitt gjenopprettet. Dessuten, hvis nøkkelfil(er) var nødvendig for å montere volumet da sikkerhetskopien ble opprettet, vil de samme nøkkelfilene nå være nødvendige for å montere volumet igjen.</entry>
<entry lang="nb" key="VOL_HEADER_BACKED_UP">Volumhodet er sikkerhetskopiert.\n\nVIKTIG: Å gjenopprette volumhodet ved bruk av denne sikkerhetskopifilen vil også gjenopprette gjeldende volumpassord. Dessuten, hvis nøkkelfil(er) er nødvendig for å montere volumet, vil de samme nøkkelfilene være nødvendige for å montere volumet igjen etter at volumhodet er gjenopprettet.\n\nADVARSEL: Denne sikkerhetskopien av volumhodet kan bare brukes til å gjenopprette hodet til dette bestemte volumet. Hvis du bruker denne sikkerhetskopien for å gjenopprette hodet til et annet volum, vil du kunne montere volumet, men du vil IKKE kunne dekryptere data lagret i volumet (fordi du vil endre hovednøkkelen).</entry>
<entry lang="nb" key="VOL_HEADER_RESTORED">Volumhodet er gjenopprettet.\n\nVIKTIG: Vennligst merk at et gammelt passord også kan ha blitt gjenopprettet. Dessuten, hvis nøkkelfil(er) var nødvendig for å montere volumet da sikkerhetskopien ble opprettet, vil de samme nøkkelfilene nå være nødvendige for å montere volumet igjen.</entry>
<entry lang="nb" key="EXTERNAL_VOL_HEADER_BAK_FIRST_INFO">For sikkerhetsårsaker, må du skrive inn riktig passord (og/eller oppgi riktige nøkkelfiler) for volumet.\n\nMerk: Hvis volumet inneholder et skjult volum, må du først oppgi riktig passord (og/eller oppgi riktige nøkkelfiler) for det ytre volumet. Deretter, hvis du velger å sikkerhetskopiere hodet til det skjulte volumet, må du skrive inn riktig passord (og/eller oppgi riktige nøkkelfiler) for det skjulte volumet.</entry>
<entry lang="nb" key="CONFIRM_VOL_HEADER_BAK">Er du sikker på at du vil opprette sikkerhetskopi av volumhodet til %s?\n\nEtter å ha klikket Ja vil du bli bedt om å oppgi et filnavn for sikkerhetskopien av hodet.\n\nMerk: Både standard- og skjulte volumhoder vil bli kryptert med nytt salt og lagret i sikkerhetskopifilen. Hvis det ikke er noe skjult volum innenfor dette volumet, vil området reservert for det skjulte volumhodet i sikkerhetskopifilen bli fylt med tilfeldige data (for å beholde troverdig benektelse). Når du gjenoppretter volumhodet fra sikkerhetskopifilen, må du oppgi riktig passord (og/eller riktige nøkkelfiler) som var gyldig da sikkerhetskopien av volumhodet ble opprettet. Passordet (og/eller nøkkelfilene) vil også automatisk bestemme hvilken type volumhode som skal gjenopprettes, dvs. standard eller skjult (merk at VeraCrypt bestemmer typen gjennom prosessen med prøv-og-feil).</entry>
<entry lang="nb" key="CONFIRM_VOL_HEADER_RESTORE">Er du sikker på at du vil gjenopprette volumhodet til %s?\n\nADVARSEL: Å gjenopprette en volumhodet gjenoppretter også volumpassordet som var gyldig da sikkerhetskopien ble opprettet. Dessuten, hvis nøkkelfil(er) var nødvendig for å montere volumet da sikkerhetskopien ble opprettet, vil de samme nøkkelfilene være nødvendige for å montere volumet igjen etter at volumhodet er gjenopprettet.\n\nEtter å ha klikket Ja vil du velge sikkerhetskopifilen for hodet.</entry>
@@ -964,9 +964,9 @@
<entry lang="nb" key="RESCUE_DISK_NON_WIZARD_CREATION_BURN">Redningsdisk-avbildningen har blitt opprettet og lagret i denne filen:\n%s\n\nNå må du brenne Redningsdisk-avbildningen til en CD eller DVD.\n\nVIKTIG: Merk at filen må brennes til CD/DVD som en ISO-diskavbildning (ikke som en individuell fil). For informasjon om hvordan du gjør dette, vennligst se dokumentasjonen til CD/DVD-brenningsprogramvaren din.\n\nEtter at du har brent Redningsdisken, velger du 'System' > 'Verifiser Redningsdisk' for å sikre at den har blitt brent riktig.</entry>
<entry lang="nb" key="RESCUE_DISK_NON_WIZARD_CREATION_WIN_ISOBURN">Redningsdisk-avbildningen har blitt opprettet og lagret i denne filen:\n%s\n\nNå må du brenne Redningsdisk-avbildningen til en CD eller DVD.\n\nVil du starte Microsoft Windows Disc Image Burner nå?\n\nMerk: Etter at du har brent Redningsdisken, velger du 'System' > 'Verifiser Redningsdisk' for å sikre at den har blitt brent riktig.</entry>
<entry lang="nb" key="RESCUE_DISK_NON_WIZARD_CHECK_INSERT">Vennligst sett inn din VeraCrypt Redningsdisk og klikk OK for å verifisere den.</entry>
<entry lang="nb" key="RESCUE_DISK_NON_WIZARD_CHECK_PASSED">VeraCrypt Redningsdisk har blitt verifisert med suksess.</entry>
<entry lang="nb" key="RESCUE_DISK_NON_WIZARD_CHECK_FAILED">Kunne ikke verifisere at Redningsdisken har blitt brent riktig.\n\nHvis du har brent Redningsdisken, vennligst fjern og sett inn CD/DVD på nytt og prøv igjen. Hvis dette ikke hjelper, vennligst prøv annen CD/DVD-brenningsprogramvare og/eller medium.\n\nHvis du forsøkte å verifisere en VeraCrypt Redningsdisk opprettet for en annen master nøkkel, passord, salt, osv., vil en slik Redningsdisk alltid mislykkes i denne verifiseringen. For å opprette en ny Redningsdisk som er fullt kompatibel med din nåværende konfigurasjon, velg 'System' > 'Opprett Redningsdisk'.</entry>
<entry lang="nb" key="RESCUE_DISK_ISO_IMAGE_CHECK_PASSED">VeraCrypt Redningsdisk avbildning har blitt verifisert med suksess.</entry>
<entry lang="nb" key="RESCUE_DISK_NON_WIZARD_CHECK_PASSED">VeraCrypt-redningsdisken er verifisert.</entry>
<entry lang="nb" key="RESCUE_DISK_NON_WIZARD_CHECK_FAILED">Kunne ikke verifisere at redningsdisken er korrekt brent.\n\nHvis du har brent redningsdisken, vennligst fjern og sett inn CD/DVD på nytt og prøv igjen. Hvis dette ikke hjelper, vennligst prøv en annen CD/DVD-brenningsprogramvare og/eller et annet medium.\n\nHvis du forsøkte å verifisere en VeraCrypt-redningsdisk opprettet for en annen hovednøkkel, passord, salt, osv., vil en slik redningsdisk alltid mislykkes i denne verifiseringen. For å opprette en ny redningsdisk som er fullt kompatibel med din nåværende konfigurasjon, velg 'System' &gt; 'Opprett redningsdisk'.</entry>
<entry lang="nb" key="RESCUE_DISK_ISO_IMAGE_CHECK_PASSED">VeraCrypt-redningsdiskbildet er verifisert.</entry>
<entry lang="nb" key="RESCUE_DISK_ISO_IMAGE_CHECK_FAILED">Verifiseringen av Redningsdisk-avbildningen mislyktes.\n\nHvis du forsøkte å verifisere en Redningsdisk-avbildning opprettet for en annen master nøkkel, passord, salt, osv., vil en slik Redningsdisk-avbildning alltid mislykkes i denne verifiseringen. For å opprette en ny Redningsdisk-avbildning fullt kompatibel med din nåværende konfigurasjon, velg 'System' > 'Opprett Redningsdisk'.</entry>
<entry lang="nb" key="ERROR_CREATING_RESCUE_DISK">Feil ved oppretting av VeraCrypt Redningsdisk.</entry>
<entry lang="nb" key="CANNOT_CREATE_RESCUE_DISK_ON_HIDDEN_OS">VeraCrypt Redningsdisk kan ikke opprettes når et skjult operativsystem kjører.\n\nFor å opprette en VeraCrypt Redningsdisk, start avledningsoperativsystemet og velg deretter 'System' > 'Opprett Redningsdisk'.</entry>
@@ -1011,9 +1011,9 @@
<entry lang="nb" key="HK_AUTOMOUNT_DEVICES">Automonter enheter</entry>
<entry lang="nb" key="HK_UNMOUNT_ALL">Demonter alle</entry>
<entry lang="nb" key="HK_WIPE_CACHE">Slett mellomlager</entry>
<entry lang="nb" key="HK_UNMOUNT_ALL_AND_WIPE">Demonter alle &amp; slett mellomlager</entry>
<entry lang="nb" key="HK_FORCE_UNMOUNT_ALL_AND_WIPE">Tving demontering av alle &amp; slett mellomlager</entry>
<entry lang="nb" key="HK_FORCE_UNMOUNT_ALL_AND_WIPE_AND_EXIT">Tving demontering av alle, slett mellomlager &amp; avslutt</entry>
<entry lang="nb" key="HK_UNMOUNT_ALL_AND_WIPE">Demonter alle og slett mellomlager</entry>
<entry lang="nb" key="HK_FORCE_UNMOUNT_ALL_AND_WIPE">Tving demontering av alle og slett mellomlager</entry>
<entry lang="nb" key="HK_FORCE_UNMOUNT_ALL_AND_WIPE_AND_EXIT">Tving demontering av alle, slett mellomlager og avslutt</entry>
<entry lang="nb" key="HK_MOUNT_FAVORITE_VOLUMES">Monter favorittvolumer</entry>
<entry lang="nb" key="HK_SHOW_HIDE_MAIN_WINDOW">Vis/skjul hovedvinduet til VeraCrypt</entry>
<entry lang="nb" key="PRESS_A_KEY_TO_ASSIGN">(Klikk her og trykk en tast)</entry>
@@ -1066,7 +1066,7 @@
<entry lang="nb" key="UNMOUNT_ALL_TC_VOLUMES">Demonter alle VeraCrypt-volumer</entry>
<entry lang="nb" key="UAC_INIT_ERROR">VeraCrypt klarte ikke å få administratorrettigheter.</entry>
<entry lang="nb" key="ERR_ACCESS_DENIED">Tilgang ble nektet av operativsystemet.\n\nMulig årsak: Operativsystemet krever at du har lese/skrive-tillatelser (eller administratorrettigheter) for visse mapper, filer og enheter, for at du skal få lov til å lese og skrive data til/fra dem. Normalt er en bruker uten administratorrettigheter tillatt å opprette, lese og endre filer i sin Dokumenter-mappe.</entry>
<entry lang="nb" key="SECTOR_SIZE_UNSUPPORTED">Feil: Enheten bruker en unsupported sektorstørrelse.\n\nFor øyeblikket er det ikke mulig å opprette partisjons-/enhetsbaserte volumer på enheter som bruker sektorer større enn 4096 byte. Merk imidlertid at du kan opprette filbaserte volumer (beholdere) på slike enheter.</entry>
<entry lang="nb" key="SECTOR_SIZE_UNSUPPORTED">Feil: Enheten bruker en sektorstørrelse som ikke støttes.\n\nFor øyeblikket er det ikke mulig å opprette partisjons-/enhetsbaserte volumer på enheter som bruker sektorer større enn 4096 byte. Merk imidlertid at du kan opprette filbaserte volumer (beholdere) på slike enheter.</entry>
<entry lang="nb" key="SYSENC_UNSUPPORTED_SECTOR_SIZE_BIOS">For øyeblikket er det ikke mulig å kryptere et system installert på en disk som bruker en sektorstørrelse annen enn 512 bytes.</entry>
<entry lang="nb" key="NO_SPACE_FOR_BOOT_LOADER">VeraCrypt Boot Loader krever minst 32 KibiBytes ledig plass i begynnelsen av systemdisken (VeraCrypt Boot Loader trenger å lagre i dette området). Dessverre oppfyller ikke disken din denne betingelsen.\n\nVennligst IKKE rapporter dette som en feil eller et problem i VeraCrypt. For å løse dette problemet, må du repartisjonere disken din og la de første 32 KibiBytes stå ledig (i de fleste tilfeller må du slette og gjenopprette den første partisjonen). Vi anbefaler at du bruker Microsoft partisjonssjefen som er tilgjengelig f.eks. når du installerer Windows.</entry>
<entry lang="nb" key="FEATURE_UNSUPPORTED_ON_CURRENT_OS">Funksjonen støttes ikke på den versjonen av operativsystemet du bruker.</entry>
@@ -1079,7 +1079,7 @@
<entry lang="nb" key="SYS_LOADER_RESTORE_FAILED">Kunne ikke gjenopprette den opprinnelige systemlasteren.\n\nVennligst bruk din VeraCrypt Redningsdisk ('Reparasjon' > 'Gjenopprett opprinnelig systemlaster') eller Windows installasjonsmedium for å erstatte VeraCrypt Boot Loader med Windows systemlaster.</entry>
<entry lang="nb" key="SYS_LOADER_UNAVAILABLE_FOR_RESCUE_DISK">Den opprinnelige systemlasteren blir ikke lagret på redningsdisken (sannsynlig årsak: manglende sikkerhetskopifil).</entry>
<entry lang="nb" key="ERROR_MBR_PROTECTED">Kunne ikke skrive til MBR-sektoren.\n\nDin BIOS kan være konfigurert til å beskytte MBR-sektoren. Sjekk BIOS-innstillingene dine (trykk F2, Delete, eller Esc, etter at du slår på datamaskinen) for MBR/viruskontroller.</entry>
<entry lang="nb" key="BOOT_LOADER_FINGERPRINT_CHECK_FAILED">ADVARSEL: Valideringen av VeraCrypt bootloader-fingeravtrykket mislyktes!\nDin disk kan ha blitt manipulert av en angriper ("Evil Maid" angrep).\n\nDenne advarselen kan også bli utløst hvis du gjenopprettet VeraCrypt oppstartslaster ved å bruke en redningsdisk generert med en annen versjon.\n\nDet anbefales at du endrer passordet umiddelbart, som også vil gjenopprette den korrekte VeraCrypt bootloader. Det anbefales å reinstallere VeraCrypt og å ta tiltak for å unngå tilgang til denne maskinen fra uvedkommende.</entry>
<entry lang="nb" key="BOOT_LOADER_FINGERPRINT_CHECK_FAILED">ADVARSEL: Valideringen av VeraCrypts oppstartslaster-fingeravtrykk mislyktes!\nDisken kan ha blitt manipulert av en angriper ("Evil Maid"-angrep).\n\nDenne advarselen kan også bli utløst hvis du gjenopprettet VeraCrypt-oppstartslasteren ved å bruke en redningsdisk generert med en annen versjon.\n\nDet anbefales at du endrer passordet umiddelbart, som også vil gjenopprette den korrekte VeraCrypt-oppstartslasteren. Det anbefales å reinstallere VeraCrypt og å ta tiltak for å unngå tilgang til denne maskinen fra uvedkommende.</entry>
<entry lang="nb" key="BOOT_LOADER_VERSION_INCORRECT_PREFERENCES">Den nødvendige versjonen av VeraCrypt Boot Loader er for øyeblikket ikke installert. Dette kan forhindre at noen av innstillingene blir lagret.</entry>
<entry lang="nb" key="CUSTOM_BOOT_LOADER_MESSAGE_HELP"> Merk: I noen situasjoner kan det hende du ønsker å hindre en person (motstander) som ser deg starte datamaskinen fra å vite at du bruker VeraCrypt. Ovennevnte alternativer lar deg gjøre det ved å tilpasse VeraCrypt boot loader-skjermbildet. Hvis du aktiverer det første alternativet, vil ingen tekster bli vist av boot loaderen (ikke engang når du skriver inn feil passord). Datamaskinen vil se ut til å være "frosset" mens du kan skrive inn passordet ditt. I tillegg kan en tilpasset melding bli vist for å villede motstanderen. For eksempel, falske feilmeldinger som "Manglende operativsystem" (som vanligvis vises av Windows boot loader hvis den ikke finner noen Windows boot partisjon). Det er imidlertid viktig å merke seg at hvis motstanderen kan analysere innholdet på harddisken, kan han/hun fortsatt finne ut at den inneholder VeraCrypt boot loaderen.</entry>
<entry lang="nb" key="CUSTOM_BOOT_LOADER_MESSAGE_PROMPT">ADVARSEL: Vennligst husk at hvis du aktiverer dette alternativet, vil VeraCrypt boot loader ikke vise noen tekster (ikke engang når du skriver inn feil passord). Datamaskinen vil se ut til å være "frosset" (responsløs) mens du kan skrive inn passordet ditt (markøren vil IKKE bevege seg og ingen stjerner vil bli vist når du trykker en tast).\n\nEr du sikker på at du vil aktivere dette alternativet?</entry>
@@ -1113,8 +1113,8 @@
<entry lang="nb" key="KEYB_LAYOUT_SYS_ENC_EXPLANATION">Merk: Passordet må skrives i pre-boot-miljøet (før Windows starter) hvor ikke-amerikanske Windows-tastaturoppsett ikke er tilgjengelige. Derfor må passordet alltid skrives ved bruk av det standard amerikanske tastaturoppsettet. Det er imidlertid viktig å merke seg at du IKKE trenger et ekte amerikansk tastatur. VeraCrypt sørger automatisk for at du trygt kan skrive passordet (akkurat nå og i pre-boot-miljøet) selv om du IKKE har et ekte amerikansk tastatur.</entry>
<entry lang="nb" key="RESCUE_DISK_INFO">Før du kan kryptere partisjonen/disken, må du opprette en VeraCrypt Rescue Disk (VRD), som tjener følgende formål:\n\n- Hvis VeraCrypt Boot Loader, hovednøkkel eller andre kritiske data blir skadet, tillater VRD deg å gjenopprette det (merk imidlertid at du fortsatt må oppgi riktig passord da).\n\n- Hvis Windows blir skadet og ikke kan starte, tillater VRD deg å permanent dekryptere partisjonen/disken før Windows starter.\n\n- VRD vil inneholde en sikkerhetskopi av det nåværende innholdet på den første disksporet (som vanligvis inneholder en systemloader eller oppstartsstyrer) og vil tillate deg å gjenopprette det hvis nødvendig.\n\nVeraCrypt Rescue Disk ISO-bilde vil bli opprettet i den angitte plasseringen nedenfor.</entry>
<entry lang="nb" key="RESCUE_DISK_WIN_ISOBURN_PRELAUNCH_NOTE">Etter at du klikker OK, vil Microsoft Windows Disk Image Burner bli startet. Vennligst bruk den til å brenne VeraCrypt Rescue Disk ISO-bildet til en CD eller DVD.\n\nEtter at du har gjort det, gå tilbake til veiviseren for opprettelse av VeraCrypt-volumer og følg instruksjonene.</entry>
<entry lang="nb" key="RESCUE_DISK_BURN_INFO">Rescue Disk-bildet har blitt opprettet og lagret i filen:\n%s\n\nNå må du brenne det til en CD eller DVD.\n\n%lsEtter at du har brent Rescue Disk, klikk Neste for å verifisere at det har blitt riktig brent.</entry>
<entry lang="nb" key="RESCUE_DISK_BURN_INFO_NO_CHECK">Rescue Disk-bildet har blitt opprettet og lagret i filen:\n%s\n\nNå bør du enten brenne bildet til en CD/DVD eller flytte det til en sikker plassering for senere bruk.\n\n%lsKlikk Neste for å fortsette.</entry>
<entry lang="nb" key="RESCUE_DISK_BURN_INFO">Redningsdisk-bildet er opprettet og lagret i filen:\n%s\n\nNå må du brenne det til en CD eller DVD.\n\n%lsEtter at du har brent redningsdisken, klikk Neste for å verifisere at den ble korrekt brent.</entry>
<entry lang="nb" key="RESCUE_DISK_BURN_INFO_NO_CHECK">Redningsdisk-bildet er opprettet og lagret i filen:\n%s\n\nNå bør du enten brenne bildet til en CD/DVD eller flytte det til en sikker plassering for senere bruk.\n\n%lsKlikk Neste for å fortsette.</entry>
<entry lang="nb" key="RESCUE_DISK_BURN_INFO_NONWIN_ISO_BURNER">VIKTIG: Merk at filen må skrives til CD/DVD som et ISO-diskbilde (ikke som en individuell fil). For informasjon om hvordan du gjør det, vennligst referer til dokumentasjonen for CD/DVD-opptaksprogramvaren din. Hvis du ikke har noen CD/DVD-opptaksprogramvare som kan skrive ISO-diskbildet til en CD/DVD, klikk lenken nedenfor for å laste ned slik gratis programvare.\n\n</entry>
<entry lang="nb" key="LAUNCH_WIN_ISOBURN">Start Microsoft Windows Disk Image Burner</entry>
<entry lang="nb" key="RESCUE_DISK_BURN_NO_CHECK_WARN">ADVARSEL: Hvis du allerede opprettet en VeraCrypt Rescue Disk tidligere, kan den ikke gjenbrukes for denne systempartisjonen/disken fordi den ble opprettet for en annen hovednøkkel! Hver gang du krypterer en systempartisjon/disk, må du lage en ny VeraCrypt Rescue Disk for den selv om du bruker samme passord.</entry>
@@ -1173,11 +1173,11 @@
<entry lang="nb" key="CD_BURNER_NOT_PRESENT_WILL_CONNECT_LATER">Jeg vil koble til en CD/DVD-brenner til datamaskinen min senere. Avslutt prosessen nå.</entry>
<entry lang="nb" key="CD_BURNER_NOT_PRESENT_CONNECTED_NOW">En CD/DVD-brenner er tilkoblet datamaskinen min nå. Fortsett og skriv Rescue Disk.</entry>
<entry lang="nb" key="CD_BURNER_NOT_PRESENT_WILL_STORE_ISO_INFO">Vennligst følg disse trinnene:\n\n1) Koble til en flyttbar enhet, for eksempel en USB-minnepinne, til datamaskinen nå.\n\n2) Kopier filen for VeraCrypt Rescue Disk-bildet (%s) til den flyttbare enheten.\n\nHvis du trenger å bruke VeraCrypt Rescue Disk i fremtiden, vil du kunne koble den flyttbare enheten (som inneholder VeraCrypt Rescue Disk-bildet) til en datamaskin med en CD/DVD-brenner og opprette en oppstartbar VeraCrypt Rescue Disk ved å brenne bildet til en CD eller DVD. VIKTIG: Merk at filen for VeraCrypt Rescue Disk-bildet må skrives til CD/DVD som et ISO-diskbilde (ikke som en individuell fil).</entry>
<entry lang="nb" key="RESCUE_DISK_RECORDING_TITLE">Innspilling av Rescue Disk</entry>
<entry lang="nb" key="RESCUE_DISK_CREATED_TITLE">Rescue Disk opprettet</entry>
<entry lang="nb" key="RESCUE_DISK_RECORDING_TITLE">Brenning av redningsdisk</entry>
<entry lang="nb" key="RESCUE_DISK_CREATED_TITLE">Redningsdisk opprettet</entry>
<entry lang="nb" key="SYS_ENCRYPTION_PRETEST_TITLE">Systemkrypteringstest</entry>
<entry lang="nb" key="RESCUE_DISK_DISK_VERIFIED_TITLE">Rescue Disk verifisert</entry>
<entry lang="nb" key="RESCUE_DISK_VERIFIED_INFO">\nVeraCrypt Rescue Disk har blitt vellykket verifisert. Vennligst fjern den fra lagringsenheten nå og oppbevar den på et trygt sted.\n\nKlikk Neste for å fortsette.</entry>
<entry lang="nb" key="RESCUE_DISK_DISK_VERIFIED_TITLE">Redningsdisk verifisert</entry>
<entry lang="nb" key="RESCUE_DISK_VERIFIED_INFO">\nVeraCrypt-redningsdisken er verifisert. Vennligst fjern den fra lagringsenheten nå og oppbevar den på et trygt sted.\n\nKlikk Neste for å fortsette.</entry>
<entry lang="nb" key="REMOVE_RESCUE_DISK_FROM_DRIVE">ADVARSEL: Under de neste trinnene må ikke VeraCrypt Rescue Disk være i stasjonen. Ellers vil det ikke være mulig å fullføre trinnene riktig.\n\nVennligst fjern den fra stasjonen nå og oppbevar den på et trygt sted. Klikk deretter OK.</entry>
<entry lang="nb" key="PREBOOT_NOT_LOCALIZED">Advarsel: På grunn av tekniske begrensninger i pre-boot-miljøet, kan ikke tekster vist av VeraCrypt i pre-boot-miljøet (dvs. før Windows starter) lokaliseres. Brukergrensesnittet for VeraCrypt Boot Loader er helt på engelsk.\n\nFortsette?</entry>
<entry lang="nb" key="SYS_ENCRYPTION_PRETEST_INFO">Før du krypterer systempartisjonen eller -disken, må VeraCrypt verifisere at alt fungerer som det skal.\n\nEtter at du klikker Test, vil alle nødvendige komponenter (for eksempel pre-boot autentiseringskomponenten, dvs. VeraCrypt Boot Loader) bli installert og datamaskinen vil starte på nytt. Da må du angi passordet ditt på VeraCrypt Boot Loader-skjermen som vil vises før Windows starter. Etter Windows starter, vil du automatisk bli informert om resultatet av forhåndstesten.\n\nFølgende enhet vil bli endret: Disk #%d\n\n\nHvis du klikker Avbryt nå, vil ingenting bli installert og forhåndstesten vil ikke bli utført.</entry>
@@ -1245,9 +1245,9 @@
<entry lang="nb" key="CONFIRM_CHANGE_WIZARD_MODE_TO_FILE_CONTAINER">Vil du opprette en VeraCrypt filbeholder i stedet?</entry>
<entry lang="nb" key="CONFIRM_SYSTEM_ENCRYPTION_MODE">Du har valgt systempartisjonen/disken (eller oppstartspartisjonen), men veivisermodusen du valgte er egnet bare for ikke-systempartisjoner/disks.\n\nVil du sette opp førstart-autentisering (som betyr at du må angi passordet ditt hver gang før Windows starter) og kryptere systempartisjonen/disken?</entry>
<entry lang="nb" key="CONFIRM_DECRYPT_SYS_DEVICE">Er du sikker på at du vil permanent dekryptere systempartisjonen/disken?</entry>
<entry lang="nb" key="CONFIRM_DECRYPT_SYS_DEVICE_CAUTION">ADVARSEL: Hvis du permanent dekrypterer systempartisjonen/disken, vil ukryptert data bli skrevet til den.\n\nEr du virkelig sikker på at du vil permanent dekryptere systempartisjonen/disken?</entry>
<entry lang="nb" key="CONFIRM_DECRYPT_SYS_DEVICE_CAUTION">ADVARSEL: Hvis du permanent dekrypterer systempartisjonen/disken, vil ukrypterte data bli skrevet til den.\n\nEr du virkelig sikker på at du vil permanent dekryptere systempartisjonen/disken?</entry>
<entry lang="nb" key="CONFIRM_DECRYPT_NON_SYS_DEVICE">Er du sikker på at du vil permanent dekryptere følgende volum?</entry>
<entry lang="nb" key="CONFIRM_DECRYPT_NON_SYS_DEVICE_CAUTION">ADVARSEL: Hvis du permanent dekrypterer VeraCrypt-volumet, vil ukryptert data bli skrevet til disken.\n\nEr du virkelig sikker på at du vil permanent dekryptere det valgte volumet?</entry>
<entry lang="nb" key="CONFIRM_DECRYPT_NON_SYS_DEVICE_CAUTION">ADVARSEL: Hvis du permanent dekrypterer VeraCrypt-volumet, vil ukrypterte data bli skrevet til disken.\n\nEr du virkelig sikker på at du vil permanent dekryptere det valgte volumet?</entry>
<entry lang="nb" key="CONFIRM_CASCADE_FOR_SYS_ENCRYPTION">Advarsel: Hvis du bruker en kaskade av chiffer for systemkryptering, kan du oppleve følgende problemer:\n\n1) VeraCrypt Boot Loader er større enn normalt, og derfor er det ikke nok plass i det første spor på disken for en sikkerhetskopi av VeraCrypt Boot Loader. Derfor, når den blir skadet (som ofte skjer, for eksempel under upassende utformede antipirat-aktiveringsprosedyrer av visse programmer), vil du måtte bruke VeraCrypt Redningsdisk for å starte eller reparere VeraCrypt Boot Loader.\n\n2) På noen datamaskiner tar det lengre tid å gjenoppta fra dvalemodus.\n\nDisse potensielle problemene kan forhindres ved å velge en ikke-kaskade krypteringsalgoritme (f.eks. AES).\n\nEr du sikker på at du vil bruke en kaskade av chiffer?</entry>
<entry lang="nb" key="NOTE_CASCADE_FOR_SYS_ENCRYPTION">Hvis du opplever noen av de tidligere beskrevne problemene, dekrypter partisjonen/disken (hvis den er kryptert) og prøv deretter å kryptere den igjen ved å bruke en ikke-kaskade krypteringsalgoritme (f.eks. AES).</entry>
<entry lang="nb" key="UPDATE_TC_IN_DECOY_OS_FIRST">ADVARSEL: Av sikkerhetsgrunner bør du oppdatere VeraCrypt på dekosystemet før du oppdaterer det på det skjulte systemet.\n\nFor å gjøre det, start dekosystemet og kjør VeraCrypt installasjonsprogrammet fra det. Start deretter det skjulte systemet og kjør installasjonsprogrammet fra det også.\n\nMerk: Dekosystemet og det skjulte systemet deler en enkelt boot loader. Hvis du oppgraderte VeraCrypt bare på det skjulte systemet (men ikke på dekosystemet), vil dekosystemet inneholde en VeraCrypt-driver og VeraCrypt-programmer hvis versjonsnummer er forskjellig fra versjonsnummeret til VeraCrypt Boot Loader. En slik diskrepans kan indikere at det finnes et skjult operativsystem på denne datamaskinen.\n\n\nVil du fortsette?</entry>
@@ -1278,7 +1278,7 @@
<entry lang="nb" key="SECURITY_TOKEN_ERROR">Sikkerhetstoken feil</entry>
<entry lang="nb" key="CKR_PIN_INCORRECT">Passord for sikkerhetstoken er feil.</entry>
<entry lang="nb" key="CKR_DEVICE_MEMORY">Sikkerhetstoken har ikke nok minne/plass til å utføre den forespurte operasjonen.\n\nHvis du prøver å importere en nøkkelfil, bør du velge en mindre fil eller bruke en nøkkelfil generert av VeraCrypt (velg 'Verktøy' > 'Nøkkelfilgenerator').</entry>
<entry lang="nb" key="ALL_TOKEN_SESSIONS_CLOSED">Alle åpne sikkerhetstoken-sesjoner har blitt lukket.</entry>
<entry lang="nb" key="ALL_TOKEN_SESSIONS_CLOSED">Alle åpne sikkerhetstokensesjoner er lukket.</entry>
<entry lang="nb" key="SELECT_TOKEN_KEYFILES">Velg Sikkerhetstoken-nøkkelfiler</entry>
<entry lang="nb" key="TOKEN_SLOT_ID">Slot</entry>
<entry lang="nb" key="TOKEN_NAME">Token-navn</entry>
@@ -1412,9 +1412,9 @@
<entry lang="nb" key="IDC_SECURE_DESKTOP_PASSWORD_ENTRY">Bruk Sikkert Skrivebord for passordinntasting</entry>
<entry lang="nb" key="ERR_REFS_INVALID_VOLUME_SIZE">Volumfilstørrelsen spesifisert i kommandolinjen er inkompatibel med valgt ReFS-filsystem.</entry>
<entry lang="nb" key="IDC_EDIT_DCSPROP">Rediger Boot Loader-konfigurasjon</entry>
<entry lang="nb" key="IDC_SHOW_PLATFORMINFO">Vis EFI-plattformsinformasjon</entry>
<entry lang="nb" key="IDC_SHOW_PLATFORMINFO">Vis EFI-plattforminformasjon</entry>
<entry lang="nb" key="BOOT_LOADER_CONFIGURATION_FILE">Boot Loader-konfigurasjonsfil</entry>
<entry lang="nb" key="EFI_PLATFORM_INFORMATION">EFI-plattformsinformasjon</entry>
<entry lang="nb" key="EFI_PLATFORM_INFORMATION">EFI-plattforminformasjon</entry>
<entry lang="nb" key="EDIT_DCSPROP_FOR_ADVANCED_ONLY">ADVARSEL: Uerfarne brukere bør aldri forsøke å manuelt redigere Boot Loader-konfigurasjoner.\n\nFortsette?</entry>
<entry lang="nb" key="DCSPROP_XML_VALIDATION_FAILED">ADVARSEL: Kunne ikke verifisere XML-formatet til Boot Loader-konfigurasjonen. Vennligst sjekk dine modifikasjoner.</entry>
<entry lang="nb" key="IDT_ADVANCED_OPTIONS">Avanserte Alternativer</entry>
@@ -1443,9 +1443,9 @@
<entry lang="nb" key="HIDDEN_CREDS_SAME_AS_OUTER">Det skjulte volumet kan ikke ha samme passord, PIM og nøkkelfiler som det ytre volumet</entry>
<entry lang="nb" key="SYSENC_BITLOCKER_CONFLICT">VeraCrypt støtter ikke kryptering av en systemdisk som allerede er kryptert med BitLocker.</entry>
<entry lang="nb" key="IDC_UPDATE_BOOTLOADER_ON_SHUTDOWN">Fiks automatisk oppstartskonfigurasjonsproblemer som kan forhindre at Windows starter</entry>
<entry lang="nb" key="IDC_FORCE_NEXT_BOOT_VERACRYPT">Tving maskinen til å starte VeraCrypt ved neste oppstart</entry>
<entry lang="nb" key="IDC_FORCE_VERACRYPT_BOOT_ENTRY">Tving tilstedeværelsen av VeraCrypt-oppføringen i EFI-firmware bootmenyen</entry>
<entry lang="nb" key="IDC_FORCE_VERACRYPT_FIRST_BOOT_ENTRY">Tving VeraCrypt-oppføringen til å være den første i EFI-firmware bootmenyen</entry>
<entry lang="nb" key="IDC_FORCE_NEXT_BOOT_VERACRYPT">Tving maskinen til å starte opp i VeraCrypt ved neste oppstart</entry>
<entry lang="nb" key="IDC_FORCE_VERACRYPT_BOOT_ENTRY">Tving tilstedeværelsen av VeraCrypt-oppføringen i EFI-fastvarens oppstartsmeny</entry>
<entry lang="nb" key="IDC_FORCE_VERACRYPT_FIRST_BOOT_ENTRY">Tving VeraCrypt-oppføringen til å være den første i EFI-fastvarens oppstartsmeny</entry>
<entry lang="nb" key="RAM_ENCRYPTION_DISABLE_HIBERNATE">ADVARSEL: RAM-kryptering er ikke kompatibel med Windows Hvilemodus og Windows Hurtigoppstart-funksjoner. VeraCrypt må deaktivere dem før du aktiverer RAM-kryptering.\n\nFortsette?</entry>
<entry lang="nb" key="CONFIRM_DISABLE_FAST_STARTUP">ADVARSEL: Windows Hurtigoppstart er aktivert og det er kjent for å forårsake problemer når du arbeider med VeraCrypt volumer. Det anbefales å deaktivere det for bedre sikkerhet og brukervennlighet.\n\nVil du deaktivere Windows Hurtigoppstart?</entry>
<entry lang="nb" key="QUICK_FORMAT_HELP">For å gjøre det mulig for operativsystemet å montere ditt nye volum, må det formateres med et filsystem. Vennligst velg en filsystemtype.\n\nHvis volumet ditt skal være vert på en enhet eller partisjon, kan du bruke 'Hurtigformatering' for å hoppe over kryptering av ledig plass på volumet.</entry>
@@ -1475,7 +1475,7 @@
<entry lang="nb" key="LINUX_CROSS_SUPPORT_ONLY">Jeg skal montere volumet kun på {0}</entry>
<entry lang="nb" key="LINUX_CROSS_SUPPORT_ONLY_HELP">Velg dette alternativet hvis du ikke trenger å bruke volumet på andre plattformer.</entry>
<entry lang="nb" key="LINUX_DESELECT">Fjern merking</entry>
<entry lang="nb" key="LINUX_ADMIN_PW_QUERY">Angi ditt brukernavn eller administratorpassord:</entry>
<entry lang="nb" key="LINUX_ADMIN_PW_QUERY">Skriv inn bruker- eller administratorpassordet ditt:</entry>
<entry lang="nb" key="LINUX_ADMIN_PW_QUERY_TITLE">Administratorrettigheter kreves</entry>
<entry lang="nb" key="LINUX_VC_RUNNING_ALREADY">VeraCrypt kjører allerede.</entry>
<entry lang="nb" key="LINUX_SYSTEM_ENC_PW_LENGTH_NOTE">Systemkrypteringspassord er lengre enn {0} tegn.</entry>
@@ -1486,13 +1486,13 @@
<entry lang="nb" key="LINUX_UNMOUNT_ALL_WHEN">Demonter alle volumer når</entry>
<entry lang="nb" key="LINUX_ENTERING_POWERSAVING">Systemet går inn i strømsparingsmodus</entry>
<entry lang="nb" key="LINUX_LOGIN_ACTION">Handlinger å utføre når brukeren logger inn</entry>
<entry lang="nb" key="LINUX_CLOSE_EXPL_ON_UNMOUNT">Lukk alle Utforsker-vinduer til volumet som demonteres</entry>
<entry lang="nb" key="LINUX_CLOSE_EXPL_ON_UNMOUNT">Lukk alle Utforsker-vinduer for volumet som demonteres</entry>
<entry lang="nb" key="LINUX_HOTKEYS">Hurtigtaster</entry>
<entry lang="nb" key="LINUX_SYSTEM_HOTKEYS">System-omfattende Hurtigtaster</entry>
<entry lang="nb" key="LINUX_SOUND_NOTIFICATION">Spill av systemvarsellyd etter montering/demontering</entry>
<entry lang="nb" key="LINUX_CONFIRM_AFTER_UNMOUNT">Vis bekreftelsesmeldingsboks etter demontering</entry>
<entry lang="nb" key="LINUX_VC_QUITS">VeraCrypt avsluttes</entry>
<entry lang="nb" key="LINUX_OPEN_FINDER">Åpne Finder-vindu for vellykket montert volum</entry>
<entry lang="nb" key="LINUX_OPEN_FINDER">Åpne Finder-vindu for monterte volumer</entry>
<entry lang="nb" key="LINUX_DISABLE_KERNEL_ONLY_SETTING">Vennligst merk at denne innstillingen trer i kraft kun hvis bruk av kjernekryptografiske tjenester er deaktivert.</entry>
<entry lang="nb" key="LINUX_DISABLE_KERNEL_CRYPT_CONFIRM">Deaktivering av bruk av kjernekryptografiske tjenester kan redusere ytelsen.\n\nEr du sikker?</entry>
<entry lang="nb" key="LINUX_KERNEL_CRYPT_OPTION_CHANGE_MOUNTED_HINT">Vennligst merk at deaktivering av dette alternativet kanskje ikke har noen effekt på volumer som er montert ved bruk av kjernekryptografiske tjenester.</entry>
@@ -1573,7 +1573,7 @@
<entry lang="nb" key="SYS_ENCRYPTION_UPGRADE_UNSUPPORTED_ALGORITHM">VeraCrypt kan ikke oppgraderes fordi systempartisjonen/disken ble kryptert ved bruk av en algoritme som ikke støttes lenger.\nVennligst dekrypter systemet ditt før du oppgraderer VeraCrypt og deretter krypter det igjen.</entry>
<entry lang="nb" key="LINUX_EX2MSG_TERMINALNOTFOUND">Støttet terminalprogram kunne ikke bli funnet, du trenger enten xterm, konsole eller gnome-terminal (med dbus-x11).</entry>
<entry lang="nb" key="IDM_MOUNT_NO_CACHE">Monter uten mellomlager</entry>
<entry lang="nb" key="EXPANDER_INFO">:: VeraCrypt Expander ::\n\nUtvid et VeraCrypt-volum mens det er i drift uten å omformatere\n\n\nAlle typer volumer (beholderfiler, disker og partisjoner) formatert med NTFS støttes. Den eneste forutsetningen er at det må være nok ledig plass på vertsenheten eller vertsdisken til VeraCrypt-volumet.\n\nIkke bruk denne programvaren for å utvide et ytre volum som inneholder et skjult volum, da dette ødelegger det skjulte volumet!</entry>
<entry lang="nb" key="EXPANDER_INFO">:: VeraCrypt Expander ::\n\nUtvid et VeraCrypt-volum uten å reformatere\n\n\nAlle typer volumer (beholderfiler, disker og partisjoner) formatert med NTFS støttes. Den eneste forutsetningen er at det må være nok ledig plass på vertsenheten eller vertsdisken til VeraCrypt-volumet.\n\nIkke bruk denne programvaren for å utvide et ytre volum som inneholder et skjult volum, da dette ødelegger det skjulte volumet!</entry>
<entry lang="nb" key="IDC_STEPSEXPAND">1. Velg VeraCrypt-volumet som skal utvides\n2. Klikk på 'Monter'-knappen</entry>
<entry lang="nb" key="IDT_VOL_NAME">Volum: </entry>
<entry lang="nb" key="IDT_FILE_SYS">Filsystem: </entry>
@@ -1585,7 +1585,7 @@
<entry lang="nb" key="IDT_INIT_SPACE">Fyll ny plass: </entry>
<entry lang="nb" key="EXPANDER_FREE_SPACE">%s ledig plass tilgjengelig på vertsdisken</entry>
<entry lang="nb" key="EXPANDER_HELP_DEVICE">Dette er et enhetsbasert VeraCrypt-volum.\n\nDen nye volumstørrelsen vil bli valgt automatisk som størrelsen på vertsenheten.</entry>
<entry lang="nb" key="EXPANDER_HELP_FILE">Vennligst spesifiser den nye størrelsen på VeraCrypt-volumet (må være minst %I64u KB større enn den nåværende størrelsen).</entry>
<entry lang="nb" key="EXPANDER_HELP_FILE">Vennligst spesifiser den nye størrelsen på VeraCrypt-volumet (må være minst %I64u KiB større enn den nåværende størrelsen).</entry>
<entry lang="nb" key="QUICK_EXPAND_WARNING">ADVARSEL: Du bør bruke rask utvidelse bare i følgende tilfeller:\n\n1) Enheten hvor filbeholderen er plassert inneholder ingen sensitive data og du trenger ikke troverdig benektelse.\n2) Enheten hvor filbeholderen er plassert har allerede blitt sikkert og fullstendig kryptert.\n\nEr du sikker på at du vil bruke hurtigutvidelse?</entry>
<entry lang="nb" key="EXPANDER_STATUS_TEXT">VIKTIG: Flytt musen så tilfeldig som mulig innenfor dette vinduet. Jo lengre du flytter den, jo bedre. Dette øker den kryptografiske styrken til krypteringsnøklene betydelig. Klikk deretter 'Fortsett' for å utvide volumet.</entry>
<entry lang="nb" key="EXPANDER_STATUS_TEXT_LEGACY">Klikk 'Fortsett' for å utvide volumet.</entry>
@@ -1668,9 +1668,9 @@
<entry lang="nb" key="PIM_ARGON2_LARGE_WARNING">Du har valgt en Argon2 PIM-verdi som er større enn VeraCrypts standardverdi.\nVær oppmerksom på at dette kan kreve mer minne og føre til mye tregere montering.</entry>
<entry lang="nb" key="PIM_ARGON2_SMALL_WARNING">Du har valgt en Argon2 PIM-verdi som er mindre enn VeraCrypts standardverdi. Vær oppmerksom på at dersom passordet ditt ikke er sterkt nok, kan dette føre til svakere sikkerhet.\n\nBekrefter du at du bruker et sterkt passord?</entry>
<entry lang="nb" key="PIM_ARGON2_REQUIRE_LONG_PASSWORD">Passordet må inneholde 20 eller flere tegn for å kunne bruke den angitte Argon2 PIM-en.\nKortere passord kan kun brukes hvis Argon2 PIM er 12 eller større.</entry>
<entry lang="en" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER">Mount NTFS volumes with an in-kernel Linux driver</entry>
<entry lang="en" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER_HELP">Linux only. When enabled and no explicit filesystem type was supplied, VeraCrypt probes the decrypted virtual device with blkid -p and mounts detected NTFS filesystems with an available in-kernel NTFS driver, bypassing mount helpers such as ntfs-3g. VeraCrypt uses ntfs when it is positively identified as a modern read/write driver or expected on Linux 7.1 or later, and otherwise uses ntfs3. If NTFS detection fails, VeraCrypt uses the normal automatic filesystem selection. If no supported in-kernel NTFS driver is available or loadable, mounting fails. This opt-in option can avoid suspend or hibernate hangs caused by frozen user-space FUSE filesystems.</entry>
<entry lang="en" key="LINUX_KERNEL_NTFS_DRIVER_UNAVAILABLE">No supported in-kernel NTFS driver is available or loadable. To use the system default NTFS backend, disable the NTFS kernel-driver preference or do not request kernel NTFS explicitly.</entry>
<entry lang="nb" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER">Monter NTFS-volumer med en Linux-driver i kjernen</entry>
<entry lang="nb" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER_HELP">Kun Linux. Når aktivert og ingen eksplisitt filsystemtype er angitt, undersøker VeraCrypt den dekrypterte virtuelle enheten med blkid -p og monterer oppdagede NTFS-filsystemer med en tilgjengelig NTFS-driver i kjernen, og omgår monteringshjelpere som ntfs-3g. VeraCrypt bruker ntfs når den er positivt identifisert som en moderne lese/skrive-driver eller forventet på Linux 7.1 eller nyere, og bruker ellers ntfs3. Hvis NTFS-deteksjonen mislykkes, bruker VeraCrypt det vanlige automatiske filsystemvalget. Hvis ingen støttet NTFS-driver i kjernen er tilgjengelig eller kan lastes, mislykkes monteringen. Dette valgfrie alternativet kan unngå at hvilemodus eller dvalemodus henger på grunn av frosne FUSE-filsystemer i brukerområdet.</entry>
<entry lang="nb" key="LINUX_KERNEL_NTFS_DRIVER_UNAVAILABLE">Ingen støttet NTFS-driver i kjernen er tilgjengelig eller kan lastes. For å bruke systemets standard NTFS-backend, deaktiver innstillingen for NTFS-kjernedriver eller ikke be om NTFS-kjerne eksplisitt.</entry>
<entry lang="nb" key="LINUX_EMERGENCY_UNMOUNT_WARNING">Normal demontering av volumet {0} mislyktes. Dette kan skje når programmer fortsatt har filer eller mapper åpne på volumet, eller når den underliggende enheten ble frakoblet og monteringen ble foreldet.\n\nHvis enheten fortsatt er tilkoblet, velg Nei, lukk programmene som bruker volumet, og prøv å demontere på nytt.\n\nHvis enheten ble frakoblet eller monteringen er foreldet, kan VeraCrypt forsøke en nødopprydding ved å frakoble filsystemet og fjerne eller planlegge fjerning av VeraCrypts kjerneobjekter. Ventende skrivinger kan ha mislyktes, data kan gå tapt, og oppryddingen kan forbli ventende inntil programmene lukker åpne filer. Kontroller filsystemet med fsck eller et passende reparasjonsverktøy før du bruker det igjen.\n\nFortsette?</entry>
<entry lang="nb" key="LINUX_EMERGENCY_UNMOUNTED">Nødopprydding for volumet {0} er igangsatt. Hvis volumet ble frakoblet, monteringen var foreldet, eller det var ventende skrivinger, kontroller filsystemet med fsck eller et passende reparasjonsverktøy før du bruker det igjen.</entry>
<entry lang="nb" key="FORMAT_STAGE_WRITING_DATA">Oppretter volumdata. Vennligst vent.</entry>
+12 -12
View File
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<VeraCrypt>
<localization prog-version="1.26.28">
<language langid="nl" name="Nederlands" en-name="Dutch" version="2026-05-13" translators="Jan van der Wal, Peter Tak, Thomas De Rocker"/>
<language langid="nl" name="Nederlands" en-name="Dutch" version="2026-05-19" translators="Jan van der Wal, Peter Tak, Thomas De Rocker"/>
<font lang="nl" class="normal" size="11" face="default"/>
<font lang="nl" class="bold" size="13" face="Arial"/>
<font lang="nl" class="fixed" size="12" face="Lucida Console"/>
@@ -1654,8 +1654,8 @@
<entry lang="nl" key="IDC_SECURE_DESKTOP_ENABLE_IME">De invoermethode-editor (IME) inschakelen in Secure Desktop</entry>
<entry lang="nl" key="ENABLE_IME_IN_SECURE_DESKTOP_WARNING">WAARSCHUWING: schakel deze optie alleen in als u problemen ondervindt bij het selecteren van sleutelbestanden/tokens onder Secure Desktop.</entry>
<entry lang="nl" key="ERR_KEY_DERIVATION_FAILED">Het afleiden van de sleutel is mislukt. Dit kan worden veroorzaakt door onvoldoende geheugen of een onderbroken bewerking.</entry>
<entry lang="nl" key="EFI_MS_BOOT_LOADER_RESTORE_FAILED">De systeempartitie/schijf is al ontsleuteld, maar het pad naar de EFI-bootloader van Microsoft is niet hersteld in de Windows Boot Manager. Alleen de EFI-opstartbestanden moeten worden gerepareerd. Gebruik de reparatieoptie van de VeraCrypt Rescue Disk, of start op vanaf het Windows-herstelmedium en voer bcdboot W:\\Windows /s S: /f UEFI uit, waarbij u W: vervangt door de stationsletter van het Windows-volume en S: door de stationsletter van de EFI-systeempartitie. Pad:</entry>
<entry lang="nl" key="EFI_FALLBACK_BOOT_LOADER_STILL_VERACRYPT">De systeempartitie/schijf is al ontsleuteld, maar het pad naar de fallback-EFI-bootloader bevat nog steeds de VeraCrypt-bootloader. Alleen de EFI-opstartbestanden moeten worden gerepareerd. Gebruik de reparatieoptie van de VeraCrypt Rescue Disk, of start op vanaf het Windows-herstelmedium en voer bcdboot W:\\Windows /s S: /f UEFI uit, waarbij u W: vervangt door de stationsletter van het Windows-volume en S: door de stationsletter van de EFI-systeempartitie. Pad:</entry>
<entry lang="nl" key="EFI_MS_BOOT_LOADER_RESTORE_FAILED">De systeempartitie/schijf is al ontsleuteld, maar het pad naar de EFI-bootloader van Microsoft is niet hersteld in de Windows Boot Manager. Alleen de EFI-opstartbestanden moeten worden gerepareerd. Gebruik de reparatieoptie van de VeraCrypt Rescue Disk, of start op vanaf het Windows-herstelmedium en voer 'bcdboot W:\\Windows /s S: /f UEFI' uit, waarbij u W: vervangt door de stationsletter van het Windows-volume en S: door de stationsletter van de EFI-systeempartitie. Pad:</entry>
<entry lang="nl" key="EFI_FALLBACK_BOOT_LOADER_STILL_VERACRYPT">De systeempartitie/schijf is al ontsleuteld, maar het pad naar de fallback-EFI-bootloader bevat nog steeds de VeraCrypt-bootloader. Alleen de EFI-opstartbestanden moeten worden gerepareerd. Gebruik de reparatieoptie van de VeraCrypt Rescue Disk, of start op vanaf het Windows-herstelmedium en voer 'bcdboot W:\\Windows /s S: /f UEFI' uit, waarbij u W: vervangt door de stationsletter van het Windows-volume en S: door de stationsletter van de EFI-systeempartitie. Pad:</entry>
<entry lang="nl" key="IDM_REPAIR_EFI_BOOT_LOADER">EFI-bootloader repareren...</entry>
<entry lang="nl" key="CONFIRM_REPAIR_EFI_BOOT_LOADER">VeraCrypt herstelt de paden van de Windows EFI-bootloader en verwijdert de EFI-opstartvermeldingen en -bestanden van VeraCrypt.\n\nGebruik deze optie alleen nadat de systeempartitie/het systeemstation volledig is ontsleuteld en Windows kan opstarten zonder systeemversleuteling.\n\nWilt u doorgaan?</entry>
<entry lang="nl" key="EFI_BOOT_LOADER_FILE_READ_FAILED">Het EFI-bootloaderbestand kon niet volledig worden gelezen:</entry>
@@ -1668,10 +1668,10 @@
<entry lang="nl" key="PIM_ARGON2_LARGE_WARNING">U hebt een Argon2 PIM-waarde gekozen die hoger is dan de standaardwaarde van VeraCrypt.\nHoud er rekening mee dat dit meer geheugen kan vergen en kan leiden tot een aanzienlijk tragere koppeling.</entry>
<entry lang="nl" key="PIM_ARGON2_SMALL_WARNING">U hebt een Argon2-PIM-waarde gekozen die lager is dan de standaardwaarde van VeraCrypt. Houd er rekening mee dat als uw wachtwoord niet sterk genoeg is, dit kan leiden tot een lagere beveiliging.\n\nBevestigt u dat u een sterk wachtwoord gebruikt?</entry>
<entry lang="nl" key="PIM_ARGON2_REQUIRE_LONG_PASSWORD">Het wachtwoord moet uit minimaal 20 tekens bestaan om de opgegeven Argon2-PIM te kunnen gebruiken.\nKortere wachtwoorden kunnen alleen worden gebruikt als de Argon2-PIM 12 of hoger is.</entry>
<entry lang="en" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER">Mount NTFS volumes with an in-kernel Linux driver</entry>
<entry lang="en" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER_HELP">Linux only. When enabled and no explicit filesystem type was supplied, VeraCrypt probes the decrypted virtual device with blkid -p and mounts detected NTFS filesystems with an available in-kernel NTFS driver, bypassing mount helpers such as ntfs-3g. VeraCrypt uses ntfs when it is positively identified as a modern read/write driver or expected on Linux 7.1 or later, and otherwise uses ntfs3. If NTFS detection fails, VeraCrypt uses the normal automatic filesystem selection. If no supported in-kernel NTFS driver is available or loadable, mounting fails. This opt-in option can avoid suspend or hibernate hangs caused by frozen user-space FUSE filesystems.</entry>
<entry lang="en" key="LINUX_KERNEL_NTFS_DRIVER_UNAVAILABLE">No supported in-kernel NTFS driver is available or loadable. To use the system default NTFS backend, disable the NTFS kernel-driver preference or do not request kernel NTFS explicitly.</entry>
<entry lang="nl" key="LINUX_EMERGENCY_UNMOUNT_WARNING">Het normaal ontkoppelen van volume {0} is mislukt. Dit kan gebeuren wanneer applicaties nog bestanden of mappen op het volume open hebben staan, of wanneer het onderliggende apparaat is losgekoppeld en de koppeling verouderd is geraakt.\n\nAls het apparaat nog is aangesloten, kies dan Nee, sluit de applicaties die het volume gebruiken en probeer het ontkoppelen opnieuw.\n\nAls het apparaat is losgekoppeld of de koppeling verouderd is, kan VeraCrypt een noodopruiming uitvoeren door het bestandssysteem lui los te koppelen en VeraCrypt-kernelobjecten te verwijderen of de verwijdering ervan in te plannen. Lopende schrijfbewerkingen zijn mogelijk mislukt, er kan gegevensverlies optreden en de opruiming kan in behandeling blijven totdat applicaties geopende bestanden sluiten. Controleer het bestandssysteem met fsck of het juiste reparatieprogramma voordat u het opnieuw gebruikt.\n\nDoorgaan?</entry>
<entry lang="nl" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER">NTFS-volumes koppelen met een Linux-stuurprogramma in de kernel</entry>
<entry lang="nl" key="LINUX_PREF_MOUNT_NTFS_WITH_KERNEL_DRIVER_HELP">Alleen voor Linux. Wanneer deze optie is ingeschakeld en er geen specifiek bestandssysteemtype is opgegeven, onderzoekt VeraCrypt het ontsleutelde virtuele apparaat met 'blkid -p' en koppelt het gedetecteerde NTFS-bestandssystemen met een beschikbare NTFS-driver in de kernel, waarbij koppelhulpprogramma's zoals 'ntfs-3g' worden omzeild. VeraCrypt gebruikt ntfs wanneer dit duidelijk wordt geïdentificeerd als een modern lees-/schrijfstuurprogramma of wordt verwacht op Linux 7.1 of later, en gebruikt anders ntfs3. Als de NTFS-detectie mislukt, gebruikt VeraCrypt de normale automatische bestandssysteemselectie. Als er geen ondersteund NTFS-stuurprogramma in de kernel beschikbaar of laadbaar is, mislukt het koppelen. Deze opt-in-optie kan vastlopers bij slaapstand of sluimerstand voorkomen die worden veroorzaakt door bevroren FUSE-bestandssystemen in de gebruikersruimte.</entry>
<entry lang="nl" key="LINUX_KERNEL_NTFS_DRIVER_UNAVAILABLE">Er is geen ondersteunde NTFS-kerneldriver beschikbaar of laadbaar. Om de standaard NTFS-backend van het systeem te gebruiken, moet u de voorkeur voor de NTFS-kerneldriver uitschakelen of niet expliciet om de NTFS-kerneldriver vragen.</entry>
<entry lang="nl" key="LINUX_EMERGENCY_UNMOUNT_WARNING">Het normaal ontkoppelen van volume {0} is mislukt. Dit kan gebeuren wanneer applicaties nog bestanden of mappen op het volume open hebben staan, of wanneer het onderliggende apparaat is losgekoppeld en de koppeling verouderd is geraakt.\n\nAls het apparaat nog is aangesloten, kies dan 'Nee', sluit de applicaties die het volume gebruiken en probeer het ontkoppelen opnieuw.\n\nAls het apparaat is losgekoppeld of de koppeling verouderd is, kan VeraCrypt een noodopruiming uitvoeren door het bestandssysteem lui los te koppelen en VeraCrypt-kernelobjecten te verwijderen of de verwijdering ervan in te plannen. Lopende schrijfbewerkingen zijn mogelijk mislukt, er kan gegevensverlies optreden en de opruiming kan in behandeling blijven totdat applicaties geopende bestanden sluiten. Controleer het bestandssysteem met fsck of het juiste reparatieprogramma voordat u het opnieuw gebruikt.\n\nDoorgaan?</entry>
<entry lang="nl" key="LINUX_EMERGENCY_UNMOUNTED">De noodopruiming voor volume {0} is gestart. Als het volume was losgekoppeld, de koppeling verouderd was of er nog schrijfbewerkingen in de wachtrij stonden, controleer dan het bestandssysteem met fsck of het juiste reparatieprogramma voordat u het weer gebruikt.</entry>
<entry lang="nl" key="FORMAT_STAGE_WRITING_DATA">Volumegegevens aanmaken. Even geduld.</entry>
<entry lang="nl" key="FORMAT_STAGE_WRITING_BACKUP_HEADER">Aanmaken van volume voltooien: backup-header schrijven.</entry>
@@ -1683,11 +1683,11 @@
<entry lang="nl" key="FORMAT_STAGE_PREPARING_TEMP_DEVICE">Aanmaken van volume voltooien: tijdelijk apparaat voorbereiden.</entry>
<entry lang="nl" key="FORMAT_STAGE_CREATING_FILESYSTEM">Aanmaken van volume voltooien: bestandssysteem aanmaken met {0}.</entry>
<entry lang="nl" key="FORMAT_STAGE_DISMOUNTING_TEMP_VOLUME">Aanmaken van volume voltooien: tijdelijk volume ontkoppelen.</entry>
<entry lang="nl" key="MACOSX_APFS_SYNTHESIZED_DEVICE">Het geselecteerde apparaat {0} is een door APFS gesynthetiseerde container of een APFS-volume en kan niet worden gebruikt als host voor een onbewerkt VeraCrypt-volume.\n\nSelecteer in plaats daarvan de fysieke APFS-opslagpartitie{1}.</entry>
<entry lang="nl" key="MACOSX_DEVICE_SYSTEM_PARTITION">Het geselecteerde apparaat {0} is een systeem-/ondersteuningspartitie van macOS en kan niet worden gebruikt als host voor een VeraCrypt-volume.</entry>
<entry lang="nl" key="MACOSX_APFS_SYSTEM_STORE">De geselecteerde fysieke APFS-opslag {0} bevat het momenteel gekoppelde macOS-systeemvolume en kan niet worden gebruikt als host voor een VeraCrypt-volume.</entry>
<entry lang="nl" key="MACOSX_DEVICE_NOT_WRITABLE">macOS meldt dat het geselecteerde apparaat {0} alleen-lezen is. Selecteer een fysieke partitie of schijf waarop geschreven kan worden.</entry>
<entry lang="nl" key="MACOSX_APFS_EROFS_HINT">macOS geeft aan dat het geselecteerde apparaat alleen-lezen is. Als dit een APFS-schijf is, controleer dan of u de fysieke APFS-opslagpartitie hebt geselecteerd en niet een gesynthetiseerd APFS-volume. Gebruik Schijfhulpprogramma of diskutil list om de fysieke partitie te identificeren en probeer het vervolgens opnieuw.</entry>
<entry lang="nl" key="MACOSX_APFS_SYNTHESIZED_DEVICE">Het geselecteerde apparaat '{0}' is een door APFS gesynthetiseerde container of een APFS-volume en kan niet worden gebruikt als host voor een onbewerkt VeraCrypt-volume.\n\nSelecteer in plaats daarvan de fysieke APFS-opslagpartitie{1}.</entry>
<entry lang="nl" key="MACOSX_DEVICE_SYSTEM_PARTITION">Het geselecteerde apparaat '{0}' is een systeem-/ondersteuningspartitie van macOS en kan niet worden gebruikt als host voor een VeraCrypt-volume.</entry>
<entry lang="nl" key="MACOSX_APFS_SYSTEM_STORE">De geselecteerde fysieke APFS-opslag '{0}' bevat het momenteel gekoppelde macOS-systeemvolume en kan niet worden gebruikt als host voor een VeraCrypt-volume.</entry>
<entry lang="nl" key="MACOSX_DEVICE_NOT_WRITABLE">macOS meldt dat het geselecteerde apparaat '{0}' alleen-lezen is. Selecteer een fysieke partitie of schijf waarop geschreven kan worden.</entry>
<entry lang="nl" key="MACOSX_APFS_EROFS_HINT">macOS geeft aan dat het geselecteerde apparaat alleen-lezen is. Als dit een APFS-schijf is, controleer dan of u de fysieke APFS-opslagpartitie hebt geselecteerd en niet een gesynthetiseerd APFS-volume. Gebruik Schijfhulpprogramma of 'diskutil list' om de fysieke partitie te identificeren en probeer het vervolgens opnieuw.</entry>
</localization>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:element name="VeraCrypt">
Binary file not shown.
+3 -3
View File
@@ -88,7 +88,7 @@ The amount of memory used during the key derivation process, controlled by the P
<strong>Range:</strong> 64 MiB to 1024 MiB (capped at PIM = 31)
</li>
<li style="text-align:left; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px">
<strong>Default:</strong> 96 MiB (equivalent to PIM = 2)
<strong>Default:</strong> 416 MiB (equivalent to PIM = 12)
</li>
</ul>
@@ -104,7 +104,7 @@ The number of iterations performed during the key derivation process:
<strong>For PIM > 31:</strong> t_cost(pim) = 13 + (pim - 31)
</li>
<li style="text-align:left; margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px">
<strong>Default:</strong> 3 iterations (equivalent to PIM = 2)
<strong>Default:</strong> 6 iterations (equivalent to PIM = 12)
</li>
</ul>
@@ -161,7 +161,7 @@ When using Argon2id in VeraCrypt:
<strong>Algorithm:</strong> Argon2id as defined in RFC 9106<br/>
<strong>Internal hash:</strong> BLAKE2b<br/>
<strong>Salt size:</strong> 512 bits (same as PBKDF2-HMAC)<br/>
<strong>Output length:</strong> Variable, depending on the encryption algorithm (e.g., 256 bits for AES-256, 768 bits for AES-Twofish-Serpent cascade)<br/>
<strong>Header KDF output length:</strong> Fixed at 1536 bits (192 bytes) for the current VeraCrypt format. The required prefix is used for the selected encryption algorithm (for example, the first 64 bytes for AES (AES-256-XTS)). Third-party implementations must request 192 bytes from Argon2id before selecting the required prefix; requesting only the selected algorithm's key material length produces a different Argon2id output.<br/>
<strong>Version:</strong> Argon2 version 0x13 (19 decimal)
</div>
+2 -2
View File
@@ -253,7 +253,7 @@
</tr>
<tr>
<td><em>--quick</em></td>
<td>Enable quick formatting when creating a volume. This option must not be used when creating an outer volume.</td>
<td>Enable quick formatting when creating a normal file-hosted or device-hosted volume. Do not use this option when creating an outer volume. In text mode, VeraCrypt cannot infer that a normal volume is intended to become an outer volume. For file containers, Quick Format may create sparse or unwritten host regions. Allocation behavior depends on host filesystem sparse-file support, and later writes can fail if the host filesystem runs out of space.</td>
</tr>
<tr>
<td><em>--random-source=FILE</em></td>
@@ -326,7 +326,7 @@
<h4>Hidden Volume Creation in Text Mode</h4>
<p>Inexperienced users should use the graphical user interface to create a hidden volume. When using the text user interface, the following procedure must be followed:</p>
<ol>
<li>Create an outer volume with no filesystem.</li>
<li>Create an outer volume with no filesystem and without <em>--quick</em>.</li>
<li>Create a hidden volume within the outer volume.</li>
<li>Mount the outer volume using hidden volume protection.</li>
<li>Create a filesystem on the virtual device of the outer volume.</li>
+3 -2
View File
@@ -56,10 +56,11 @@ Note that the output of a hash function is <em>never </em>used directly as an en
<p>This allows you to select the encryption algorithm with which your new volume will be encrypted. Note that the encryption algorithm cannot be changed after the volume is created. For more information, please see the chapter
<a href="Encryption%20Algorithms.html"><em>Encryption Algorithms</em></a>.</p>
<h3 id="QuickFormat">Quick Format</h3>
<p>If you are not sure whether to enable or disable Quick Format, we recommend that you leave this option unchecked.</p>
<p>If unchecked, each sector of the new volume will be formatted. This means that the new volume will be
<em>entirely </em>filled with random data. Quick format is much faster but may be less secure because until the whole volume has been filled with files, it may be possible to tell how much data it contains (if the space was not filled with random data beforehand).
If you are not sure whether to enable or disable Quick Format, we recommend that you leave this option unchecked. Note that Quick Format can only be enabled when encrypting partitions/devices, except on Windows where it is also available when creating file containers.</p>
<p>Important: When encrypting a partition/device within which you intend to create a hidden volume afterwards, leave this option unchecked.</p>
For file containers, the host filesystem may create sparse or unwritten regions, which can reveal unused areas and reduce plausible deniability. Host allocation behavior depends on filesystem sparse-file support. On filesystems without sparse-file support, creating the container may allocate most or all of its space immediately or fail if there is not enough host space. The encrypted filesystem may also report more free space than the host filesystem can actually provide. If host space runs out, later writes may fail or corrupt the encrypted filesystem. Quick Format is available for normal file containers and when encrypting partitions/devices.</p>
<p>Important: When creating an outer volume within which you intend to create a hidden volume afterwards, do not use Quick Format.</p>
<h3 id="dynamic">Dynamic</h3>
<p>Dynamic VeraCrypt container is a pre-allocated NTFS sparse file whose physical size (actual disk space used) grows as new data is added to it. Note that the physical size of the container (actual disk space that the container uses) will not decrease when
files are deleted on the VeraCrypt volume. The physical size of the container can only
+2
View File
@@ -304,6 +304,8 @@ The System Favorites Organizer window should appear now. In this window, enable
For more information, see the chapter <a href="System%20Favorite%20Volumes.html" target="_blank" style="text-align:left; color:#0080c0; text-decoration:none">
System Favorite Volumes</a>.</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
Note: System favorite volumes are not available during the earlier Windows boot and storage initialization phases. Therefore, Windows-managed startup dependencies such as automatically attached VHD/VHDX files, Dev Drive backing VHDX files, and native-boot VHD/VHDX files must not be stored on system favorite volumes. For VHD/VHDX files that are not required during boot or early startup, use a delayed/retrying task or a service that depends on <em>VeraCryptSystemFavorites</em> to attach them after the system favorite volume has been mounted. This workaround is not suitable for native-boot VHD/VHDX files or any other file that Windows must access before services can run.</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
<br style="text-align:left">
<strong style="text-align:left">Can a volume be automatically mounted whenever I log on to Windows?</strong></div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
+1
View File
@@ -87,6 +87,7 @@ PIM </a>value is given by the user, the number of iterations of the PBKDF2 key d
<h4>Argon2id Parameters</h4>
<p>When Argon2id is selected as the key derivation function, the PIM value controls both memory and time costs as described in the <a href="Personal%20Iterations%20Multiplier%20%28PIM%29.html">PIM section</a>. If no PIM is specified, default parameters equivalent to PIM = 12 are used (416 MiB memory, 6 iterations).</p>
<p>For Argon2id, VeraCrypt derives a fixed 192 bytes of header key material for the current volume format, independently of the selected encryption algorithm. The selected encryption algorithm then uses the required prefix of that derived output. For example, AES-XTS uses the first 64 bytes. Implementations must request 192 bytes from Argon2id and then select the required prefix; requesting only the selected algorithm's key material length produces a different Argon2id output because Argon2id includes the requested output length in its computation.</p>
</div>
<div style="text-align:left; margin-top:19px; margin-bottom:19px; padding-top:0px; padding-bottom:0px">
+2 -1
View File
@@ -62,7 +62,8 @@ In such situations, the issue can be solved by disabling VeraCrypt waiting dialo
by selecting <em>System</em> &gt; <em>Mount Without Pre-Boot Authentication,</em> is limited to primary partitions (extended/logical partitions cannot be mounted this way).
</li><li>Due to a Windows 2000 issue, VeraCrypt does not support the Windows Mount Manager under Windows 2000. Therefore, some Windows 2000 built-in tools, such as Disk Defragmenter, do not work on VeraCrypt volumes. Furthermore, it is not possible to use the Mount
Manager services under Windows 2000, e.g., assign a mount point to a VeraCrypt volume (i.e., attach a VeraCrypt volume to a folder).
</li><li>VeraCrypt does not support pre-boot authentication for operating systems installed within VHD files, except when booted using appropriate virtual-machine software such as Microsoft Virtual PC.
</li><li>VeraCrypt does not support pre-boot authentication for operating systems installed within VHD/VHDX files, except when booted using appropriate virtual-machine software such as Microsoft Virtual PC.
</li><li>VHD/VHDX files that Windows must attach automatically during startup, including Dev Drive backing VHDX files, cannot be stored on system favorite volumes because these volumes are mounted only after the earlier Windows boot and storage initialization phases have already started. Store such non-boot VHD/VHDX files on the encrypted system partition/drive or on another partition within the key scope of system encryption. Native-boot VHD/VHDX files also cannot be stored on system favorite volumes; they remain subject to the preceding limitation on pre-boot authentication for operating systems installed within VHD/VHDX files. For VHD/VHDX files that are not required for boot or early Windows startup, disable Windows automatic attachment and attach them later using a delayed/retrying startup task or a service that depends on the <em>VeraCryptSystemFavorites</em> service. This workaround is not suitable for native-boot VHD/VHDX files or any other file that Windows must access before services can run.
</li><li>The Windows Volume Shadow Copy Service is currently supported only for partitions within the key scope of system encryption (e.g. a system partition encrypted by VeraCrypt, or a non- system partition located on a system drive encrypted by VeraCrypt, mounted
when the encrypted operating system is running). Note: For other types of volumes, the Volume Shadow Copy Service is not supported because the documentation for the necessary API is not available.
</li><li>Windows boot settings cannot be changed from within a hidden operating system if the system does not boot from the partition on which it is installed. This is due to the fact that, for security reasons, the boot partition is mounted as read-only when the
+5
View File
@@ -48,6 +48,11 @@
<li>Translator note: the previous Linux ntfs3 preference strings were replaced by generic in-kernel NTFS driver strings and should be retranslated.</li>
</ul>
</li>
<li><strong>Linux and macOS:</strong>
<ul>
<li>Enable Quick Format for normal file containers. The container is sized with <code>ftruncate()</code>, so the host filesystem may keep regions unwritten or sparse until data is written to them.</li>
</ul>
</li>
</ul>
<p><strong style="text-align:left">1.26.27</strong> (September 20<sup>th</sup>, 2025):</p>
+1
View File
@@ -73,6 +73,7 @@ Thus, when setting or entering your password, it's crucial to type it manually u
<p>Note: By default, Windows 7 and later boot from a special small partition. The partition contains files that are required to boot the system. Windows allows only applications that have administrator privileges to write to the partition (when the system is
running). In EFI boot mode, which is the default on modern PCs, VeraCrypt can not encrypt this partition since it must remain unencrypted so that the BIOS can load the EFI bootloader from it. This in turn implies that in EFI boot mode, VeraCrypt offers only to encrypt the system partition where Windows is installed (the user can later manually encrypt other data partitions using VeraCrypt).
In MBR legacy boot mode, VeraCrypt encrypts the partition only if you choose to encrypt the whole system drive (as opposed to choosing to encrypt only the partition where Windows is installed).</p>
<p>In EFI boot mode with Secure Boot enabled, VeraCrypt selects the installed Microsoft UEFI CA-signed bootloader set during install, repair, upgrade, or Windows PostOOBE repair. If you manually change firmware Secure Boot db entries, run VeraCrypt repair or reinstall to refresh the installed bootloader set.</p>
<p>&nbsp;</p>
<p><a href="Hidden%20Operating%20System.html" style="text-align:left; color:#0080c0; text-decoration:none; font-weight:bold">Next Section &gt;&gt;</a></p>
</div>
+2 -2
View File
@@ -74,8 +74,8 @@ System favorite volumes <strong>can be configured to be available within VeraCry
<br>
Warning: When the drive letter assigned to a system favorite volume (saved in the configuration file) is not free, the volume is not mounted and no error message is displayed.<br>
<br>
Note that Windows needs to use some files (e.g. paging files, Active Directory files, etc.) before system favorite volumes are mounted. Therefore, such files cannot be stored on system favorite volumes. Note, however, that they
<em>can </em>be stored on any partition that is within the key scope of system encryption (e.g. on the system partition or on any partition of a system drive that is entirely encrypted by VeraCrypt).<br>
Note that Windows needs to use some files (e.g. paging files, Active Directory files, VHD/VHDX files configured for automatic attachment at startup, Dev Drive backing VHDX files, native-boot VHD/VHDX files, etc.) before system favorite volumes are mounted. Therefore, such files cannot be stored on system favorite volumes. Note, however, that files supported by VeraCrypt system encryption
<em>can </em>be stored on any partition that is within the key scope of system encryption (e.g. on the system partition or on any partition of a system drive that is entirely encrypted by VeraCrypt). Native-boot VHD/VHDX files remain subject to the limitation that VeraCrypt does not support pre-boot authentication for operating systems installed within VHD/VHDX files. For VHD/VHDX files that are not required for boot or early Windows startup, a possible workaround is to disable Windows automatic attachment and attach them only after the corresponding system favorite volume has been mounted, for example by using a delayed/retrying startup task or a service that depends on the <em>VeraCryptSystemFavorites</em> service and runs <code>Mount-DiskImage</code> or <code>diskpart attach vdisk</code>. This workaround is not suitable for paging files, Active Directory files, native-boot VHD/VHDX files, or any other file that Windows must access before services can run.<br>
<br>
<strong>To remove a volume from the list of system favorite volumes</strong>, select
<em>Favorites </em>&gt; <em>Organize System Favorite Volumes</em>, select the volume, click
+2
View File
@@ -93,6 +93,8 @@ To boot a VeraCrypt Rescue Disk, insert it into a USB port or your CD/DVD drive
configuration screen appears, restart (reset) the computer again and start pressing F2 or Delete repeatedly as soon as you restart (reset) the computer. When a BIOS configuration screen appears, configure your BIOS to boot from the USB drive and CD/DVD drive first (for
information on how to do so, please refer to the documentation for your BIOS/motherboard or contact your computer vendor's technical support team for assistance). Then restart your computer. The VeraCrypt Rescue Disk screen should appear now. Note: In the
case of MBR legacy boot mode, you can select 'Repair Options' on the VeraCrypt Rescue Disk screen by pressing F8 on your keyboard.</div>
<p>In EFI boot mode with Secure Boot enabled, the VeraCrypt Rescue Disk uses the Microsoft UEFI CA-signed bootloader set selected from the computer's current Secure Boot db state when the Rescue Disk is created. If firmware or Secure Boot db entries are later changed, create a new VeraCrypt Rescue Disk. A Rescue Disk created on a computer that trusts only one Microsoft UEFI CA generation may not Secure-Boot on a different computer that trusts only the other generation.</p>
<p>Installed EFI bootloader files are refreshed only during VeraCrypt install, repair, upgrade, or Windows PostOOBE repair paths. If you manually change firmware Secure Boot db entries, run VeraCrypt repair or reinstall to refresh the installed bootloader set.</p>
<p>If your VeraCrypt Rescue Disk is damaged, you can create a new one by selecting
<em style="text-align:left">System</em> &gt; <em style="text-align:left">Create Rescue Disk</em>. To find out whether your VeraCrypt Rescue Disk is damaged, insert it into a USB port (or into your CD/DVD drive in case of MBR legacy boot mode) and select
<em style="text-align:left">System</em> &gt; <em style="text-align:left">Verify Rescue Disk</em>.</p>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -96,7 +96,7 @@ endif
# Embedded files
ifeq "$(PLATFORM)" "OpenBSD"
OD_BIN := ggod -v -t u1 -A n
OD_BIN := hexdump -v -e '1/1 "%u "'
else
OD_BIN := od -v -t u1 -A n
endif
+163
View File
@@ -0,0 +1,163 @@
# OpenWrt packaging
This directory contains the canonical OpenWrt package template and local test
configuration for building VeraCrypt console-only with the OpenWrt SDK.
It is a maintainer build-and-test harness for the VeraCrypt working tree, not
an OpenWrt packages-feed submission recipe.
The current supported target is `x86/64`, matching the QEMU runtime smoke test.
The build uses:
- OpenWrt 24.10.6 x86/64 SDK by default
- musl through the OpenWrt toolchain
- `NOGUI=1`
- `WITHFUSE3=1`
- `WXSTATIC=1`
- wxWidgets 3.2.10 built as static wxBase
- `NOTEST=1` during cross compilation
- `NOSTRIP=1`, with OpenWrt package stripping disabled for maintainer
diagnostics
The package installs only:
- `/usr/bin/veracrypt`
- `/sbin/mount.veracrypt`
- `/usr/share/licenses/veracrypt/License.txt`
`mount.veracrypt` uses a Bash shebang, so the OpenWrt package declares `bash`
as a runtime dependency.
## Build
From the VeraCrypt checkout root:
```sh
src/Build/build_veracrypt_openwrt.sh
```
The script downloads and verifies the OpenWrt SDK against a pinned SHA-256 for
the supported release/target, downloads and verifies wxWidgets 3.2.10, installs
the required OpenWrt feeds, renders
`package/utils/veracrypt/Makefile` inside the SDK, builds the `.ipk`, and
also builds the local userland `bash`, `fuse3`, `util-linux`, and `lvm2` feed
packages used by the QEMU runtime test. Kernel modules for the stock OpenWrt
image are resolved by the test from the official OpenWrt kmod feed for the
selected release and target.
Default output location:
```text
../openwrt-veracrypt/openwrt-sdk-24.10.6-x86-64_gcc-13.3.0_musl.Linux-x86_64/bin/packages/x86_64/base/veracrypt_<version>-r1_x86_64.ipk
```
Useful options:
```sh
src/Build/build_veracrypt_openwrt.sh --fresh-sdk
src/Build/build_veracrypt_openwrt.sh --work-dir /tmp/veracrypt-openwrt
src/Build/build_veracrypt_openwrt.sh --sdk-dir /path/to/openwrt-sdk
src/Build/build_veracrypt_openwrt.sh --sdk-url URL --sdk-sha256 HASH
src/Build/build_veracrypt_openwrt.sh --wx-version 3.2.10
```
Custom SDK URLs or unsupported OpenWrt release/target combinations must pass
`--sdk-sha256`; the build script does not trust an unsigned `sha256sums` file as
the sole integrity source for SDK archives.
If the host only has `mawk`, the build script downloads and builds GNU awk
locally under the OpenWrt work directory because OpenWrt feed scripts require
GNU awk behavior on some hosts.
## QEMU Runtime Test
Install or provide `qemu-system-x86_64`. On Debian/Ubuntu hosts:
```sh
sudo apt install qemu-system-x86
```
Then run:
```sh
python3 src/Build/test_veracrypt_openwrt_qemu.py \
--ipk ../openwrt-veracrypt/openwrt-sdk-24.10.6-x86-64_gcc-13.3.0_musl.Linux-x86_64/bin/packages/x86_64/base/veracrypt_<version>-r1_x86_64.ipk
```
The test script downloads and verifies the matching OpenWrt x86/64 ext4 image,
boots it with QEMU user networking, waits for OpenWrt network init to settle,
gets a DHCP lease on `br-lan` or `eth0`, resolves the needed dependency closure
from local SDK `.ipk` control metadata plus the official OpenWrt kmod feed,
serves those packages to the guest, and installs them with `opkg`. It then runs:
```sh
veracrypt --text --version
veracrypt --text --test
```
By default it also creates a 16 MiB AES/SHA-512 test container, opens it with
`--filesystem=none`, verifies it appears in `veracrypt --text --list`, and
unmounts it. Use `--skip-container` to run only the package install, version,
and algorithm self-test path.
If QEMU was extracted locally instead of installed system-wide, pass the binary
and firmware directory explicitly:
```sh
LD_LIBRARY_PATH=/path/to/qemu-libs \
python3 src/Build/test_veracrypt_openwrt_qemu.py \
--qemu /path/to/qemu-system-x86_64 \
--qemu-data-dir /path/to/pc-bios \
--ipk /path/to/veracrypt_<version>-r1_x86_64.ipk
```
The runner defaults to one QEMU vCPU because TCG with multiple vCPUs can
intermittently trip x86 APIC timer startup in the stock OpenWrt image.
The runner does not require external package feed access from the guest; all
runtime packages are served over the host-to-guest QEMU user-networking link.
Local userland packages come from the SDK `bin/` directory, while stock-image
kmods are downloaded by the host from the official OpenWrt kmod feed and staged
locally. If the VeraCrypt `.ipk` is not below the SDK `bin/` directory, pass
`--package-bin-dir /path/to/sdk/bin`.
For custom images whose kernel does not match the official release feed, pass
`--kmod-feed-url` for the matching kmod feed, or `--local-kmods` to resolve
kmods from `--package-bin-dir`.
The test log is written to:
```text
../openwrt-veracrypt/openwrt-qemu-test.log
```
## Runtime Packages
The VeraCrypt package itself declares the direct userland dependencies using
OpenWrt package symbols:
- `libstdcpp`
- `libfuse3`
- `bash`
OpenWrt's FUSE3 recipe defines `Package/libfuse3` with ABI version `3`, so the
binary IPK and package-index metadata are emitted as `libfuse3-3` while still
providing `libfuse3`. The QEMU test installs the seed runtime support normally
needed for useful mounts using package-index names:
- `libfuse3-3`
- `fuse3-utils`
- `kmod-fuse`
- `kmod-loop`
- `lvm2`
- `kmod-dm`
- `losetup`
- `blkid`
- `mount-utils`
- `kmod-crypto-misc`
The test resolver also stages required transitive dependencies from package
metadata, such as `libdevmapper` when pulled by `lvm2`.
Filesystem-specific mounts also need the corresponding OpenWrt filesystem
kernel modules and tools. Smart-card and EMV keyfile support should install
`libpcsclite`, `pcscd`, and the appropriate reader driver such as `ccid`; these
are optional and are not part of the base package dependency set.
@@ -0,0 +1,23 @@
CONFIG_TARGET_x86=y
CONFIG_TARGET_x86_64=y
# CONFIG_TARGET_MULTI_PROFILE is not set
# CONFIG_TARGET_ALL_PROFILES is not set
CONFIG_TARGET_DEVICE_x86_64_DEVICE_generic=y
# CONFIG_ALL is not set
# CONFIG_ALL_KMODS is not set
# CONFIG_ALL_NONSHARED is not set
# CONFIG_DEVEL is not set
CONFIG_PACKAGE_veracrypt=m
CONFIG_PACKAGE_bash=m
CONFIG_PACKAGE_libfuse3=m
CONFIG_PACKAGE_fuse3-utils=m
CONFIG_PACKAGE_kmod-fuse=m
CONFIG_PACKAGE_kmod-loop=m
CONFIG_PACKAGE_kmod-dm=m
CONFIG_PACKAGE_kmod-crypto-misc=m
CONFIG_PACKAGE_lvm2=m
CONFIG_PACKAGE_losetup=m
CONFIG_PACKAGE_blkid=m
CONFIG_PACKAGE_mount-utils=m
@@ -0,0 +1,90 @@
include $(TOPDIR)/rules.mk
PKG_NAME:=veracrypt
PKG_VERSION:=@VERACRYPT_VERSION@
PKG_RELEASE:=1
PKG_LICENSE:=Apache-2.0 AND LicenseRef-TrueCrypt
PKG_LICENSE_FILES:=veracrypt/src/License.txt
PKG_MAINTAINER:=Mounir IDRASSI <mounir.idrassi@amcrypto.jp>
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)
PKG_BUILD_PARALLEL:=1
PKG_BUILD_DEPENDS:=fuse3 pcsc-lite
VERACRYPT_STAGED_SOURCE:=sources/veracrypt
WXWIDGETS_STAGED_SOURCE:=sources/wxWidgets
include $(INCLUDE_DIR)/package.mk
RSTRIP:=:
STRIP:=:
define Package/veracrypt
SECTION:=utils
CATEGORY:=Utilities
SUBMENU:=Filesystem
TITLE:=VeraCrypt console
URL:=https://www.veracrypt.fr/
DEPENDS:=+libstdcpp +libfuse3 +bash
endef
define Package/veracrypt/description
Console-only VeraCrypt build for OpenWrt using FUSE3 and a static wxBase.
endef
define Build/Prepare
rm -rf "$(PKG_BUILD_DIR)"
$(INSTALL_DIR) "$(PKG_BUILD_DIR)"
rsync -a --delete \
--exclude .git \
--exclude 'src/wxrelease' \
--exclude 'src/wxdebug' \
--exclude 'src/Main/veracrypt' \
--exclude 'src/Setup/Linux/usr' \
--exclude '*.o' \
--exclude '*.d' \
--exclude '*.a' \
"$(VERACRYPT_STAGED_SOURCE)/" "$(PKG_BUILD_DIR)/veracrypt/"
rsync -a --delete "$(WXWIDGETS_STAGED_SOURCE)/" "$(PKG_BUILD_DIR)/wxWidgets/"
endef
define Build/Configure
endef
VC_COMMON_MAKE_FLAGS = \
AR="$(TARGET_AR)" \
CC="$(TARGET_CC)" \
CXX="$(TARGET_CXX)" \
AS="yasm" \
RANLIB="$(TARGET_RANLIB)" \
PKG_CONFIG="$(PKG_CONFIG)" \
PKG_CONFIG_PATH="$(PKG_CONFIG_PATH)" \
WX_ROOT="$(PKG_BUILD_DIR)/wxWidgets" \
WX_BUILD_DIR="$(PKG_BUILD_DIR)/wxBuildConsole" \
WX_CONFIGURE_EXTRA_FLAGS="--target=$(GNU_TARGET_NAME) --host=$(GNU_TARGET_NAME) --build=$(GNU_HOST_NAME) --prefix=/usr --exec-prefix=/usr --disable-rpath" \
TC_EXTRA_CFLAGS="$(TARGET_CFLAGS) $(TARGET_CPPFLAGS)" \
TC_EXTRA_CXXFLAGS="$(TARGET_CXXFLAGS) $(TARGET_CPPFLAGS)" \
TC_EXTRA_LFLAGS="$(TARGET_LDFLAGS)" \
NOGUI=1 \
WITHFUSE3=1 \
WXSTATIC=1 \
NOTEST=1 \
NOSTRIP=1 \
VERBOSE=1
define Build/Compile
+$(MAKE) -C "$(PKG_BUILD_DIR)/veracrypt/src" $(VC_COMMON_MAKE_FLAGS) clean
+$(MAKE) -C "$(PKG_BUILD_DIR)/veracrypt/src" $(VC_COMMON_MAKE_FLAGS) wxbuild
+$(MAKE) -C "$(PKG_BUILD_DIR)/veracrypt/src" $(PKG_JOBS) $(VC_COMMON_MAKE_FLAGS)
endef
define Package/veracrypt/install
$(INSTALL_DIR) "$(1)/usr/bin"
$(INSTALL_BIN) "$(PKG_BUILD_DIR)/veracrypt/src/Main/veracrypt" "$(1)/usr/bin/veracrypt"
$(INSTALL_DIR) "$(1)/sbin"
$(INSTALL_BIN) "$(PKG_BUILD_DIR)/veracrypt/src/Setup/Linux/mount.veracrypt" "$(1)/sbin/mount.veracrypt"
$(INSTALL_DIR) "$(1)/usr/share/licenses/veracrypt"
$(INSTALL_DATA) "$(PKG_BUILD_DIR)/veracrypt/src/License.txt" "$(1)/usr/share/licenses/veracrypt/License.txt"
endef
$(eval $(call BuildPackage,veracrypt))
+452
View File
@@ -0,0 +1,452 @@
#!/bin/sh
#
# Copyright (c) 2026 AM Crypto
# 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.
#
set -eu
umask 022
OPENWRT_VERSION=24.10.6
OPENWRT_TARGET=x86/64
WX_VERSION=3.2.10
WX_URL=
WX_SHA256=d66e929569947a4a5920699539089a9bda83a93e5f4917fb313a61f0c344b896
SDK_URL=
SDK_SHA256=
SDK_DIR=
FRESH_SDK=0
SCRIPT=$(readlink -f "$0")
SCRIPTPATH=$(dirname "$SCRIPT")
REPOROOT=$(readlink -f "$SCRIPTPATH/../..")
SOURCEPATH="$REPOROOT/src"
PARENTDIR=$(readlink -f "$SCRIPTPATH/../../..")
WORK_DIR="$PARENTDIR/openwrt-veracrypt"
JOBS=$(getconf _NPROCESSORS_ONLN 2>/dev/null || echo 1)
GAWK_VERSION=5.3.2
GAWK_URL="https://ftp.gnu.org/gnu/gawk/gawk-$GAWK_VERSION.tar.xz"
GAWK_SHA256=f8c3486509de705192138b00ef2c00bbbdd0e84c30d5c07d23fc73a9dc4cc9cc
usage() {
cat <<EOF
Usage: $(basename "$0") [options]
Build the VeraCrypt console-only OpenWrt package with the OpenWrt SDK.
Options:
--openwrt-version VERSION OpenWrt release to use (default: $OPENWRT_VERSION)
--target TARGET OpenWrt target/subtarget (default: $OPENWRT_TARGET)
--work-dir DIR Download/build workspace (default: $WORK_DIR)
--sdk-url URL SDK archive URL (auto-detected for x86/64)
--sdk-sha256 HASH SDK archive SHA-256 (required for custom SDKs)
--sdk-dir DIR Use an already extracted SDK directory
--fresh-sdk Re-extract the SDK before building
--wx-version VERSION wxWidgets version (default: $WX_VERSION)
--wx-url URL wxWidgets source archive URL
--wx-sha256 HASH wxWidgets source archive SHA-256
-j, --jobs N Parallel make jobs (default: host CPU count)
-h, --help Show this help
Only x86/64 is currently wired because it is the QEMU smoke-test target.
EOF
}
die() {
echo "Error: $*" >&2
exit 1
}
need_tool() {
command -v "$1" >/dev/null 2>&1 || die "Required tool '$1' was not found"
}
require_option_arg() {
[ $# -ge 2 ] || die "Option $1 requires an argument"
}
validate_version_token() {
name=$1
value=$2
case "$value" in
''|*[!A-Za-z0-9._+-]*)
die "$name must contain only letters, digits, '.', '_', '+', or '-'"
;;
esac
}
download_file() {
url=$1
out=$2
expected_sha=$3
tmp="$out.tmp.$$"
mkdir -p "$(dirname "$out")"
if [ -f "$out" ]; then
if [ -z "$expected_sha" ]; then
return
fi
actual_sha=$(sha256sum "$out" | awk '{print $1}')
if [ "$actual_sha" = "$expected_sha" ]; then
return
fi
echo "Checksum mismatch for existing $out; re-downloading" >&2
rm -f "$out"
fi
rm -f "$tmp"
echo "Downloading $url"
if ! wget -O "$tmp" "$url"; then
rm -f "$tmp"
die "Download failed: $url"
fi
if [ -n "$expected_sha" ]; then
actual_sha=$(sha256sum "$tmp" | awk '{print $1}')
if [ "$actual_sha" != "$expected_sha" ]; then
rm -f "$tmp"
die "SHA-256 mismatch for $out: expected $expected_sha, got $actual_sha"
fi
fi
mv "$tmp" "$out"
}
pinned_sdk_sha256() {
archive_name=$1
case "$OPENWRT_VERSION:$OPENWRT_TARGET:$archive_name" in
24.10.6:x86/64:openwrt-sdk-24.10.6-x86-64_gcc-13.3.0_musl.Linux-x86_64.tar.zst)
printf '%s\n' "9e398ea7efc098e4a986f97efff595e32d08c615fe356bcb3d885d7ad3a39ac0"
;;
esac
}
target_defaults() {
case "$OPENWRT_TARGET" in
x86/64)
OPENWRT_TARGET_SLUG=x86-64
OPENWRT_CONFIG="$REPOROOT/src/Build/Packaging/openwrt/configs/x86_64-minimal.config"
;;
*)
die "Unsupported target '$OPENWRT_TARGET'. Add a config under src/Build/Packaging/openwrt/configs first."
;;
esac
}
openwrt_base_url() {
printf 'https://downloads.openwrt.org/releases/%s/targets/%s\n' "$OPENWRT_VERSION" "$OPENWRT_TARGET"
}
resolve_sdk() {
if [ -n "$SDK_DIR" ]; then
SDK_DIR=$(readlink -f "$SDK_DIR")
[ -d "$SDK_DIR" ] || die "SDK directory does not exist: $SDK_DIR"
return
fi
base_url=$(openwrt_base_url)
mkdir -p "$WORK_DIR/downloads"
if [ -z "$SDK_URL" ]; then
index_file="$WORK_DIR/downloads/openwrt-$OPENWRT_VERSION-$OPENWRT_TARGET_SLUG-index.html"
wget -q -O "$index_file" "$base_url/"
sdk_archive=$(sed -n "s/.*href=\"\\(openwrt-sdk-$OPENWRT_VERSION-${OPENWRT_TARGET_SLUG}_[^\"]*\\.Linux-x86_64\\.tar\\.zst\\)\".*/\\1/p" "$index_file" | head -n 1)
[ -n "$sdk_archive" ] || die "Could not find an SDK archive at $base_url/"
SDK_URL="$base_url/$sdk_archive"
else
sdk_archive=$(basename "$SDK_URL")
fi
if [ -z "$SDK_SHA256" ]; then
SDK_SHA256=$(pinned_sdk_sha256 "$sdk_archive")
fi
[ -n "$SDK_SHA256" ] || die "No trusted SDK SHA-256 is available for $sdk_archive; pass --sdk-sha256 for custom SDKs"
SDK_ARCHIVE_PATH="$WORK_DIR/downloads/$sdk_archive"
download_file "$SDK_URL" "$SDK_ARCHIVE_PATH" "$SDK_SHA256"
sdk_top=$(zstd -dc "$SDK_ARCHIVE_PATH" | tar -tf - | sed -n '1{s,/.*,,;p;q;}')
[ -n "$sdk_top" ] || die "Could not determine SDK archive top-level directory"
SDK_DIR="$WORK_DIR/$sdk_top"
if [ "$FRESH_SDK" = "1" ]; then
rm -rf "$SDK_DIR"
fi
if [ ! -d "$SDK_DIR" ]; then
echo "Extracting $SDK_ARCHIVE_PATH"
zstd -dc "$SDK_ARCHIVE_PATH" | tar -xf - -C "$WORK_DIR"
fi
}
ensure_gawk() {
HOST_TOOLS="$WORK_DIR/host-tools"
if command -v gawk >/dev/null 2>&1; then
mkdir -p "$HOST_TOOLS/bin"
ln -sf "$(command -v gawk)" "$HOST_TOOLS/bin/gawk"
ln -sf "$(command -v gawk)" "$HOST_TOOLS/bin/awk"
return
fi
if [ -x "$HOST_TOOLS/prefix/bin/gawk" ]; then
mkdir -p "$HOST_TOOLS/bin"
ln -sf ../prefix/bin/gawk "$HOST_TOOLS/bin/gawk"
ln -sf ../prefix/bin/gawk "$HOST_TOOLS/bin/awk"
return
fi
need_tool make
if ! command -v gcc >/dev/null 2>&1 && ! command -v cc >/dev/null 2>&1; then
die "GNU awk is not installed and no C compiler was found to build it"
fi
mkdir -p "$HOST_TOOLS/src"
gawk_archive="$HOST_TOOLS/src/gawk-$GAWK_VERSION.tar.xz"
download_file "$GAWK_URL" "$gawk_archive" "$GAWK_SHA256"
rm -rf "$HOST_TOOLS/src/gawk-$GAWK_VERSION"
tar -xf "$gawk_archive" -C "$HOST_TOOLS/src"
echo "Building GNU awk $GAWK_VERSION for OpenWrt feed scripts"
(
cd "$HOST_TOOLS/src/gawk-$GAWK_VERSION"
./configure --prefix="$HOST_TOOLS/prefix" >/dev/null
make -j "$JOBS" >/dev/null
make install >/dev/null
)
mkdir -p "$HOST_TOOLS/bin"
ln -sf ../prefix/bin/gawk "$HOST_TOOLS/bin/gawk"
ln -sf ../prefix/bin/gawk "$HOST_TOOLS/bin/awk"
}
prepare_wxwidgets() {
if [ -z "$WX_URL" ]; then
WX_URL="https://github.com/wxWidgets/wxWidgets/releases/download/v$WX_VERSION/wxWidgets-$WX_VERSION.tar.bz2"
fi
wx_archive="$WORK_DIR/downloads/wxWidgets-$WX_VERSION.tar.bz2"
WX_SOURCE_DIR="$WORK_DIR/sources/wxWidgets-$WX_VERSION"
download_file "$WX_URL" "$wx_archive" "$WX_SHA256"
if [ ! -f "$WX_SOURCE_DIR/configure" ]; then
rm -rf "$WX_SOURCE_DIR"
mkdir -p "$WORK_DIR/sources"
echo "Extracting $wx_archive"
tar -xjf "$wx_archive" -C "$WORK_DIR/sources"
fi
}
sed_escape() {
printf '%s' "$1" | sed 's/[&|]/\\&/g'
}
assert_package_dir_outside_checkout() {
package_dir=$1
case "$package_dir/" in
"$REPOROOT"/*)
die "OpenWrt package directory is inside the VeraCrypt checkout; choose a --work-dir or --sdk-dir outside the repository"
;;
esac
}
stage_package_sources() {
package_dir=$1
staging_dir="$package_dir/sources"
assert_package_dir_outside_checkout "$package_dir"
rm -rf "$staging_dir"
mkdir -p "$staging_dir/veracrypt" "$staging_dir/wxWidgets"
rsync -a --delete \
--exclude .git \
--exclude 'src/wxrelease' \
--exclude 'src/wxdebug' \
--exclude 'src/Main/veracrypt' \
--exclude 'src/Setup/Linux/usr' \
--exclude '*.o' \
--exclude '*.d' \
--exclude '*.a' \
"$REPOROOT/" "$staging_dir/veracrypt/"
rsync -a --delete "$WX_SOURCE_DIR/" "$staging_dir/wxWidgets/"
}
render_package_makefile() {
version=$(sed -n 's/^#define[[:space:]][[:space:]]*VERSION_STRING[[:space:]][[:space:]]*"\([^"]*\)".*/\1/p' "$SOURCEPATH/Common/Tcdefs.h" | head -n 1)
[ -n "$version" ] || die "Could not determine VeraCrypt version from src/Common/Tcdefs.h"
validate_version_token "VeraCrypt version" "$version"
package_dir="$SDK_DIR/package/utils/veracrypt"
template="$REPOROOT/src/Build/Packaging/openwrt/package/utils/veracrypt/Makefile.in"
assert_package_dir_outside_checkout "$package_dir"
rm -rf "$package_dir"
mkdir -p "$package_dir"
stage_package_sources "$package_dir"
sed \
-e "s|@VERACRYPT_VERSION@|$(sed_escape "$version")|g" \
"$template" > "$package_dir/Makefile"
VERACRYPT_VERSION=$version
}
configure_sdk() {
[ -f "$OPENWRT_CONFIG" ] || die "Missing OpenWrt config seed: $OPENWRT_CONFIG"
cp "$OPENWRT_CONFIG" "$SDK_DIR/.config"
(
cd "$SDK_DIR"
if ! PATH="$HOST_TOOLS/bin:$PATH" ./scripts/feeds update packages base; then
echo "Feed update failed; removing stale feed checkouts and retrying" >&2
rm -rf feeds/base feeds/packages
PATH="$HOST_TOOLS/bin:$PATH" ./scripts/feeds update packages base
fi
PATH="$HOST_TOOLS/bin:$PATH" ./scripts/feeds install fuse3 lvm2 util-linux pcsc-lite bash
PATH="$HOST_TOOLS/bin:$PATH" make defconfig
)
}
build_package() {
(
cd "$SDK_DIR"
PATH="$HOST_TOOLS/bin:$PATH" make package/utils/veracrypt/clean V=s
PATH="$HOST_TOOLS/bin:$PATH" make package/utils/veracrypt/compile V=s -j "$JOBS"
)
IPK_PATH=$(find "$SDK_DIR/bin/packages" "$SDK_DIR/bin/targets" -name "veracrypt_${VERACRYPT_VERSION}-*.ipk" 2>/dev/null | sort | tail -n 1)
[ -n "$IPK_PATH" ] || die "Build completed but no VeraCrypt .ipk was found"
}
build_runtime_packages() {
(
cd "$SDK_DIR"
for target in \
package/feeds/packages/bash/compile \
package/feeds/packages/fuse3/compile \
package/feeds/base/util-linux/compile \
package/feeds/packages/lvm2/compile
do
echo "Building OpenWrt runtime dependency: $target"
PATH="$HOST_TOOLS/bin:$PATH" make "$target" V=s -j "$JOBS"
done
)
}
while [ $# -gt 0 ]; do
case "$1" in
--openwrt-version)
require_option_arg "$@"
OPENWRT_VERSION=$2
shift 2
;;
--target)
require_option_arg "$@"
OPENWRT_TARGET=$2
shift 2
;;
--work-dir)
require_option_arg "$@"
WORK_DIR=$(readlink -m "$2")
shift 2
;;
--sdk-url)
require_option_arg "$@"
SDK_URL=$2
shift 2
;;
--sdk-sha256)
require_option_arg "$@"
SDK_SHA256=$2
shift 2
;;
--sdk-dir)
require_option_arg "$@"
SDK_DIR=$2
shift 2
;;
--fresh-sdk)
FRESH_SDK=1
shift
;;
--wx-version)
require_option_arg "$@"
WX_VERSION=$2
shift 2
;;
--wx-url)
require_option_arg "$@"
WX_URL=$2
shift 2
;;
--wx-sha256)
require_option_arg "$@"
WX_SHA256=$2
shift 2
;;
-j|--jobs)
require_option_arg "$@"
JOBS=$2
shift 2
;;
-h|--help)
usage
exit 0
;;
*)
die "Unknown option: $1"
;;
esac
done
case "$JOBS" in
''|*[!0-9]*)
die "jobs must be a positive integer"
;;
esac
[ "$JOBS" -gt 0 ] || die "jobs must be a positive integer"
validate_version_token "wxWidgets version" "$WX_VERSION"
need_tool awk
need_tool find
need_tool make
need_tool rsync
need_tool sed
need_tool sha256sum
need_tool tar
need_tool wget
need_tool yasm
need_tool zstd
mkdir -p "$WORK_DIR"
target_defaults
resolve_sdk
ensure_gawk
prepare_wxwidgets
render_package_makefile
configure_sdk
build_package
build_runtime_packages
echo
echo "OpenWrt release: $OPENWRT_VERSION $OPENWRT_TARGET"
if [ -n "$SDK_URL" ]; then
echo "OpenWrt SDK: $SDK_URL"
else
echo "OpenWrt SDK: existing directory supplied with --sdk-dir"
fi
echo "SDK directory: $SDK_DIR"
echo "wxWidgets: $WX_URL"
echo "VeraCrypt package: $IPK_PATH"
sha256sum "$IPK_PATH"
echo
echo "Run the QEMU runtime test with:"
echo " python3 \"$SCRIPTPATH/test_veracrypt_openwrt_qemu.py\" --ipk \"$IPK_PATH\" --work-dir \"$WORK_DIR\""
+864
View File
@@ -0,0 +1,864 @@
#!/usr/bin/env python3
#
# Copyright (c) 2026 AM Crypto
# 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.
#
import argparse
import gzip
import hashlib
import http.server
import io
import lzma
import os
import re
import selectors
import shutil
import socketserver
import subprocess
import sys
import tarfile
import tempfile
import threading
import time
import urllib.parse
import urllib.request
from pathlib import Path
DEFAULT_OPENWRT_VERSION = "24.10.6"
DEFAULT_TARGET = "x86/64"
DEFAULT_PASSWORD = "OpenWrt-VeraCrypt-Test-Password-123456"
SHELL_PROMPT = ":~#"
PREINSTALLED_PACKAGES = {
"base-files",
"busybox",
"kernel",
"libc",
"libgcc1",
"libpthread",
"librt",
"opkg",
}
DEFAULT_RUNTIME_PACKAGES = [
"bash",
# OpenWrt emits the FUSE3 library IPK with its ABI suffix; it still
# Provides: libfuse3.
"libfuse3-3",
"fuse3-utils",
"lvm2",
"losetup",
"blkid",
"mount-utils",
"kmod-fuse",
"kmod-loop",
"kmod-dm",
"kmod-crypto-misc",
"veracrypt",
]
class TestError(Exception):
pass
class ReusableTCPServer(socketserver.TCPServer):
allow_reuse_address = True
class PackageMetadata:
def __init__(self, path, fields, url=None, source="local"):
self.path = path
self.url = url
self.source = source
self.package = fields.get("Package", "")
self.version = fields.get("Version", "")
self.filename = fields.get("Filename", "")
self.sha256sum = fields.get("SHA256sum", "")
self.depends = parse_depends(fields.get("Depends", ""))
self.provides = parse_name_list(fields.get("Provides", ""))
def identity(self):
if self.path:
return f"local:{self.path.resolve()}"
return f"remote:{self.url}"
def display_location(self):
return str(self.path) if self.path else self.url
def package_file_name(self):
if self.path:
return self.path.name
url_path = urllib.parse.urlparse(self.url).path
return Path(url_path).name
class Console:
def __init__(self, proc, log_path):
self.proc = proc
self.selector = selectors.DefaultSelector()
self.selector.register(proc.stdout, selectors.EVENT_READ)
os.set_blocking(proc.stdout.fileno(), False)
self.buffer = ""
self.log = open(log_path, "w", encoding="utf-8", errors="replace")
self.command_index = 0
def close(self):
self.log.close()
def _record(self, data):
text = data.decode("utf-8", errors="replace")
self.buffer += text
self.log.write(text)
self.log.flush()
sys.stdout.write(text)
sys.stdout.flush()
def send(self, text):
self.proc.stdin.write(text.encode("utf-8"))
self.proc.stdin.flush()
def read_until(self, patterns, timeout, start=0):
if isinstance(patterns, str):
patterns = [patterns]
deadline = time.monotonic() + timeout
while time.monotonic() < deadline:
tail = self.buffer[start:]
for pattern in patterns:
if pattern in tail:
return pattern
if self.proc.poll() is not None:
raise TestError(f"QEMU exited before seeing {patterns}")
events = self.selector.select(0.25)
for key, _ in events:
try:
data = os.read(key.fileobj.fileno(), 8192)
except BlockingIOError:
continue
if data:
self._record(data)
raise TestError(f"Timed out waiting for {patterns}")
def run(self, command, timeout=120):
self.command_index += 1
marker = f"__VC_STATUS_{self.command_index:03d}__"
start = len(self.buffer)
wrapped = (
f"printf '\\n__VC_BEGIN_{self.command_index:03d}__\\n'\n"
"{\n"
f"{command}\n"
"}\n"
f"echo {marker}:$?\n"
)
self.send(wrapped)
deadline = time.monotonic() + timeout
status_re = re.compile(rf"{re.escape(marker)}:(\d+)")
while time.monotonic() < deadline:
tail = self.buffer[start:]
match = status_re.search(tail)
if match:
self.read_until(SHELL_PROMPT, 60, start + match.end())
tail = self.buffer[start:]
status = int(match.group(1))
if status != 0:
raise TestError(f"Command failed with status {status}: {command}")
return tail
if self.proc.poll() is not None:
raise TestError(f"QEMU exited while running: {command}")
events = self.selector.select(0.25)
for key, _ in events:
try:
data = os.read(key.fileobj.fileno(), 8192)
except BlockingIOError:
continue
if data:
self._record(data)
raise TestError(f"Timed out running: {command}")
def target_info(target, version):
if target != "x86/64":
raise TestError("Only x86/64 is currently supported by this QEMU test")
return {
"slug": "x86-64",
"image": f"openwrt-{version}-x86-64-generic-ext4-combined.img.gz",
"manifest": f"openwrt-{version}-x86-64.manifest",
"base_url": f"https://downloads.openwrt.org/releases/{version}/targets/x86/64",
}
def sha256_file(path):
digest = hashlib.sha256()
with open(path, "rb") as fh:
for chunk in iter(lambda: fh.read(1024 * 1024), b""):
digest.update(chunk)
return digest.hexdigest()
def download(url, path, expected_sha256=None):
if path.exists() and expected_sha256:
actual_sha = sha256_file(path)
if actual_sha == expected_sha256:
return
print(f"Checksum mismatch for existing {path}; re-downloading", file=sys.stderr)
path.unlink()
elif path.exists():
return
path.parent.mkdir(parents=True, exist_ok=True)
tmp = path.with_name(f"{path.name}.tmp-{os.getpid()}")
if tmp.exists():
tmp.unlink()
print(f"Downloading {url}")
try:
with urllib.request.urlopen(url) as response, open(tmp, "wb") as out:
shutil.copyfileobj(response, out)
if expected_sha256:
actual_sha = sha256_file(tmp)
if actual_sha != expected_sha256:
raise TestError(f"SHA-256 mismatch for {path}: expected {expected_sha256}, got {actual_sha}")
tmp.replace(path)
finally:
if tmp.exists():
tmp.unlink()
def read_text_archive(path):
data = path.read_bytes()
if path.name.endswith(".gz"):
return gzip.decompress(data).decode("utf-8", errors="replace")
if path.name.endswith(".xz"):
return lzma.decompress(data).decode("utf-8", errors="replace")
return data.decode("utf-8", errors="replace")
def expected_sha_from_sums(sums_path, filename):
with open(sums_path, "r", encoding="utf-8") as fh:
for line in fh:
parts = line.split()
if len(parts) >= 2 and parts[1].lstrip("*") == filename:
return parts[0]
return None
def sh_quote(text):
return "'" + str(text).replace("'", "'\"'\"'") + "'"
def read_ar_control_archive(ipk_path):
with open(ipk_path, "rb") as fh:
magic = fh.read(8)
if magic != b"!<arch>\n":
raise TestError(f"Unsupported .ipk format for {ipk_path}")
while True:
header = fh.read(60)
if not header:
break
if len(header) != 60 or header[58:60] != b"`\n":
raise TestError(f"Malformed ar archive in {ipk_path}")
name = header[:16].decode("utf-8", errors="replace").strip().rstrip("/")
size = int(header[48:58].decode("ascii").strip())
data = fh.read(size)
if size % 2:
fh.read(1)
if Path(name).name.startswith("control.tar"):
return name, data
raise TestError(f"No control archive found in {ipk_path}")
def extract_top_level_control_archive(ipk_path):
with open(ipk_path, "rb") as fh:
magic = fh.read(8)
if magic == b"!<arch>\n":
return read_ar_control_archive(ipk_path)
try:
with tarfile.open(ipk_path, "r:*") as outer:
for member in outer:
if Path(member.name).name.startswith("control.tar"):
member_file = outer.extractfile(member)
if member_file:
return member.name, member_file.read()
except tarfile.TarError as exc:
raise TestError(f"Unsupported .ipk format for {ipk_path}: {exc}") from exc
raise TestError(f"No control archive found in {ipk_path}")
def open_control_tar(name, data):
try:
return tarfile.open(fileobj=io.BytesIO(data), mode="r:*")
except tarfile.TarError:
pass
if name.endswith(".zst"):
zstd = shutil.which("zstd")
if not zstd:
raise TestError(f"{name} is zstd-compressed, but zstd was not found")
result = subprocess.run([zstd, "-dc"], input=data, stdout=subprocess.PIPE, check=False)
if result.returncode != 0:
raise TestError(f"zstd failed while reading {name}")
return tarfile.open(fileobj=io.BytesIO(result.stdout), mode="r:")
if name.endswith(".gz"):
return tarfile.open(fileobj=io.BytesIO(gzip.decompress(data)), mode="r:")
if name.endswith(".xz"):
return tarfile.open(fileobj=io.BytesIO(lzma.decompress(data)), mode="r:")
raise TestError(f"Unsupported control archive compression: {name}")
def read_control_fields(ipk_path):
control_name, control_data = extract_top_level_control_archive(ipk_path)
with open_control_tar(control_name, control_data) as control_tar:
for member in control_tar:
if member.name in ("control", "./control") or member.name.endswith("/control"):
member_file = control_tar.extractfile(member)
if member_file:
text = member_file.read().decode("utf-8", errors="replace")
return parse_control_fields(text)
raise TestError(f"No control file found in {ipk_path}")
def parse_control_fields(text):
fields = {}
current = None
for line in text.splitlines():
if not line:
current = None
continue
if line[0].isspace() and current:
fields[current] += "\n" + line.strip()
continue
key, sep, value = line.partition(":")
if not sep:
continue
current = key
fields[key] = value.strip()
return fields
def parse_control_paragraphs(text):
paragraphs = []
lines = []
for line in text.splitlines():
if line.strip():
lines.append(line)
continue
if lines:
paragraphs.append(parse_control_fields("\n".join(lines)))
lines = []
if lines:
paragraphs.append(parse_control_fields("\n".join(lines)))
return paragraphs
def parse_package_name(text):
text = re.sub(r"\s*\([^)]*\)", "", text).strip()
return text.split()[0] if text else ""
def parse_depends(value):
groups = []
for item in value.replace("\n", " ").split(","):
alternatives = [parse_package_name(part) for part in item.split("|")]
alternatives = [name for name in alternatives if name]
if alternatives:
groups.append(alternatives)
return groups
def parse_name_list(value):
names = []
for item in value.replace("\n", " ").split(","):
name = parse_package_name(item)
if name:
names.append(name)
return names
def infer_package_bin_dir(ipk_path):
for parent in [ipk_path.parent] + list(ipk_path.parents):
if parent.name == "bin":
return parent
return ipk_path.parent
def read_package_metadata(ipk_path):
meta = PackageMetadata(ipk_path, read_control_fields(ipk_path))
if not meta.package:
raise TestError(f"Package metadata in {ipk_path} has no Package field")
return meta
def add_package_metadata(index, meta, override=False):
for name in [meta.package] + meta.provides:
if name and (override or name not in index):
index[name] = meta
def build_package_index(package_bin_dir, veracrypt_ipk, skip_local_kmods=False):
if not package_bin_dir.is_dir():
raise TestError(f"Package bin directory does not exist: {package_bin_dir}")
index = {}
for ipk in sorted(package_bin_dir.rglob("*.ipk")):
if skip_local_kmods and ipk.name.startswith("kmod-"):
continue
add_package_metadata(index, read_package_metadata(ipk))
add_package_metadata(index, read_package_metadata(veracrypt_ipk), override=True)
return index
def parse_packages_index(text, feed_url, source):
index = {}
feed_url = feed_url.rstrip("/") + "/"
for fields in parse_control_paragraphs(text):
package = fields.get("Package", "")
filename = fields.get("Filename", "")
if not package or not filename:
continue
url = urllib.parse.urljoin(feed_url, filename)
meta = PackageMetadata(None, fields, url=url, source=source)
add_package_metadata(index, meta)
return index
def download_packages_index(index_url, cache_path):
download(index_url, cache_path)
return read_text_archive(cache_path)
def official_index_cache_path(work_dir, info, name):
safe_name = re.sub(r"[^A-Za-z0-9._-]+", "_", name).strip("_")
return work_dir / "package-indexes" / info["slug"] / safe_name
def kmod_dir_from_kernel_version(version):
match = re.match(r"^([^~]+)~([0-9a-fA-F]+)-r([0-9A-Za-z_.+-]+)$", version)
if not match:
return None
linux_version, vermagic, release = match.groups()
return f"{linux_version}-{release}-{vermagic}"
def official_manifest_kernel_version(args, info):
manifest_url = f"{info['base_url']}/{info['manifest']}"
cache_path = official_index_cache_path(args.work_dir, info, info["manifest"])
download(manifest_url, cache_path)
manifest = read_text_archive(cache_path)
for line in manifest.splitlines():
name, sep, version = line.partition(" - ")
if sep and name == "kernel":
return version.strip()
return None
def discover_single_kmod_feed_url(info):
kmods_url = f"{info['base_url']}/kmods/"
print(f"Discovering OpenWrt kmod feed from {kmods_url}")
with urllib.request.urlopen(kmods_url) as response:
html = response.read().decode("utf-8", errors="replace")
candidates = sorted(set(re.findall(r'href="([^"/]+-[^"/]+-[0-9a-fA-F]+/)"', html)))
if len(candidates) == 1:
return urllib.parse.urljoin(kmods_url, candidates[0]).rstrip("/")
if not candidates:
raise TestError(f"Could not discover an OpenWrt kmod feed at {kmods_url}")
raise TestError(
"Multiple OpenWrt kmod feeds are available; pass --kmod-feed-url explicitly: "
+ ", ".join(urllib.parse.urljoin(kmods_url, candidate).rstrip("/") for candidate in candidates)
)
def resolve_official_kmod_feed_url(args, info):
if args.kmod_feed_url:
return args.kmod_feed_url.rstrip("/")
kernel_version = official_manifest_kernel_version(args, info)
if kernel_version:
kmod_dir = kmod_dir_from_kernel_version(kernel_version)
if kmod_dir:
return f"{info['base_url']}/kmods/{kmod_dir}"
return discover_single_kmod_feed_url(info)
def official_kmod_package_index(args):
info = target_info(args.target, args.openwrt_version)
feed_url = resolve_official_kmod_feed_url(args, info)
index_url = f"{feed_url}/Packages.gz"
cache_path = official_index_cache_path(args.work_dir, info, f"kmods-{Path(feed_url).name}-Packages.gz")
text = download_packages_index(index_url, cache_path)
index = parse_packages_index(text, feed_url, f"official kmods {feed_url}")
if not index:
raise TestError(f"No packages were found in OpenWrt kmod feed {index_url}")
return index, feed_url
def overlay_package_index(index, overlay):
seen = set()
for meta in overlay.values():
meta_key = meta.identity()
if meta_key in seen:
continue
seen.add(meta_key)
add_package_metadata(index, meta, override=True)
def resolve_runtime_packages(package_index, seed_packages):
resolved = []
resolved_paths = set()
visiting = set()
def visit(name, chain):
if name in PREINSTALLED_PACKAGES:
return
meta = package_index.get(name)
if not meta:
chain_text = " -> ".join(chain + [name])
raise TestError(f"Missing .ipk metadata for dependency '{name}' while resolving {chain_text}")
meta_key = meta.identity()
if meta_key in resolved_paths:
return
if meta_key in visiting:
return
visiting.add(meta_key)
for alternatives in meta.depends:
selected = None
for alternative in alternatives:
if alternative in PREINSTALLED_PACKAGES or alternative in package_index:
selected = alternative
break
if not selected:
chain_text = " -> ".join(chain + [meta.package])
raise TestError(
f"Missing .ipk metadata for dependency '{alternatives[0]}' required by {chain_text}"
)
visit(selected, chain + [meta.package])
visiting.remove(meta_key)
resolved_paths.add(meta_key)
resolved.append(meta)
for package in seed_packages:
visit(package, [])
return resolved
def staged_package_name(index, meta):
return f"{index:03d}-{meta.package_file_name()}"
def ensure_remote_package(meta, cache_dir):
if not meta.url:
raise TestError(f"Package {meta.package} has no local path or remote URL")
file_name = meta.package_file_name()
cache_name = f"{hashlib.sha256(meta.url.encode('utf-8')).hexdigest()[:12]}-{file_name}"
cached = cache_dir / cache_name
def verify_cached():
if meta.sha256sum and sha256_file(cached) != meta.sha256sum:
cached.unlink()
return False
return True
if cached.exists() and verify_cached():
return cached
download(meta.url, cached, meta.sha256sum)
if meta.sha256sum and sha256_file(cached) != meta.sha256sum:
raise TestError(f"SHA-256 mismatch for {cached} downloaded from {meta.url}")
return cached
def stage_packages(packages, directory, cache_dir):
directory.mkdir(parents=True, exist_ok=True)
cache_dir.mkdir(parents=True, exist_ok=True)
for index, meta in enumerate(packages):
source = meta.path if meta.path else ensure_remote_package(meta, cache_dir)
shutil.copy2(source, directory / staged_package_name(index, meta))
def package_download_command(packages, http_port):
lines = [
"set -e",
"rm -rf /tmp/veracrypt-ipks",
"mkdir -p /tmp/veracrypt-ipks",
]
for index, meta in enumerate(packages):
package_name = staged_package_name(index, meta)
url_path = urllib.parse.quote(package_name, safe="")
lines.append(
f"wget -O {sh_quote(f'/tmp/veracrypt-ipks/{package_name}')} "
f"{sh_quote(f'http://10.0.2.2:{http_port}/{url_path}')}"
)
lines.append("opkg install /tmp/veracrypt-ipks/*.ipk")
return "\n".join(lines)
def prepare_image(args):
if args.image:
image = Path(args.image).resolve()
if not image.exists():
raise TestError(f"Image does not exist: {image}")
return image
info = target_info(args.target, args.openwrt_version)
image_gz = args.work_dir / "images" / info["image"]
image = image_gz.with_suffix("")
sums = args.work_dir / "images" / f"sha256sums-{args.openwrt_version}-{info['slug']}"
download(f"{info['base_url']}/sha256sums", sums)
expected_sha = expected_sha_from_sums(sums, info["image"])
if not expected_sha:
raise TestError(f"Could not find {info['image']} in {sums}")
download(f"{info['base_url']}/{info['image']}", image_gz, expected_sha)
actual_sha = sha256_file(image_gz)
if actual_sha != expected_sha:
raise TestError(f"SHA-256 mismatch for {image_gz}: expected {expected_sha}, got {actual_sha}")
if not image.exists():
print(f"Extracting {image_gz}")
with open(image, "wb") as out:
result = subprocess.run(["gzip", "-cd", str(image_gz)], stdout=out)
if result.returncode not in (0, 2):
raise TestError(f"gzip failed while extracting {image_gz}")
return image
def start_http_server(directory, address, port):
handler = lambda *args, **kwargs: http.server.SimpleHTTPRequestHandler(
*args, directory=str(directory), **kwargs
)
server = ReusableTCPServer((address, port), handler)
thread = threading.Thread(target=server.serve_forever, daemon=True)
thread.start()
return server
def boot_qemu(args, image):
qemu = shutil.which(args.qemu) if os.sep not in args.qemu else args.qemu
if not qemu:
raise TestError("qemu-system-x86_64 was not found; install QEMU or pass --qemu")
netdev = "user,id=net0"
if args.ssh_port is not None:
netdev += f",hostfwd=tcp::{args.ssh_port}-:22"
qemu_cmd = [
qemu,
"-accel", args.accel,
"-M", "pc",
"-cpu", args.cpu,
"-m", args.memory,
"-smp", str(args.smp),
"-nographic",
"-drive", f"file={image},format=raw,if=virtio",
"-netdev", netdev,
"-device", "virtio-net-pci,netdev=net0",
]
if args.qemu_data_dir:
qemu_cmd[1:1] = ["-L", str(args.qemu_data_dir)]
print("Starting QEMU:")
print(" ".join(qemu_cmd))
return subprocess.Popen(
qemu_cmd,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
)
def run_guest_tests(args, console, http_port, packages):
console.read_until(["Please press Enter", SHELL_PROMPT], args.boot_timeout)
prompt_start = len(console.buffer)
console.send("\n")
console.read_until(SHELL_PROMPT, 90, prompt_start)
console.run(
"sleep 20\n"
"if ip link show br-lan >/dev/null 2>&1; then NETDEV=br-lan; else NETDEV=eth0; fi\n"
"ip addr flush dev \"$NETDEV\" || true\n"
"ip link set \"$NETDEV\" up\n"
"udhcpc -n -q -t 10 -i \"$NETDEV\"\n"
"ip -4 addr show \"$NETDEV\"\n"
"ping -c 1 10.0.2.2",
timeout=120,
)
console.run(package_download_command(packages, http_port), timeout=900)
version_output = console.run("veracrypt --text --version", timeout=120)
if "VeraCrypt " not in version_output:
raise TestError("version command did not print a VeraCrypt version")
test_output = console.run("veracrypt --text --test", timeout=240)
if "Self-tests of all algorithms passed" not in test_output:
raise TestError("algorithm self-test did not report success")
if not args.skip_container:
quoted_container_size = sh_quote(args.container_size)
quoted_password = sh_quote(args.password)
console.run("dd if=/dev/urandom of=/tmp/vc-random.bin bs=1M count=1", timeout=120)
console.run(
"veracrypt --text --create /tmp/openwrt-test.hc "
f"--size={quoted_container_size} "
f"--password={quoted_password} "
"--encryption=AES --hash=SHA-512 --filesystem=none "
"--volume-type=normal --random-source=/tmp/vc-random.bin "
"--quick --force --non-interactive",
timeout=360,
)
console.run("mkdir -p /mnt/veracrypt-test", timeout=60)
console.run(
"veracrypt --text --mount /tmp/openwrt-test.hc /mnt/veracrypt-test "
f"--password={quoted_password} "
"--pim=0 --keyfiles='' --protect-hidden=no --filesystem=none --non-interactive",
timeout=240,
)
list_output = console.run("veracrypt --text --list", timeout=120)
if "/dev/mapper/veracrypt" not in list_output:
raise TestError("container did not appear in veracrypt --list output")
console.run("veracrypt --text --unmount /tmp/openwrt-test.hc", timeout=180)
def parse_args():
parser = argparse.ArgumentParser(description="Boot OpenWrt in QEMU and test a VeraCrypt .ipk")
parser.add_argument("--ipk", required=True, type=Path, help="Path to veracrypt_*.ipk")
parser.add_argument(
"--package-bin-dir",
type=Path,
help="SDK bin directory containing local dependency .ipk files; defaults to the nearest bin parent of --ipk",
)
parser.add_argument("--openwrt-version", default=DEFAULT_OPENWRT_VERSION)
parser.add_argument("--target", default=DEFAULT_TARGET)
parser.add_argument("--work-dir", type=Path, default=None)
parser.add_argument("--image", type=Path, help="Use an already extracted OpenWrt raw image")
parser.add_argument("--qemu", default="qemu-system-x86_64")
parser.add_argument("--qemu-data-dir", type=Path, help="QEMU pc-bios directory for locally extracted QEMU builds")
parser.add_argument("--accel", default="tcg")
parser.add_argument("--cpu", default="max")
parser.add_argument("--memory", default="512M")
parser.add_argument("--smp", default=1, type=int)
parser.add_argument(
"--ssh-port",
type=int,
metavar="PORT",
help="Forward host TCP PORT to guest SSH; disabled by default",
)
parser.add_argument("--http-port", default=0, type=int)
parser.add_argument(
"--http-bind-address",
default="127.0.0.1",
help="Host address for the temporary package server (default: 127.0.0.1)",
)
parser.add_argument(
"--kmod-feed-url",
help="OpenWrt kmod feed URL; defaults to the official feed matching --openwrt-version and --target",
)
parser.add_argument(
"--local-kmods",
action="store_true",
help="Resolve kmod-* packages from --package-bin-dir instead of the official OpenWrt kmod feed",
)
parser.add_argument("--boot-timeout", default=180, type=int)
parser.add_argument("--container-size", default="16M")
parser.add_argument("--password", default=DEFAULT_PASSWORD)
parser.add_argument("--skip-container", action="store_true")
parser.add_argument("--keep-image", action="store_true")
return parser.parse_args()
def main():
args = parse_args()
args.ipk = args.ipk.resolve()
if not args.ipk.exists():
raise TestError(f"Package does not exist: {args.ipk}")
if args.package_bin_dir is None:
args.package_bin_dir = infer_package_bin_dir(args.ipk)
args.package_bin_dir = args.package_bin_dir.resolve()
repo_root = Path(__file__).resolve().parents[2]
if args.work_dir is None:
args.work_dir = repo_root.parent / "openwrt-veracrypt"
args.work_dir = args.work_dir.resolve()
args.work_dir.mkdir(parents=True, exist_ok=True)
package_index = build_package_index(
args.package_bin_dir,
args.ipk,
skip_local_kmods=not args.local_kmods,
)
if not args.local_kmods:
kmod_index, kmod_feed_url = official_kmod_package_index(args)
overlay_package_index(package_index, kmod_index)
print(f"Using OpenWrt kmod feed: {kmod_feed_url}")
packages = resolve_runtime_packages(package_index, DEFAULT_RUNTIME_PACKAGES)
print("Resolved OpenWrt packages:")
for index, meta in enumerate(packages):
print(f" {index:02d} {meta.package}: {meta.display_location()}")
base_image = prepare_image(args)
test_image = args.work_dir / "images" / f"{base_image.stem}-veracrypt-test.img"
test_image.parent.mkdir(parents=True, exist_ok=True)
if test_image.exists():
test_image.unlink()
shutil.copyfile(base_image, test_image)
with tempfile.TemporaryDirectory(prefix="veracrypt-ipks-", dir=args.work_dir) as package_dir:
server_root = Path(package_dir)
stage_packages(packages, server_root, args.work_dir / "package-cache")
server = start_http_server(server_root, args.http_bind_address, args.http_port)
http_port = server.server_address[1]
print(f"Serving staged packages from {server_root} on http://{args.http_bind_address}:{http_port}/")
log_path = args.work_dir / "openwrt-qemu-test.log"
proc = None
console = None
try:
proc = boot_qemu(args, test_image)
console = Console(proc, log_path)
run_guest_tests(args, console, http_port, packages)
console.send("poweroff\n")
try:
proc.wait(timeout=90)
except subprocess.TimeoutExpired:
proc.terminate()
proc.wait(timeout=30)
finally:
server.shutdown()
server.server_close()
if console:
console.close()
if proc and proc.poll() is None:
proc.terminate()
if not args.keep_image and test_image.exists():
test_image.unlink()
print()
print("OpenWrt QEMU test passed")
print(f"Log: {log_path}")
if __name__ == "__main__":
try:
main()
except TestError as exc:
print(f"Error: {exc}", file=sys.stderr)
sys.exit(1)
+2 -2
View File
@@ -27,8 +27,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,28,0
PRODUCTVERSION 1,26,28,0
FILEVERSION 1,26,28,1
PRODUCTVERSION 1,26,28,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
+27
View File
@@ -437,6 +437,33 @@ DWORD BaseCom::GetSecureBootConfig (BOOL* pSecureBootEnabled, BOOL *pVeraCryptKe
return ERROR_SUCCESS;
}
DWORD BaseCom::GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported)
{
if (!pMicrosoft2023UefiCAsSupported)
return ERROR_INVALID_PARAMETER;
try
{
BootEncryption bootEnc (NULL);
bootEnc.GetEfiBootLoaderSigningSupport (pMicrosoft2023UefiCAsSupported);
}
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::WriteEfiBootSectorUserConfig (DWORD userConfig, BSTR customUserMessage, int pim, int hashAlg)
{
if (!customUserMessage)
+1
View File
@@ -119,6 +119,7 @@ public:
static DWORD WriteEfiBootSectorUserConfig (DWORD userConfig, BSTR customUserMessage, int pim, int hashAlg);
static DWORD UpdateSetupConfigFile (BOOL bForInstall);
static DWORD GetSecureBootConfig (BOOL* pSecureBootEnabled, BOOL *pVeraCryptKeysLoaded);
static DWORD GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported);
static DWORD NotifyService (DWORD dwNotifyCode);
static DWORD FastFileResize (BSTR filePath, __int64 fileSize);
+630 -71
View File
@@ -631,6 +631,18 @@ namespace VeraCrypt
}
}
static void GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported)
{
Elevate();
DWORD result = ElevatedComInstance->GetEfiBootLoaderSigningSupport (pMicrosoft2023UefiCAsSupported);
if (result != ERROR_SUCCESS)
{
SetLastError (result);
throw SystemException(SRC_POS);
}
}
static void WriteEfiBootSectorUserConfig (uint8 userConfig, const string &customUserMessage, int pim, int hashAlg)
{
Elevate();
@@ -755,6 +767,7 @@ namespace VeraCrypt
static void WriteEfiBootSectorUserConfig (uint8 userConfig, const string &customUserMessage, int pim, int hashAlg) { throw ParameterIncorrect (SRC_POS); }
static void UpdateSetupConfigFile (bool bForInstall) { throw ParameterIncorrect (SRC_POS); }
static void GetSecureBootConfig (BOOL* pSecureBootEnabled, BOOL *pVeraCryptKeysLoaded) { throw ParameterIncorrect (SRC_POS); }
static void GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported) { throw ParameterIncorrect (SRC_POS); }
static void RegisterSystemFavoritesService(BOOL registerService) { throw ParameterIncorrect(SRC_POS); }
static BOOL IsPagingFileActive(BOOL checkNonWindowsPartitionsOnly) { throw ParameterIncorrect(SRC_POS); }
static void WriteLocalMachineRegistryDwordValue(wchar_t* keyPath, wchar_t* valueName, DWORD value) { throw ParameterIncorrect(SRC_POS); }
@@ -2504,6 +2517,530 @@ namespace VeraCrypt
}
static const wchar_t* EfiVarGuid = L"{8BE4DF61-93CA-11D2-AA0D-00E098032B8C}";
static const wchar_t* EfiImageSecurityDatabaseGuid = L"{D719B2CB-3D3A-4596-A3BC-DAD00E67656F}";
struct EfiBootLoaderResourceSet
{
int DcsBoot;
int DcsInt;
int DcsCfg;
int LegacySpeaker;
int DcsRescue;
int DcsInfo;
};
struct EfiBootLoaderImages
{
uint8 *DcsBoot;
DWORD SizeDcsBoot;
uint8 *DcsInt;
DWORD SizeDcsInt;
uint8 *DcsCfg;
DWORD SizeDcsCfg;
uint8 *LegacySpeaker;
DWORD SizeLegacySpeaker;
uint8 *DcsRescue;
DWORD SizeDcsRescue;
uint8 *DcsInfo;
DWORD SizeDcsInfo;
DWORD ResourceSet;
const wchar_t *SelectionReason;
DWORD FirmwareDbError;
};
struct EfiBootLoaderResourceSelection
{
const EfiBootLoaderResourceSet *Resources;
DWORD ResourceSet;
const wchar_t *Reason;
DWORD FirmwareDbError;
};
static const EfiBootLoaderResourceSet EfiBootLoaderResources2011 =
{
IDR_EFI_DCSBOOT_2011,
IDR_EFI_DCSINT_2011,
IDR_EFI_DCSCFG_2011,
IDR_EFI_LEGACYSPEAKER_2011,
IDR_EFI_DCSRE_2011,
IDR_EFI_DCSINFO_2011
};
static const EfiBootLoaderResourceSet EfiBootLoaderResources2023 =
{
IDR_EFI_DCSBOOT_2023,
IDR_EFI_DCSINT_2023,
IDR_EFI_DCSCFG_2023,
IDR_EFI_LEGACYSPEAKER_2023,
IDR_EFI_DCSRE_2023,
IDR_EFI_DCSINFO_2023
};
static const wchar_t *EfiBootLoaderDiagnosticsRegistryKey = L"Software\\VeraCrypt\\Diagnostics\\EfiBootLoader";
static bool ReadFirmwareEnvironmentVariableBuffer (const wchar_t* name, const wchar_t* guid, std::vector<uint8>& value, DWORD* pLastError = NULL)
{
bool bRet = false;
DWORD dwError = ERROR_SUCCESS;
BOOL bPrivilegesSet = IsPrivilegeEnabled (SE_SYSTEM_ENVIRONMENT_NAME);
BOOL bPrivilegeEnabled = FALSE;
const DWORD maxBufferSize = 16 * 1024 * 1024;
DWORD bufferSize = 16384;
value.clear ();
if (pLastError)
*pLastError = ERROR_SUCCESS;
if (!bPrivilegesSet)
{
if (!SetPrivilege (SE_SYSTEM_ENVIRONMENT_NAME, TRUE))
{
dwError = GetLastError ();
if (dwError == ERROR_SUCCESS)
dwError = ERROR_PRIVILEGE_NOT_HELD;
if (pLastError)
*pLastError = dwError;
SetLastError (dwError);
return false;
}
bPrivilegeEnabled = TRUE;
}
try
{
while (bufferSize <= maxBufferSize)
{
value.resize (bufferSize);
SetLastError (ERROR_SUCCESS);
DWORD dwLen = GetFirmwareEnvironmentVariableW (name, guid, value.data(), bufferSize);
if (dwLen != 0)
{
value.resize (dwLen);
bRet = true;
break;
}
dwError = GetLastError ();
if (dwError == ERROR_SUCCESS)
{
value.resize (0);
bRet = true;
break;
}
if ((dwError != ERROR_INSUFFICIENT_BUFFER) || (bufferSize == maxBufferSize))
break;
bufferSize = (bufferSize > (maxBufferSize / 2)) ? maxBufferSize : (bufferSize * 2);
}
}
catch (...)
{
if (bPrivilegeEnabled)
SetPrivilege (SE_SYSTEM_ENVIRONMENT_NAME, FALSE);
throw;
}
if (bPrivilegeEnabled)
SetPrivilege (SE_SYSTEM_ENVIRONMENT_NAME, FALSE);
if (!bRet)
{
value.clear ();
if (dwError == ERROR_SUCCESS)
dwError = GetLastError ();
if (dwError == ERROR_SUCCESS)
dwError = ERROR_INVALID_DATA;
if (pLastError)
*pLastError = dwError;
SetLastError (dwError);
}
return bRet;
}
static EfiBootLoaderResourceSelection MakeEfiBootLoaderResourceSelection (const EfiBootLoaderResourceSet& resources, DWORD resourceSet, const wchar_t *reason, DWORD firmwareDbError)
{
EfiBootLoaderResourceSelection selection = { &resources, resourceSet, reason, firmwareDbError };
return selection;
}
static void RecordEfiBootLoaderResourceSetSelection (const EfiBootLoaderImages& images)
{
if (!images.ResourceSet || !images.SelectionReason)
return;
DWORD previousLastError = GetLastError ();
WCHAR selectionTimeUtc[32] = {0};
SYSTEMTIME systemTime;
GetSystemTime (&systemTime);
StringCchPrintfW (selectionTimeUtc, ARRAYSIZE (selectionTimeUtc), L"%04u-%02u-%02uT%02u:%02u:%02uZ",
systemTime.wYear, systemTime.wMonth, systemTime.wDay, systemTime.wHour, systemTime.wMinute, systemTime.wSecond);
WriteLocalMachineRegistryDword ((wchar_t *) EfiBootLoaderDiagnosticsRegistryKey, L"EfiBootLoaderResourceSet", images.ResourceSet);
WriteLocalMachineRegistryDword ((wchar_t *) EfiBootLoaderDiagnosticsRegistryKey, L"EfiBootLoaderFirmwareDbLastError", images.FirmwareDbError);
WriteLocalMachineRegistryString (EfiBootLoaderDiagnosticsRegistryKey, L"EfiBootLoaderSelectionReason", images.SelectionReason, FALSE);
WriteLocalMachineRegistryString (EfiBootLoaderDiagnosticsRegistryKey, L"EfiBootLoaderSelectionTimeUtc", selectionTimeUtc, FALSE);
SetLastError (previousLastError);
}
static uint32 ReadUint32LittleEndian (const uint8* buffer)
{
return (uint32) buffer[0]
| ((uint32) buffer[1] << 8)
| ((uint32) buffer[2] << 16)
| ((uint32) buffer[3] << 24);
}
static bool BufferEquals (const uint8* buffer, const uint8* expected, size_t expectedSize)
{
// Callers of this overload must first verify that buffer contains at least expectedSize bytes.
return memcmp (buffer, expected, expectedSize) == 0;
}
static bool BufferEquals (const uint8* buffer, size_t bufferSize, const uint8* expected, size_t expectedSize)
{
return (bufferSize == expectedSize) && BufferEquals (buffer, expected, expectedSize);
}
static bool FirmwareDbBufferContainsMicrosoft2023UefiCAs (const std::vector<uint8>& db)
{
// Microsoft documents these CAs as valid db entries in EFI_CERT_X509_GUID or EFI_CERT_RSA2048_GUID form:
// https://learn.microsoft.com/windows-hardware/manufacture/desktop/windows-secure-boot-key-creation-and-management-guidance
// EFI_CERT_X509_GUID {a5c059a1-94e4-4aa7-87b5-ab155c2bf072}
static const uint8 efiCertX509Guid[16] = { 0xA1, 0x59, 0xC0, 0xA5, 0xE4, 0x94, 0xA7, 0x4A, 0x87, 0xB5, 0xAB, 0x15, 0x5C, 0x2B, 0xF0, 0x72 };
// EFI_CERT_RSA2048_GUID {3c5766e8-269c-4e34-aa14-ed776e85b3b6}
static const uint8 efiCertRsa2048Guid[16] = { 0xE8, 0x66, 0x57, 0x3C, 0x9C, 0x26, 0x34, 0x4E, 0xAA, 0x14, 0xED, 0x77, 0x6E, 0x85, 0xB3, 0xB6 };
const size_t efiRsa2048KeySize = 256;
// X.509 entries are matched by embedded CA public-key modulus bytes; RSA2048 entries contain this modulus directly.
// This is a byte-presence heuristic for bootloader-set selection, not full certificate-chain validation.
// Microsoft UEFI CA 2023, SHA-1 thumbprint B5EEB4A6706048073F0ED296E7F580A790B59EAA.
// DER source: https://go.microsoft.com/fwlink/?linkid=2239872, SHA-256 F6124E34125BEE3FE6D79A574EAA7B91C0E7BD9D929C1A321178EFD611DAD901.
static const uint8 microsoftUefiCa2023Rsa2048Modulus[256] =
{
0xBD, 0x22, 0x2A, 0xAE, 0xEF, 0x1A, 0x31, 0x85,
0x13, 0x78, 0x51, 0xA7, 0x9B, 0xFD, 0xFC, 0x78,
0xD1, 0x63, 0xB8, 0x1A, 0x9B, 0x63, 0xF5, 0x12,
0x06, 0xDB, 0x4B, 0x41, 0x35, 0x6A, 0x6F, 0xAB,
0xF5, 0x6A, 0x04, 0xCC, 0x97, 0xCF, 0xBB, 0xD4,
0x08, 0x09, 0x1A, 0x61, 0x3A, 0x0D, 0xE6, 0xB3,
0xA0, 0x46, 0xFF, 0x09, 0xAD, 0xDE, 0x80, 0x24,
0xDC, 0x12, 0x80, 0xF2, 0x5F, 0xD9, 0x16, 0xED,
0xE2, 0x42, 0x9D, 0xCD, 0x2F, 0x4D, 0x61, 0x02,
0x61, 0x8A, 0x1C, 0x4B, 0x1D, 0x18, 0x62, 0x39,
0x86, 0x97, 0x71, 0xAD, 0x3E, 0x7F, 0x5D, 0x71,
0x13, 0x4B, 0xE9, 0x2A, 0x00, 0xC1, 0xBE, 0xD5,
0xB7, 0x00, 0x9F, 0x5E, 0x65, 0xB2, 0x2C, 0x1A,
0xFF, 0x74, 0xED, 0xEA, 0x83, 0xD2, 0x39, 0x89,
0x33, 0x35, 0x73, 0x7D, 0xA0, 0xA2, 0xFA, 0x40,
0xE4, 0x66, 0x50, 0x58, 0xAA, 0xFC, 0x87, 0xE8,
0x5C, 0x20, 0x83, 0x34, 0xEC, 0xAB, 0xE2, 0x0B,
0xC5, 0x5F, 0x3E, 0xFF, 0x48, 0x2B, 0x11, 0x91,
0x26, 0xEF, 0x18, 0x6E, 0x57, 0xC5, 0x9F, 0x18,
0x73, 0x99, 0xEF, 0xE1, 0x6A, 0x74, 0x2B, 0xBB,
0x2F, 0x7F, 0x50, 0x8E, 0x1D, 0xDA, 0x3D, 0x76,
0xB6, 0x04, 0xE5, 0xCC, 0x2E, 0x10, 0xC7, 0x83,
0x1B, 0x83, 0xA3, 0xE4, 0xA5, 0x13, 0x13, 0x71,
0x6E, 0x33, 0x78, 0xA3, 0xA8, 0x3C, 0xEC, 0x48,
0x26, 0x5E, 0xC7, 0xC6, 0x5E, 0x0D, 0x87, 0x9A,
0xAA, 0xCC, 0x55, 0x34, 0x81, 0xAD, 0x9D, 0x90,
0xF5, 0xE6, 0x96, 0x63, 0xA6, 0xE8, 0x07, 0x20,
0x17, 0xC8, 0x93, 0x1E, 0xD2, 0xAE, 0xA4, 0xDC,
0xAE, 0x7D, 0x59, 0xBF, 0x88, 0x5E, 0x62, 0x0C,
0xAE, 0x5B, 0xF2, 0x29, 0x40, 0x56, 0x1D, 0x26,
0x40, 0xDE, 0x85, 0xA6, 0xAD, 0x56, 0xD1, 0xCF,
0x55, 0x47, 0x76, 0x5F, 0x9C, 0x39, 0xDB, 0x03
};
// Microsoft Option ROM UEFI CA 2023, SHA-1 thumbprint 3FB39E2B8BD183BF9E4594E72183CA60AFCD4277.
// DER source: https://go.microsoft.com/fwlink/?linkid=2284009, SHA-256 E5BE3E64C6E66A281457ECDECE0D6D0787577AAD2A3A0144262C10C14BA8D8F1.
static const uint8 microsoftOptionRomUefiCa2023Rsa2048Modulus[256] =
{
0xD3, 0x0B, 0xFE, 0x89, 0xCD, 0xCD, 0xB6, 0xEE,
0xDC, 0xE5, 0x1A, 0x8D, 0xDC, 0xCA, 0x21, 0x1A,
0x0F, 0x22, 0x2F, 0x0B, 0xB5, 0x32, 0x84, 0x35,
0xC0, 0xBE, 0x6F, 0x70, 0x93, 0x55, 0xB4, 0x47,
0xCC, 0x49, 0x03, 0xC2, 0xFE, 0xCF, 0xBA, 0x32,
0x65, 0x64, 0xB7, 0x35, 0xBD, 0x04, 0x3B, 0x44,
0x64, 0x2F, 0xA0, 0xF2, 0xDD, 0xE1, 0x5D, 0xBA,
0xE7, 0xBD, 0x39, 0x9A, 0xBD, 0xCB, 0x4B, 0xE1,
0x83, 0xAA, 0x1B, 0xE8, 0x6F, 0x4E, 0x4C, 0x91,
0x52, 0x43, 0xA5, 0xC4, 0x50, 0x55, 0x68, 0xF5,
0xDA, 0xAC, 0x48, 0xA2, 0x9C, 0xEC, 0x35, 0xA7,
0x04, 0x56, 0x68, 0x19, 0xE2, 0xB1, 0x62, 0xD4,
0x92, 0xF4, 0x85, 0x3F, 0x34, 0xA1, 0x15, 0x67,
0x87, 0x21, 0x6E, 0x1F, 0xC9, 0xD8, 0x35, 0x32,
0xB8, 0x3D, 0xCB, 0x58, 0xCA, 0x29, 0x43, 0x54,
0x4A, 0x7E, 0x8B, 0x55, 0x7B, 0x23, 0x7A, 0x3A,
0xB6, 0x9D, 0x43, 0x07, 0x04, 0x6B, 0x9A, 0x6B,
0xF4, 0xF0, 0x20, 0xFF, 0xFA, 0xA6, 0xDF, 0xA2,
0x9E, 0x49, 0xE8, 0x55, 0xC5, 0x75, 0x88, 0x44,
0xAC, 0xA4, 0x41, 0x3A, 0x03, 0x7C, 0xBB, 0xE9,
0x93, 0xE4, 0x6C, 0xF1, 0xED, 0x79, 0x26, 0xC7,
0x8B, 0x32, 0xF7, 0x59, 0x49, 0x25, 0x31, 0x00,
0x67, 0x18, 0x0C, 0x67, 0xFB, 0x40, 0xC5, 0x5D,
0x76, 0x3D, 0x09, 0x87, 0xC2, 0x2D, 0x8C, 0x5F,
0x2B, 0x5A, 0x1E, 0x01, 0x0F, 0x33, 0xAF, 0x65,
0x08, 0x90, 0x4F, 0xFC, 0x64, 0x5B, 0x9C, 0xA3,
0x5C, 0xD6, 0x53, 0x1B, 0x51, 0x01, 0x9F, 0x98,
0xCF, 0xC4, 0x53, 0xC5, 0xB1, 0xDF, 0xB3, 0x68,
0x6F, 0x45, 0x4B, 0xC8, 0x45, 0x85, 0xC8, 0x1D,
0xB8, 0x9E, 0xD1, 0x77, 0x71, 0xA0, 0xD5, 0xA2,
0x77, 0x87, 0xEC, 0x67, 0x2E, 0xB9, 0x87, 0x06,
0x46, 0xDD, 0x41, 0x43, 0x40, 0x6A, 0x5F, 0x2F
};
const size_t efiGuidSize = 16;
const size_t efiSignatureListHeaderSize = efiGuidSize + sizeof (uint32) * 3;
const size_t efiSignatureOwnerSize = efiGuidSize;
bool bContainsMicrosoftUefiCa2023 = false;
bool bContainsMicrosoftOptionRomUefiCa2023 = false;
size_t offset = 0;
while (offset < db.size ())
{
if (db.size () - offset < efiSignatureListHeaderSize)
return false;
const uint8* signatureList = &db[offset];
uint32 signatureListSize = ReadUint32LittleEndian (signatureList + efiGuidSize);
uint32 signatureHeaderSize = ReadUint32LittleEndian (signatureList + efiGuidSize + sizeof (uint32));
uint32 signatureSize = ReadUint32LittleEndian (signatureList + efiGuidSize + sizeof (uint32) * 2);
if ((signatureListSize < efiSignatureListHeaderSize)
|| (signatureListSize > db.size () - offset)
|| (signatureHeaderSize > signatureListSize - efiSignatureListHeaderSize))
return false;
size_t signaturesOffset = offset + efiSignatureListHeaderSize + signatureHeaderSize;
size_t signaturesSize = signatureListSize - efiSignatureListHeaderSize - signatureHeaderSize;
if (BufferEquals (signatureList, efiCertX509Guid, efiGuidSize))
{
if (signatureSize < efiSignatureOwnerSize)
return false;
if ((signaturesSize % signatureSize) != 0)
return false;
for (size_t signatureOffset = signaturesOffset; signatureOffset < offset + signatureListSize; signatureOffset += signatureSize)
{
const uint8* certificate = &db[signatureOffset + efiSignatureOwnerSize];
size_t certificateSize = signatureSize - efiSignatureOwnerSize;
if (!bContainsMicrosoftUefiCa2023
&& BufferHasPattern (certificate, certificateSize, microsoftUefiCa2023Rsa2048Modulus, sizeof (microsoftUefiCa2023Rsa2048Modulus)))
{
bContainsMicrosoftUefiCa2023 = true;
}
else if (!bContainsMicrosoftOptionRomUefiCa2023
&& BufferHasPattern (certificate, certificateSize, microsoftOptionRomUefiCa2023Rsa2048Modulus, sizeof (microsoftOptionRomUefiCa2023Rsa2048Modulus)))
{
bContainsMicrosoftOptionRomUefiCa2023 = true;
}
if (bContainsMicrosoftUefiCa2023 && bContainsMicrosoftOptionRomUefiCa2023)
return true;
}
}
else if (BufferEquals (signatureList, efiCertRsa2048Guid, efiGuidSize))
{
if (signatureHeaderSize != 0
|| signatureSize != efiSignatureOwnerSize + efiRsa2048KeySize
|| (signaturesSize % signatureSize) != 0)
{
return false;
}
for (size_t signatureOffset = signaturesOffset; signatureOffset < offset + signatureListSize; signatureOffset += signatureSize)
{
const uint8* publicKey = &db[signatureOffset + efiSignatureOwnerSize];
if (!bContainsMicrosoftUefiCa2023
&& BufferEquals (publicKey, efiRsa2048KeySize, microsoftUefiCa2023Rsa2048Modulus, sizeof (microsoftUefiCa2023Rsa2048Modulus)))
{
bContainsMicrosoftUefiCa2023 = true;
}
else if (!bContainsMicrosoftOptionRomUefiCa2023
&& BufferEquals (publicKey, efiRsa2048KeySize, microsoftOptionRomUefiCa2023Rsa2048Modulus, sizeof (microsoftOptionRomUefiCa2023Rsa2048Modulus)))
{
bContainsMicrosoftOptionRomUefiCa2023 = true;
}
if (bContainsMicrosoftUefiCa2023 && bContainsMicrosoftOptionRomUefiCa2023)
return true;
}
}
offset += signatureListSize;
}
return false;
}
#ifdef VC_EFI_BOOTLOADER_SELECTION_TEST
bool TestFirmwareDbBufferContainsMicrosoft2023UefiCAs (const uint8* db, size_t dbSize)
{
std::vector<uint8> firmwareDb;
if (dbSize != 0)
{
if (!db)
return false;
firmwareDb.assign (db, db + dbSize);
}
return FirmwareDbBufferContainsMicrosoft2023UefiCAs (firmwareDb);
}
#endif
static bool TryFirmwareDbContainsMicrosoft2023UefiCAs (bool& bContainsMicrosoft2023UefiCAs)
{
std::vector<uint8> db;
DWORD dwError = ERROR_SUCCESS;
if (!ReadFirmwareEnvironmentVariableBuffer (L"db", EfiImageSecurityDatabaseGuid, db, &dwError))
{
SetLastError (dwError);
return false;
}
bContainsMicrosoft2023UefiCAs = FirmwareDbBufferContainsMicrosoft2023UefiCAs (db);
return true;
}
static bool IsFirmwareDbUnavailableError (DWORD dwError)
{
return (dwError == ERROR_ENVVAR_NOT_FOUND) || (dwError == ERROR_INVALID_FUNCTION);
}
static bool TryFirmwareSecureBootEnabled (bool& bSecureBootEnabled, DWORD* pLastError = NULL)
{
std::vector<uint8> secureBoot;
DWORD dwError = ERROR_SUCCESS;
if (!ReadFirmwareEnvironmentVariableBuffer (L"SecureBoot", EfiVarGuid, secureBoot, &dwError))
{
if (pLastError)
*pLastError = dwError;
SetLastError (dwError);
return false;
}
bSecureBootEnabled = (secureBoot.size () >= 1) && (secureBoot[0] == 1);
return true;
}
static EfiBootLoaderResourceSelection GetPreferredEfiBootLoaderResourceSet ()
{
// The current 2023 DCS set uses both Microsoft UEFI CA 2023 and Microsoft Option ROM UEFI CA 2023:
// DcsInt.dcs and LegacySpeaker.dcs are signed through the Option ROM UEFI CA 2023 chain.
// If db cannot be read, keep the pre-2023 universal behavior and use the 2011 compatibility fallback.
bool bContainsMicrosoft2023UefiCAs = false;
if (TryFirmwareDbContainsMicrosoft2023UefiCAs (bContainsMicrosoft2023UefiCAs))
{
if (bContainsMicrosoft2023UefiCAs)
return MakeEfiBootLoaderResourceSelection (EfiBootLoaderResources2023, 2023, L"firmware db contains Microsoft UEFI CA 2023 and Microsoft Option ROM UEFI CA 2023", ERROR_SUCCESS);
return MakeEfiBootLoaderResourceSelection (EfiBootLoaderResources2011, 2011, L"firmware db does not contain both Microsoft 2023 UEFI CAs", ERROR_SUCCESS);
}
DWORD dwError = GetLastError ();
if (IsFirmwareDbUnavailableError (dwError))
return MakeEfiBootLoaderResourceSelection (EfiBootLoaderResources2011, 2011, L"firmware db is unavailable; using 2011 compatibility fallback", dwError);
bool bSecureBootEnabled = false;
if (TryFirmwareSecureBootEnabled (bSecureBootEnabled) && !bSecureBootEnabled)
return MakeEfiBootLoaderResourceSelection (EfiBootLoaderResources2011, 2011, L"Secure Boot is disabled and firmware db could not be read; using 2011 compatibility fallback", dwError);
#ifndef SETUP
if (!IsAdmin () && IsUacSupported ())
{
// This may prompt for elevation from non-admin Mount/Format paths. EFI rescue
// media and bootloader repair need accurate firmware db detection to avoid
// selecting a Microsoft CA set unsupported by the current Secure Boot db.
BOOL bElevatedContainsMicrosoft2023UefiCAs = FALSE;
Elevator::GetEfiBootLoaderSigningSupport (&bElevatedContainsMicrosoft2023UefiCAs);
if (bElevatedContainsMicrosoft2023UefiCAs)
return MakeEfiBootLoaderResourceSelection (EfiBootLoaderResources2023, 2023, L"elevated helper reported Microsoft 2023 UEFI CA support", dwError);
return MakeEfiBootLoaderResourceSelection (EfiBootLoaderResources2011, 2011, L"elevated helper did not report Microsoft 2023 UEFI CA support", dwError);
}
#endif
return MakeEfiBootLoaderResourceSelection (EfiBootLoaderResources2011, 2011, L"firmware db could not be read; using 2011 compatibility fallback", dwError);
}
static void ThrowMissingEfiResource (const wchar_t* resourceName, bool rescueDisk)
{
if (rescueDisk)
throw ParameterIncorrect (SRC_POS);
throw ErrorException (wstring (L"Out of resource ") + resourceName, SRC_POS);
}
static uint8* MapEfiBootLoaderResource (int resourceId, const wchar_t* resourceName, DWORD& size, bool rescueDisk)
{
uint8 *resource = MapResource (L"BIN", resourceId, &size);
if (!resource)
ThrowMissingEfiResource (resourceName, rescueDisk);
return resource;
}
static EfiBootLoaderImages MapEfiBootLoaderImages (bool rescueDisk)
{
EfiBootLoaderResourceSelection selection = GetPreferredEfiBootLoaderResourceSet ();
const EfiBootLoaderResourceSet& resources = *selection.Resources;
EfiBootLoaderImages images = {0};
images.DcsBoot = MapEfiBootLoaderResource (resources.DcsBoot, L"DcsBoot", images.SizeDcsBoot, rescueDisk);
images.DcsInt = MapEfiBootLoaderResource (resources.DcsInt, L"DcsInt", images.SizeDcsInt, rescueDisk);
images.DcsCfg = MapEfiBootLoaderResource (resources.DcsCfg, L"DcsCfg", images.SizeDcsCfg, rescueDisk);
images.LegacySpeaker = MapEfiBootLoaderResource (resources.LegacySpeaker, L"LegacySpeaker", images.SizeLegacySpeaker, rescueDisk);
images.DcsRescue = MapEfiBootLoaderResource (resources.DcsRescue, L"DcsRe", images.SizeDcsRescue, rescueDisk);
images.DcsInfo = MapEfiBootLoaderResource (resources.DcsInfo, L"DcsInfo", images.SizeDcsInfo, rescueDisk);
images.ResourceSet = selection.ResourceSet;
images.SelectionReason = selection.Reason;
images.FirmwareDbError = selection.FirmwareDbError;
return images;
}
static void BackupEfiBootLoaderImageIfDifferent (EfiBoot& efiBoot, const wchar_t* imageName, const wchar_t* backupName, uint8* replacementData, DWORD replacementSize)
{
std::vector<uint8> currentImage;
if (!efiBoot.ReadFileToBuffer (imageName, currentImage))
return;
if ((currentImage.size () != replacementSize)
|| ((replacementSize != 0) && (memcmp (currentImage.data (), replacementData, replacementSize) != 0)))
{
// Preserve the first divergent image as the rollback snapshot; later CA refreshes must not overwrite it.
if (!efiBoot.FileExists (backupName))
efiBoot.SaveFile (backupName, currentImage.data (), (DWORD) currentImage.size ());
}
}
static void BackupEfiBootLoaderImagesIfDifferent (EfiBoot& efiBoot, const EfiBootLoaderImages& images)
{
BackupEfiBootLoaderImageIfDifferent (efiBoot, L"\\EFI\\VeraCrypt\\DcsBoot.efi", L"\\EFI\\VeraCrypt\\DcsBoot.efi.vc_backup", images.DcsBoot, images.SizeDcsBoot);
BackupEfiBootLoaderImageIfDifferent (efiBoot, L"\\EFI\\VeraCrypt\\DcsInt.dcs", L"\\EFI\\VeraCrypt\\DcsInt.dcs.vc_backup", images.DcsInt, images.SizeDcsInt);
BackupEfiBootLoaderImageIfDifferent (efiBoot, L"\\EFI\\VeraCrypt\\DcsCfg.dcs", L"\\EFI\\VeraCrypt\\DcsCfg.dcs.vc_backup", images.DcsCfg, images.SizeDcsCfg);
BackupEfiBootLoaderImageIfDifferent (efiBoot, L"\\EFI\\VeraCrypt\\LegacySpeaker.dcs", L"\\EFI\\VeraCrypt\\LegacySpeaker.dcs.vc_backup", images.LegacySpeaker, images.SizeLegacySpeaker);
BackupEfiBootLoaderImageIfDifferent (efiBoot, L"\\EFI\\VeraCrypt\\DcsInfo.dcs", L"\\EFI\\VeraCrypt\\DcsInfo.dcs.vc_backup", images.DcsInfo, images.SizeDcsInfo);
}
static void SaveEfiBootLoaderImages (EfiBoot& efiBoot, const EfiBootLoaderImages& images, bool backupExistingImages = false)
{
if (backupExistingImages)
BackupEfiBootLoaderImagesIfDifferent (efiBoot, images);
efiBoot.SaveFile (L"\\EFI\\VeraCrypt\\DcsBoot.efi", images.DcsBoot, images.SizeDcsBoot);
efiBoot.SaveFile (L"\\EFI\\VeraCrypt\\DcsInt.dcs", images.DcsInt, images.SizeDcsInt);
efiBoot.SaveFile (L"\\EFI\\VeraCrypt\\DcsCfg.dcs", images.DcsCfg, images.SizeDcsCfg);
efiBoot.SaveFile (L"\\EFI\\VeraCrypt\\LegacySpeaker.dcs", images.LegacySpeaker, images.SizeLegacySpeaker);
efiBoot.SaveFile (L"\\EFI\\VeraCrypt\\DcsInfo.dcs", images.DcsInfo, images.SizeDcsInfo);
RecordEfiBootLoaderResourceSetSelection (images);
}
void
GetVolumeESP(wstring& path, wstring& bootVolumePath)
@@ -3442,32 +3979,16 @@ namespace VeraCrypt
Warning ("ADMIN_PRIVILEGES_WARN_DEVICES", ParentWindow);
}
}
DWORD sizeDcsBoot;
uint8 *dcsBootImg = MapResource(L"BIN", IDR_EFI_DCSBOOT, &sizeDcsBoot);
if (!dcsBootImg)
throw ErrorException(L"Out of resource DcsBoot", SRC_POS);
DWORD sizeDcsInt;
uint8 *dcsIntImg = MapResource(L"BIN", IDR_EFI_DCSINT, &sizeDcsInt);
if (!dcsIntImg)
throw ErrorException(L"Out of resource DcsInt", SRC_POS);
DWORD sizeDcsCfg;
uint8 *dcsCfgImg = MapResource(L"BIN", IDR_EFI_DCSCFG, &sizeDcsCfg);
if (!dcsCfgImg)
throw ErrorException(L"Out of resource DcsCfg", SRC_POS);
DWORD sizeLegacySpeaker;
uint8 *LegacySpeakerImg = MapResource(L"BIN", IDR_EFI_LEGACYSPEAKER, &sizeLegacySpeaker);
if (!LegacySpeakerImg)
throw ErrorException(L"Out of resource LegacySpeaker", SRC_POS);
EfiBootLoaderImages efiImages = MapEfiBootLoaderImages (false);
// Kept as aliases for the legacy EFI\Boot\bootx64.efi replacement block below.
DWORD sizeDcsBoot = efiImages.SizeDcsBoot;
uint8 *dcsBootImg = efiImages.DcsBoot;
#ifdef VC_EFI_CUSTOM_MODE
DWORD sizeBootMenuLocker;
uint8 *BootMenuLockerImg = MapResource(L"BIN", IDR_EFI_DCSBML, &sizeBootMenuLocker);
if (!BootMenuLockerImg)
throw ErrorException(L"Out of resource DcsBml", SRC_POS);
#endif
DWORD sizeDcsInfo;
uint8 *DcsInfoImg = MapResource(L"BIN", IDR_EFI_DCSINFO, &sizeDcsInfo);
if (!DcsInfoImg)
throw ErrorException(L"Out of resource DcsInfo", SRC_POS);
EfiBootInst.PrepareBootPartition(PostOOBEMode);
@@ -3477,14 +3998,16 @@ namespace VeraCrypt
bool bAlreadyExist;
const char* g_szMsBootString = "bootmgfw.pdb";
unsigned __int64 loaderSize = 0;
const wchar_t * szStdMsBootloader = L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi";
const wchar_t * szBackupMsBootloader = L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc";
const wchar_t * szStdEfiBootloader = L"\\EFI\\Boot\\bootx64.efi";
const wchar_t * szBackupEfiBootloader = L"\\EFI\\Boot\\original_bootx64.vc_backup";
if (preserveUserConfig)
{
bool bModifiedMsBoot = true, bMissingMsBoot = false;;
if (EfiBootInst.FileExists (L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi"))
EfiBootInst.GetFileSize(L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", loaderSize);
bool bModifiedMsBoot = true, bMissingMsBoot = false, bMsBootloaderMovedToBackup = false;
if (EfiBootInst.FileExists (szStdMsBootloader))
EfiBootInst.GetFileSize(szStdMsBootloader, loaderSize);
else
bMissingMsBoot = true;
@@ -3492,20 +4015,21 @@ namespace VeraCrypt
if (PostOOBEMode)
EfiBootInst.SetStartExec(L"VeraCrypt BootLoader (DcsBoot)", L"\\EFI\\VeraCrypt\\DcsBoot.efi", SetBootEntry, ForceFirstBootEntry, SetBootNext);
if (EfiBootInst.FileExists (L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc"))
if (EfiBootInst.FileExists (szBackupMsBootloader))
{
if (loaderSize > 32768)
{
std::vector<uint8> bootLoaderBuf ((size_t) loaderSize);
EfiBootInst.ReadFile(L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", &bootLoaderBuf[0], (DWORD) loaderSize);
EfiBootInst.ReadFile(szStdMsBootloader, &bootLoaderBuf[0], (DWORD) loaderSize);
// look for bootmgfw.efi identifiant string
if (BufferHasPattern (bootLoaderBuf.data (), (size_t) loaderSize, g_szMsBootString, strlen (g_szMsBootString)))
{
bModifiedMsBoot = false;
// replace the backup with this version
EfiBootInst.RenameFile (L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc", TRUE);
if (EfiBootInst.RenameFile (szStdMsBootloader, szBackupMsBootloader, TRUE))
bMsBootloaderMovedToBackup = true;
}
}
}
@@ -3516,7 +4040,7 @@ namespace VeraCrypt
{
std::vector<uint8> bootLoaderBuf ((size_t) loaderSize);
EfiBootInst.ReadFile(L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", &bootLoaderBuf[0], (DWORD) loaderSize);
EfiBootInst.ReadFile(szStdMsBootloader, &bootLoaderBuf[0], (DWORD) loaderSize);
// look for bootmgfw.efi identifiant string
if (BufferHasPattern (bootLoaderBuf.data (), (size_t) loaderSize, g_szMsBootString, strlen (g_szMsBootString)))
@@ -3525,7 +4049,8 @@ namespace VeraCrypt
if (!bModifiedMsBoot)
{
EfiBootInst.RenameFile (L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi", L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc", TRUE);
if (EfiBootInst.RenameFile (szStdMsBootloader, szBackupMsBootloader, TRUE))
bMsBootloaderMovedToBackup = true;
}
else
{
@@ -3551,7 +4076,7 @@ namespace VeraCrypt
if (BufferHasPattern (bootLoaderBuf.data (), (size_t) loaderSize, g_szMsBootString, strlen (g_szMsBootString)))
{
bFound = true;
EfiBootInst.RenameFile(loaderPath.c_str(), L"\\EFI\\Microsoft\\Boot\\bootmgfw_ms.vc", TRUE);
EfiBootInst.RenameFile(loaderPath.c_str(), szBackupMsBootloader, TRUE);
}
}
}
@@ -3563,16 +4088,47 @@ namespace VeraCrypt
}
if (PostOOBEMode && EfiBootInst.FileExists (L"\\EFI\\VeraCrypt\\DcsBoot.efi"))
{
// check if bootmgfw.efi has been set again to Microsoft version
// if yes, replace it with our bootloader after it was copied to bootmgfw_ms.vc
if (!bModifiedMsBoot || bMissingMsBoot)
EfiBootInst.CopyFile (L"\\EFI\\VeraCrypt\\DcsBoot.efi", L"\\EFI\\Microsoft\\Boot\\bootmgfw.efi");
{
const bool bRefreshMsBootloader = !bModifiedMsBoot
|| bMissingMsBoot
|| (EfiBootInst.FileExists (szStdMsBootloader) && EfiBootInst.IsVeraCryptBootLoader (szStdMsBootloader));
// Keep the firmware-visible loader path valid before the larger module refresh.
if (bRefreshMsBootloader && !EfiBootInst.FileExists (szStdMsBootloader))
{
try
{
EfiBootInst.CopyFile (L"\\EFI\\VeraCrypt\\DcsBoot.efi", szStdMsBootloader);
}
catch (...)
{
if (bMsBootloaderMovedToBackup)
EfiBootInst.RenameFile (szBackupMsBootloader, szStdMsBootloader, TRUE);
throw;
}
}
SaveEfiBootLoaderImages (EfiBootInst, efiImages, true);
#ifdef VC_EFI_CUSTOM_MODE
EfiBootInst.SaveFile(L"\\EFI\\VeraCrypt\\DcsBml.dcs", BootMenuLockerImg, sizeBootMenuLocker);
#endif
// check if bootmgfw.efi has been set again to Microsoft version.
// If yes, replace it with our bootloader after it was copied to bootmgfw_ms.vc.
// If it is already a VeraCrypt copy, refresh it because the firmware db may now
// trust a different Microsoft CA than the one selected at original install time.
if (bRefreshMsBootloader)
{
EfiBootInst.CopyFile (L"\\EFI\\VeraCrypt\\DcsBoot.efi", szStdMsBootloader);
}
if (EfiBootInst.FileExists (szStdEfiBootloader))
{
// check if standard bootloader under EFI\Boot has been set to Microsoft version
// if yes, replace it with our bootloader
// check if standard bootloader under EFI\Boot has been set to Microsoft version.
// If yes, replace it with our bootloader. If it is already a VeraCrypt copy,
// refresh it because the firmware db may now trust a different Microsoft CA
// than the one selected at original install time.
bool bStdEfiBootloaderUpdated = false;
EfiBootInst.GetFileSize(szStdEfiBootloader, loaderSize);
if (loaderSize > 32768)
{
@@ -3585,22 +4141,23 @@ namespace VeraCrypt
{
EfiBootInst.RenameFile (szStdEfiBootloader, szBackupEfiBootloader, TRUE);
EfiBootInst.CopyFile (L"\\EFI\\VeraCrypt\\DcsBoot.efi", szStdEfiBootloader);
bStdEfiBootloaderUpdated = true;
}
}
if (!bStdEfiBootloaderUpdated && EfiBootInst.IsVeraCryptBootLoader (szStdEfiBootloader))
{
EfiBootInst.CopyFile (L"\\EFI\\VeraCrypt\\DcsBoot.efi", szStdEfiBootloader);
}
}
return;
}
}
EfiBootInst.MkDir(L"\\EFI\\VeraCrypt", bAlreadyExist);
EfiBootInst.SaveFile(L"\\EFI\\VeraCrypt\\DcsBoot.efi", dcsBootImg, sizeDcsBoot);
EfiBootInst.SaveFile(L"\\EFI\\VeraCrypt\\DcsInt.dcs", dcsIntImg, sizeDcsInt);
EfiBootInst.SaveFile(L"\\EFI\\VeraCrypt\\DcsCfg.dcs", dcsCfgImg, sizeDcsCfg);
EfiBootInst.SaveFile(L"\\EFI\\VeraCrypt\\LegacySpeaker.dcs", LegacySpeakerImg, sizeLegacySpeaker);
SaveEfiBootLoaderImages (EfiBootInst, efiImages);
#ifdef VC_EFI_CUSTOM_MODE
EfiBootInst.SaveFile(L"\\EFI\\VeraCrypt\\DcsBml.dcs", BootMenuLockerImg, sizeBootMenuLocker);
#endif
EfiBootInst.SaveFile(L"\\EFI\\VeraCrypt\\DcsInfo.dcs", DcsInfoImg, sizeDcsInfo);
if (!preserveUserConfig)
EfiBootInst.DelFile(L"\\EFI\\VeraCrypt\\PlatformInfo");
EfiBootInst.SetStartExec(L"VeraCrypt BootLoader (DcsBoot)", L"\\EFI\\VeraCrypt\\DcsBoot.efi", SetBootEntry, ForceFirstBootEntry, SetBootNext);
@@ -3812,36 +4369,13 @@ namespace VeraCrypt
if (bIsGPT)
{
// create EFI disk structure
DWORD sizeDcsBoot;
uint8 *dcsBootImg = MapResource(L"BIN", IDR_EFI_DCSBOOT, &sizeDcsBoot);
if (!dcsBootImg)
throw ParameterIncorrect (SRC_POS);
DWORD sizeDcsInt;
uint8 *dcsIntImg = MapResource(L"BIN", IDR_EFI_DCSINT, &sizeDcsInt);
if (!dcsIntImg)
throw ParameterIncorrect (SRC_POS);
DWORD sizeDcsCfg;
uint8 *dcsCfgImg = MapResource(L"BIN", IDR_EFI_DCSCFG, &sizeDcsCfg);
if (!dcsCfgImg)
throw ParameterIncorrect (SRC_POS);
DWORD sizeLegacySpeaker;
uint8 *LegacySpeakerImg = MapResource(L"BIN", IDR_EFI_LEGACYSPEAKER, &sizeLegacySpeaker);
if (!LegacySpeakerImg)
throw ParameterIncorrect (SRC_POS);
EfiBootLoaderImages efiImages = MapEfiBootLoaderImages (true);
#ifdef VC_EFI_CUSTOM_MODE
DWORD sizeBootMenuLocker;
uint8 *BootMenuLockerImg = MapResource(L"BIN", IDR_EFI_DCSBML, &sizeBootMenuLocker);
if (!BootMenuLockerImg)
throw ParameterIncorrect (SRC_POS);
#endif
DWORD sizeDcsRescue;
uint8 *DcsRescueImg = MapResource(L"BIN", IDR_EFI_DCSRE, &sizeDcsRescue);
if (!DcsRescueImg)
throw ParameterIncorrect (SRC_POS);
DWORD sizeDcsInfo;
uint8 *DcsInfoImg = MapResource(L"BIN", IDR_EFI_DCSINFO, &sizeDcsInfo);
if (!DcsInfoImg)
throw ParameterIncorrect (SRC_POS);
WCHAR szTmpPath[MAX_PATH + 1], szTmpFilePath[MAX_PATH + 1];
if (!GetTempPathW (MAX_PATH, szTmpPath))
@@ -3865,21 +4399,21 @@ namespace VeraCrypt
finally_do_arg (zip_t**, &z, { if (*finally_arg) zip_discard (*finally_arg);});
if (!ZipAdd (z, "EFI/Boot/bootx64.efi", DcsRescueImg, sizeDcsRescue))
if (!ZipAdd (z, "EFI/Boot/bootx64.efi", efiImages.DcsRescue, efiImages.SizeDcsRescue))
throw ParameterIncorrect (SRC_POS);
#ifdef VC_EFI_CUSTOM_MODE
if (!ZipAdd (z, "EFI/VeraCrypt/DcsBml.dcs", BootMenuLockerImg, sizeBootMenuLocker))
throw ParameterIncorrect (SRC_POS);
#endif
if (!ZipAdd (z, "EFI/VeraCrypt/DcsBoot.efi", dcsBootImg, sizeDcsBoot))
if (!ZipAdd (z, "EFI/VeraCrypt/DcsBoot.efi", efiImages.DcsBoot, efiImages.SizeDcsBoot))
throw ParameterIncorrect (SRC_POS);
if (!ZipAdd (z, "EFI/VeraCrypt/DcsCfg.dcs", dcsCfgImg, sizeDcsCfg))
if (!ZipAdd (z, "EFI/VeraCrypt/DcsCfg.dcs", efiImages.DcsCfg, efiImages.SizeDcsCfg))
throw ParameterIncorrect (SRC_POS);
if (!ZipAdd (z, "EFI/VeraCrypt/DcsInt.dcs", dcsIntImg, sizeDcsInt))
if (!ZipAdd (z, "EFI/VeraCrypt/DcsInt.dcs", efiImages.DcsInt, efiImages.SizeDcsInt))
throw ParameterIncorrect (SRC_POS);
if (!ZipAdd (z, "EFI/VeraCrypt/LegacySpeaker.dcs", LegacySpeakerImg, sizeLegacySpeaker))
if (!ZipAdd (z, "EFI/VeraCrypt/LegacySpeaker.dcs", efiImages.LegacySpeaker, efiImages.SizeLegacySpeaker))
throw ParameterIncorrect (SRC_POS);
if (!ZipAdd (z, "EFI/VeraCrypt/DcsInfo.dcs", DcsInfoImg, sizeDcsInfo))
if (!ZipAdd (z, "EFI/VeraCrypt/DcsInfo.dcs", efiImages.DcsInfo, efiImages.SizeDcsInfo))
throw ParameterIncorrect (SRC_POS);
Buffer volHeader(TC_BOOT_ENCRYPTION_VOLUME_HEADER_SIZE);
@@ -4509,6 +5043,12 @@ namespace VeraCrypt
EfiBootInst.PrepareBootPartition();
if (!EfiBootInst.FileExists (szStdMsBootloader))
{
Error ("WINDOWS_EFI_BOOT_LOADER_MISSING", ParentWindow);
throw UserAbort (SRC_POS);
}
EfiBootInst.GetFileSize(szStdMsBootloader, loaderSize);
bootLoaderBuf.resize ((size_t) loaderSize);
EfiBootInst.ReadFile(szStdMsBootloader, &bootLoaderBuf[0], (DWORD) loaderSize);
@@ -5252,6 +5792,25 @@ namespace VeraCrypt
}
}
#endif
void BootEncryption::GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported)
{
if (!pMicrosoft2023UefiCAsSupported)
{
SetLastError (ERROR_INVALID_PARAMETER);
throw SystemException (SRC_POS);
}
bool bContainsMicrosoft2023UefiCAs = false;
if (!TryFirmwareDbContainsMicrosoft2023UefiCAs (bContainsMicrosoft2023UefiCAs))
{
*pMicrosoft2023UefiCAsSupported = FALSE;
return;
}
*pMicrosoft2023UefiCAsSupported = bContainsMicrosoft2023UefiCAs ? TRUE : FALSE;
}
#ifndef SETUP
void BootEncryption::CheckRequirements ()
{
+5
View File
@@ -27,6 +27,10 @@ using namespace std;
namespace VeraCrypt
{
#ifdef VC_EFI_BOOTLOADER_SELECTION_TEST
bool TestFirmwareDbBufferContainsMicrosoft2023UefiCAs (const uint8* db, size_t dbSize);
#endif
class File
{
public:
@@ -317,6 +321,7 @@ namespace VeraCrypt
void RestoreSystemLoader ();
static void UpdateSetupConfigFile (bool bForInstall);
void GetSecureBootConfig (BOOL* pSecureBootEnabled, BOOL *pVeraCryptKeysLoaded);
void GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported);
bool IsUsingUnsupportedAlgorithm(LONG driverVersion);
void NotifyService (DWORD dwNotifyCmd);
protected:
+12 -6
View File
@@ -556,15 +556,21 @@ IDR_RESCUE_LOADER_AES_SHA2 BIN "..\\Boot\\Windows\\Rescue_AE
IDR_RESCUE_LOADER_SERPENT_SHA2 BIN "..\\Boot\\Windows\\Rescue_Serpent_SHA2\\BootLoader.com.gz"
IDR_RESCUE_LOADER_TWOFISH_SHA2 BIN "..\\Boot\\Windows\\Rescue_Twofish_SHA2\\BootLoader.com.gz"
IDR_RESCUE_LOADER_CAMELLIA_SHA2 BIN "..\\Boot\\Windows\\Rescue_Camellia_SHA2\\BootLoader.com.gz"
IDR_EFI_DCSBOOT BIN "..\\Boot\\EFI\\DcsBoot.efi"
IDR_EFI_DCSINT BIN "..\\Boot\\EFI\\DcsInt.efi"
IDR_EFI_DCSCFG BIN "..\\Boot\\EFI\\DcsCfg.efi"
IDR_EFI_LEGACYSPEAKER BIN "..\\Boot\\EFI\\LegacySpeaker.efi"
IDR_EFI_DCSBOOT_2011 BIN "..\\Boot\\EFI\\2011UEFICA\\DcsBoot.efi"
IDR_EFI_DCSINT_2011 BIN "..\\Boot\\EFI\\2011UEFICA\\DcsInt.efi"
IDR_EFI_DCSCFG_2011 BIN "..\\Boot\\EFI\\2011UEFICA\\DcsCfg.efi"
IDR_EFI_LEGACYSPEAKER_2011 BIN "..\\Boot\\EFI\\2011UEFICA\\LegacySpeaker.efi"
#ifdef VC_EFI_CUSTOM_MODE
IDR_EFI_DCSBML BIN "..\\Boot\\EFI\\DcsBml.efi"
#endif
IDR_EFI_DCSRE BIN "..\\Boot\\EFI\\DcsRe.efi"
IDR_EFI_DCSINFO BIN "..\\Boot\\EFI\\DcsInfo.efi"
IDR_EFI_DCSRE_2011 BIN "..\\Boot\\EFI\\2011UEFICA\\DcsRe.efi"
IDR_EFI_DCSINFO_2011 BIN "..\\Boot\\EFI\\2011UEFICA\\DcsInfo.efi"
IDR_EFI_DCSBOOT_2023 BIN "..\\Boot\\EFI\\2023UEFICA\\DcsBoot.efi"
IDR_EFI_DCSINT_2023 BIN "..\\Boot\\EFI\\2023UEFICA\\DcsInt.efi"
IDR_EFI_DCSCFG_2023 BIN "..\\Boot\\EFI\\2023UEFICA\\DcsCfg.efi"
IDR_EFI_LEGACYSPEAKER_2023 BIN "..\\Boot\\EFI\\2023UEFICA\\LegacySpeaker.efi"
IDR_EFI_DCSRE_2023 BIN "..\\Boot\\EFI\\2023UEFICA\\DcsRe.efi"
IDR_EFI_DCSINFO_2023 BIN "..\\Boot\\EFI\\2023UEFICA\\DcsInfo.efi"
#endif
/////////////////////////////////////////////////////////////////////////////
//
+2 -2
View File
@@ -801,7 +801,8 @@ int EAGetLargestKeyForMode (int mode)
return key;
}
// Returns the maximum number of bytes necessary to be generated by the PBKDF2 (PKCS #5)
// Returns the maximum number of bytes necessary to be generated by PBKDF2 (PKCS #5).
// Argon2id header key material uses the fixed ARGON2_HEADER_KEYDATA_SIZE value.
int GetMaxPkcs5OutSize (void)
{
int size = 32;
@@ -1488,4 +1489,3 @@ void VcUnprotectKeys (PCRYPTO_INFO pCryptoInfo, uint64 encID)
#endif
#endif
+6
View File
@@ -44,6 +44,12 @@ extern "C" {
// Size of the volume header area containing concatenated master key(s) and secondary key(s) (XTS mode)
#define MASTER_KEYDATA_SIZE 256
#ifndef VC_DCS_DISABLE_ARGON2
// VeraCrypt Argon2id header key material size, in bytes, for the current volume format.
// This is intentionally fixed for compatibility and must not depend on GetMaxPkcs5OutSize().
#define ARGON2_HEADER_KEYDATA_SIZE 192
#endif
// The first PRF to try when mounting
#define FIRST_PRF_ID 1
+1 -1
View File
@@ -6570,7 +6570,7 @@ static BOOL PerformBenchmark(HWND hBenchDlg, HWND hwndDlg)
case ARGON2:
/* test with ARGON2 used as the PRF */
if (derive_key_argon2 ((const unsigned char*) "passphrase-1234567890", 21, (const unsigned char*)tmp_salt, 64, iterations, memoryCost, dk, MASTER_KEYDATA_SIZE, NULL) != 0)
if (derive_key_argon2 ((const unsigned char*) "passphrase-1234567890", 21, (const unsigned char*)tmp_salt, 64, iterations, memoryCost, dk, ARGON2_HEADER_KEYDATA_SIZE, NULL) != 0)
goto key_derivation_error;
break;
}
+1 -1
View File
@@ -277,7 +277,7 @@ static TC_THREAD_PROC EncryptionThreadProc (void *threadArg)
case ARGON2:
derivationResult = derive_key_argon2(workItem->KeyDerivation.Password, workItem->KeyDerivation.PasswordLength, workItem->KeyDerivation.Salt, PKCS5_SALT_SIZE,
workItem->KeyDerivation.IterationCount, workItem->KeyDerivation.Memorycost, workItem->KeyDerivation.DerivedKey, GetMaxPkcs5OutSize(), workItem->KeyDerivation.pAbortKeyDerivation);
workItem->KeyDerivation.IterationCount, workItem->KeyDerivation.Memorycost, workItem->KeyDerivation.DerivedKey, ARGON2_HEADER_KEYDATA_SIZE, workItem->KeyDerivation.pAbortKeyDerivation);
break;
default:
+2 -2
View File
@@ -199,7 +199,7 @@ BOOL WriteLocalMachineRegistryMultiString (wchar_t *subKey, wchar_t *name, wchar
return TRUE;
}
BOOL WriteLocalMachineRegistryString (wchar_t *subKey, wchar_t *name, wchar_t *str, BOOL expandable)
BOOL WriteLocalMachineRegistryString (const wchar_t *subKey, const wchar_t *name, const wchar_t *str, BOOL expandable)
{
HKEY hkey = 0;
DWORD disp;
@@ -297,4 +297,4 @@ void GetRestorePointRegKeyName (wchar_t *regk, size_t cbRegk)
// The string is split in order to prevent some antivirus packages from falsely reporting
// VeraCrypt.exe to contain a possible Trojan horse because of this string (heuristic scan).
StringCbPrintfW (regk, cbRegk,L"%s%s%s%s", L"Software\\Microsoft\\Windows", L" NT\\Curren", L"tVersion\\Sy", L"stemRestore");
}
}
+1 -1
View File
@@ -24,7 +24,7 @@ DWORD ReadRegistryBytes (wchar_t *path, wchar_t *name, char *value, int maxLen);
void WriteRegistryInt (wchar_t *subKey, wchar_t *name, int value);
BOOL WriteLocalMachineRegistryDword (wchar_t *subKey, wchar_t *name, DWORD value);
BOOL WriteLocalMachineRegistryMultiString (wchar_t *subKey, wchar_t *name, wchar_t *multiString, DWORD size);
BOOL WriteLocalMachineRegistryString (wchar_t *subKey, wchar_t *name, wchar_t *str, BOOL expandable);
BOOL WriteLocalMachineRegistryString (const wchar_t *subKey, const wchar_t *name, const wchar_t *str, BOOL expandable);
void WriteRegistryString (wchar_t *subKey, wchar_t *name, wchar_t *str);
BOOL WriteRegistryBytes (wchar_t *path, wchar_t *name, char *str, DWORD size);
BOOL DeleteLocalMachineRegistryKey (wchar_t *parentKey, wchar_t *subKeyToDelete);
+13 -7
View File
@@ -67,13 +67,19 @@
#define IDR_BOOT_LOADER_CAMELLIA_SHA2 563
#define IDR_RESCUE_BOOT_SECTOR_CAMELLIA_SHA2 564
#define IDR_RESCUE_LOADER_CAMELLIA_SHA2 565
#define IDR_EFI_DCSBOOT 566
#define IDR_EFI_DCSINT 567
#define IDR_EFI_DCSCFG 568
#define IDR_EFI_LEGACYSPEAKER 569
#define IDR_EFI_DCSBOOT_2011 566
#define IDR_EFI_DCSINT_2011 567
#define IDR_EFI_DCSCFG_2011 568
#define IDR_EFI_LEGACYSPEAKER_2011 569
#define IDR_EFI_DCSBML 570
#define IDR_EFI_DCSRE 571
#define IDR_EFI_DCSINFO 578
#define IDR_EFI_DCSRE_2011 571
#define IDR_EFI_DCSINFO_2011 578
#define IDR_EFI_DCSBOOT_2023 579
#define IDR_EFI_DCSINT_2023 580
#define IDR_EFI_DCSCFG_2023 581
#define IDR_EFI_LEGACYSPEAKER_2023 582
#define IDR_EFI_DCSRE_2023 583
#define IDR_EFI_DCSINFO_2023 584
#define IDC_HW_AES_LABEL_LINK 5000
#define IDC_HW_AES 5001
#define IDC_PARALLELIZATION_LABEL_LINK 5002
@@ -227,7 +233,7 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NO_MFC 1
#define _APS_NEXT_RESOURCE_VALUE 578
#define _APS_NEXT_RESOURCE_VALUE 585
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 5147
#define _APS_NEXT_SYMED_VALUE 101
+5 -1
View File
@@ -7,12 +7,16 @@ namespace VeraCrypt
SCardManager::SCardManager()
{
#ifndef TC_OPENBSD
loader->Initialize();
#endif
}
SCardManager::~SCardManager()
{
#ifndef TC_OPENBSD
loader->Finalize();
#endif
}
vector<wstring> SCardManager::GetReaders()
@@ -106,4 +110,4 @@ namespace VeraCrypt
throw InvalidEMVPath();
}
}
}
+1 -1
View File
@@ -220,7 +220,7 @@ namespace VeraCrypt
throw;
}
for(const CK_OBJECT_HANDLE & dataHandle: GetObjects(slotId, CKO_DATA))
foreach(const CK_OBJECT_HANDLE & dataHandle, GetObjects(slotId, CKO_DATA))
{
SecurityTokenKeyfile keyfile;
keyfile.Handle = dataHandle;
+17 -2
View File
@@ -448,7 +448,7 @@ KeyReady: ;
case ARGON2:
{
int derivationResult = derive_key_argon2(keyInfo->userKey, keyInfo->keyLength, keyInfo->salt,
PKCS5_SALT_SIZE, keyInfo->noIterations, keyInfo->memoryCost, dk, GetMaxPkcs5OutSize(), &abortKeyDerivation);
PKCS5_SALT_SIZE, keyInfo->noIterations, keyInfo->memoryCost, dk, ARGON2_HEADER_KEYDATA_SIZE, &abortKeyDerivation);
if (derivationResult != 0)
{
if (selected_pkcs5_prf == 0)
@@ -492,6 +492,12 @@ KeyReady: ;
if (!EAIsModeSupported (cryptoInfo->ea, cryptoInfo->mode))
continue; // This encryption algorithm has never been available with this mode of operation
#ifndef VC_DCS_DISABLE_ARGON2
/* Only XTS mode reaches this point; both XTS keys must fit in the fixed Argon2id output. */
if (pkcs5_prf == ARGON2 && EAGetKeySize (cryptoInfo->ea) * 2 > ARGON2_HEADER_KEYDATA_SIZE)
continue;
#endif
blockSize = CipherGetBlockSize (EAGetFirstCipher (cryptoInfo->ea));
status = EAInit (cryptoInfo->ea, dk + primaryKeyOffset, cryptoInfo->ks);
@@ -1074,6 +1080,15 @@ int CreateVolumeHeaderInMemory (HWND hwndDlg, BOOL bBoot, unsigned char *header,
// User selected encryption algorithm
cryptoInfo->ea = ea;
#ifndef VC_DCS_DISABLE_ARGON2
if (pkcs5_prf == ARGON2 && EAGetKeySize (ea) * 2 > ARGON2_HEADER_KEYDATA_SIZE)
{
crypto_close (cryptoInfo);
retVal = ERR_PARAMETER_INCORRECT;
goto err;
}
#endif
// User selected PRF
cryptoInfo->pkcs5 = pkcs5_prf;
cryptoInfo->noIterations = keyInfo.noIterations;
@@ -1130,7 +1145,7 @@ int CreateVolumeHeaderInMemory (HWND hwndDlg, BOOL bBoot, unsigned char *header,
case ARGON2:
{
int derivationResult = derive_key_argon2(keyInfo.userKey, keyInfo.keyLength, keyInfo.salt,
PKCS5_SALT_SIZE, keyInfo.noIterations, keyInfo.memoryCost, dk, GetMaxPkcs5OutSize(), NULL);
PKCS5_SALT_SIZE, keyInfo.noIterations, keyInfo.memoryCost, dk, ARGON2_HEADER_KEYDATA_SIZE, NULL);
if (derivationResult != 0)
{
crypto_close (cryptoInfo);
+2 -2
View File
@@ -53,7 +53,7 @@ namespace VeraCrypt
RandomNumberGenerator::SetHash (newPkcs5Kdf->GetHash());
SecureBuffer newSalt (openVolume->GetSaltSize());
SecureBuffer newHeaderKey (VolumeHeader::GetLargestSerializedKeySize());
SecureBuffer newHeaderKey (VolumeHeader::GetHeaderKeyDerivationSize (newPkcs5Kdf));
shared_ptr <VolumePassword> password (Keyfile::ApplyListToPassword (newKeyfiles, newPassword, emvSupportEnabled));
@@ -286,7 +286,7 @@ namespace VeraCrypt
RandomNumberGenerator::SetHash (pkcs5Kdf->GetHash());
SecureBuffer newSalt (header->GetSaltSize());
SecureBuffer newHeaderKey (VolumeHeader::GetLargestSerializedKeySize());
SecureBuffer newHeaderKey (VolumeHeader::GetHeaderKeyDerivationSize (pkcs5Kdf));
shared_ptr <VolumePassword> passwordKey (Keyfile::ApplyListToPassword (keyfiles, password, emvSupportEnabled));
+39 -4
View File
@@ -21,6 +21,9 @@
#ifdef TC_LINUX
#include <sys/utsname.h>
#endif
#ifdef TC_OPENBSD
#include <pwd.h>
#endif
#include <stdio.h>
#include <unistd.h>
#include "Platform/FileStream.h"
@@ -40,6 +43,26 @@ namespace VeraCrypt
static bool SamePath (const string& path1, const string& path2);
#endif
#ifdef TC_OPENBSD
static bool GetDoasUserIds (uid_t *uid, gid_t *gid)
{
const char *env = getenv ("DOAS_USER");
if (!env || !env[0])
return false;
struct passwd *pw = getpwnam (env);
if (!pw)
return false;
if (uid)
*uid = pw->pw_uid;
if (gid)
*gid = pw->pw_gid;
return true;
}
#endif
// Struct to hold terminal emulator information
struct TerminalInfo {
const char* name;
@@ -634,6 +657,12 @@ namespace VeraCrypt
catch (...) { }
}
#ifdef TC_OPENBSD
gid_t doasGid;
if (GetDoasUserIds (nullptr, &doasGid))
return doasGid;
#endif
return getgid();
}
@@ -650,6 +679,12 @@ namespace VeraCrypt
catch (...) { }
}
#ifdef TC_OPENBSD
uid_t doasUid;
if (GetDoasUserIds (&doasUid, nullptr))
return doasUid;
#endif
return getuid();
}
@@ -1405,8 +1440,8 @@ namespace VeraCrypt
while (getline(ss, token, ':'))
{
// remove any trailing slashes from the token
while (!token.empty() && token.back() == '/')
token.pop_back();
while (!token.empty() && token[token.length() - 1] == '/')
token.erase(token.length() - 1);
if (token.empty())
continue;
@@ -1424,8 +1459,8 @@ namespace VeraCrypt
free(resolvedEntry);
// remove any trailing slashes from the token
while (!entryPath.empty() && entryPath.back() == '/')
entryPath.pop_back();
while (!entryPath.empty() && entryPath[entryPath.length() - 1] == '/')
entryPath.erase(entryPath.length() - 1);
// perform check again if the resolved path is different from the original (symlink)
if (dirPath == entryPath || dirPath.find(entryPath + "/") == 0)
+21 -2
View File
@@ -253,7 +253,17 @@ namespace VeraCrypt
(options->Path.IsDevice() || options->Type == VolumeType::Hidden) ? File::OpenReadWrite : File::CreateReadWrite,
File::ShareNone);
HostSize = VolumeFile->Length();
if (!options->Path.IsDevice() && options->Type == VolumeType::Normal)
{
HostSize = options->Size;
if (options->Quick)
VolumeFile->SetLength (options->Size);
}
else
{
HostSize = VolumeFile->Length();
}
}
try
@@ -272,6 +282,9 @@ namespace VeraCrypt
{
throw UnsupportedSectorSize (SRC_POS);
}
if (HostSize % options->SectorSize != 0)
throw ParameterIncorrect (SRC_POS);
}
else
options->SectorSize = TC_SECTOR_SIZE_FILE_HOSTED_VOLUME;
@@ -315,6 +328,12 @@ namespace VeraCrypt
if (headerOptions.VolumeDataSize < 1)
throw ParameterIncorrect (SRC_POS);
#ifndef VC_DCS_DISABLE_ARGON2
// New volumes are created in XTS mode; Argon2id header key material has a fixed format size.
if (options->VolumeHeaderKdf->IsArgon2() && options->EA->GetKeySize() * 2 > ARGON2_HEADER_KEYDATA_SIZE)
throw ParameterIncorrect (SRC_POS);
#endif
// Master data key
MasterKey.Allocate (options->EA->GetKeySize() * 2);
RandomNumberGenerator::GetData (MasterKey);
@@ -331,7 +350,7 @@ namespace VeraCrypt
headerOptions.Salt = salt;
// Header key
HeaderKey.Allocate (VolumeHeader::GetLargestSerializedKeySize());
HeaderKey.Allocate (VolumeHeader::GetHeaderKeyDerivationSize (options->VolumeHeaderKdf));
PasswordKey = Keyfile::ApplyListToPassword (options->Keyfiles, options->Password, options->EMVSupportEnabled);
int derivationResult = options->VolumeHeaderKdf->DeriveKey (HeaderKey, *PasswordKey, options->Pim, salt);
if (derivationResult != 0)
+2
View File
@@ -26,6 +26,8 @@
#if defined(__AVX2__)
#include <immintrin.h>
#include "blake2/blake2b.h"
#include "blake2/blamka-round-opt.h"
+2 -2
View File
@@ -27,8 +27,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,28,0
PRODUCTVERSION 1,26,28,0
FILEVERSION 1,26,28,1
PRODUCTVERSION 1,26,28,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
+9 -9
View File
@@ -111,8 +111,8 @@
<Inf>
<ProviderName>
</ProviderName>
<TimeStamp>1.26.28.0</TimeStamp>
<DateStamp>04/30/2026</DateStamp>
<TimeStamp>1.26.28.1</TimeStamp>
<DateStamp>05/22/2026</DateStamp>
</Inf>
<Link>
<AdditionalDependencies>fltmgr.lib;%(AdditionalDependencies);$(KernelBufferOverflowLib);$(DDK_LIB_PATH)ntoskrnl.lib;$(DDK_LIB_PATH)hal.lib;$(DDK_LIB_PATH)wmilib.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfLdr.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfDriverEntry.lib</AdditionalDependencies>
@@ -139,8 +139,8 @@ copy $(OutDir)veracrypt.inf "$(SolutionDir)Debug\Setup Files\veracrypt.inf"</Com
<Inf>
<ProviderName>
</ProviderName>
<TimeStamp>1.26.28.0</TimeStamp>
<DateStamp>04/30/2026</DateStamp>
<TimeStamp>1.26.28.1</TimeStamp>
<DateStamp>05/22/2026</DateStamp>
</Inf>
<Link>
<AdditionalDependencies>fltmgr.lib;%(AdditionalDependencies);$(KernelBufferOverflowLib);$(DDK_LIB_PATH)ntoskrnl.lib;$(DDK_LIB_PATH)hal.lib;$(DDK_LIB_PATH)wmilib.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfLdr.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfDriverEntry.lib</AdditionalDependencies>
@@ -166,8 +166,8 @@ copy $(OutDir)veracrypt.inf "$(SolutionDir)Release\Setup Files\veracrypt.inf"</C
<Inf>
<ProviderName>
</ProviderName>
<TimeStamp>1.26.28.0</TimeStamp>
<DateStamp>04/30/2026</DateStamp>
<TimeStamp>1.26.28.1</TimeStamp>
<DateStamp>05/22/2026</DateStamp>
</Inf>
<Link>
<AdditionalDependencies>fltmgr.lib;%(AdditionalDependencies);$(KernelBufferOverflowLib);$(DDK_LIB_PATH)ntoskrnl.lib;$(DDK_LIB_PATH)hal.lib;$(DDK_LIB_PATH)wmilib.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfLdr.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfDriverEntry.lib</AdditionalDependencies>
@@ -193,15 +193,15 @@ copy $(OutDir)veracrypt.inf "$(SolutionDir)Release\Setup Files\veracrypt.inf"</C
<Inf>
<ProviderName>
</ProviderName>
<TimeStamp>1.26.28.0</TimeStamp>
<DateStamp>04/30/2026</DateStamp>
<TimeStamp>1.26.28.1</TimeStamp>
<DateStamp>05/22/2026</DateStamp>
</Inf>
<Link>
<AdditionalDependencies>fltmgr.lib;%(AdditionalDependencies);$(KernelBufferOverflowLib);$(DDK_LIB_PATH)ntoskrnl.lib;$(DDK_LIB_PATH)hal.lib;$(DDK_LIB_PATH)wmilib.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfLdr.lib;$(KMDF_LIB_PATH)$(KMDF_VER_PATH)\WdfDriverEntry.lib</AdditionalDependencies>
</Link>
<PostBuildEvent>
<Command>copy $(OutDir)veracrypt.sys "$(SolutionDir)Debug\Setup Files\veracrypt-arm64.sys"
copy $(OutDir)veracrypt.pdb "$(SolutionDir\Debug\Setup Files\veracrypt-arm64.pdb"
copy $(OutDir)veracrypt.pdb "$(SolutionDir)Debug\Setup Files\veracrypt-arm64.pdb"
copy $(OutDir)vc143.pdb "$(SolutionDir)Debug\Setup Files\vc143-arm64.pdb"
copy $(OutDir)veracrypt.inf "$(SolutionDir)Debug\Setup Files\veracrypt.inf"</Command>
</PostBuildEvent>
+63 -2
View File
@@ -249,7 +249,7 @@ static void OnItemCompleted (EncryptedIoQueueItem *item, BOOL freeItem)
DecrementOutstandingIoCount (item->Queue);
IoReleaseRemoveLock (&item->Queue->RemoveLock, item->OriginalIrp);
if (NT_SUCCESS (item->Status))
if (NT_SUCCESS (item->Status) && !item->Flush)
{
if (item->Write)
item->Queue->TotalBytesWritten += item->OriginalLength;
@@ -630,6 +630,29 @@ static VOID IoThreadProc (PVOID threadArg)
InterlockedDecrement (&queue->IoThreadPendingRequestCount);
request = CONTAINING_RECORD (listEntry, EncryptedIoRequest, ListEntry);
if (request->Item->Flush)
{
#ifdef TC_TRACE_IO_QUEUE
Dump ("F [%I64d]\n", GetElapsedTime (&queue->LastPerformanceCounter));
#endif
if (NT_SUCCESS (request->Item->Status))
{
if (queue->HostFileHandle)
{
IO_STATUS_BLOCK ioStatus;
request->Item->Status = ZwFlushBuffersFile (queue->HostFileHandle, &ioStatus);
}
else
{
request->Item->Status = STATUS_DEVICE_NOT_READY;
}
}
HandleCompleteOriginalIrp (queue, request);
ReleasePoolBuffer (queue, request);
continue;
}
#ifdef TC_TRACE_IO_QUEUE
Dump ("%c %I64d [%I64d] roff=%I64d rlen=%d\n", request->Item->Write ? 'W' : 'R', request->Item->OriginalIrpOffset.QuadPart, GetElapsedTime (&queue->LastPerformanceCounter), request->Offset.QuadPart, request->Length);
#endif
@@ -832,6 +855,7 @@ static VOID MainThreadProc (PVOID threadArg)
item->OriginalIrp = irp;
item->TempUserMdl = NULL;
item->Status = STATUS_SUCCESS;
item->Flush = FALSE;
IoAcquireCancelSpinLock(&irql);
(PDRIVER_CANCEL)IoSetCancelRoutine(irp, NULL);
@@ -858,6 +882,13 @@ static VOID MainThreadProc (PVOID threadArg)
item->OriginalLength = irpSp->Parameters.Write.Length;
break;
case IRP_MJ_FLUSH_BUFFERS:
item->Write = FALSE;
item->Flush = TRUE;
item->OriginalOffset.QuadPart = 0;
item->OriginalLength = 0;
break;
default:
// Defer completion for invalid parameter
QueueIrpCompletionFromItem(queue, item, STATUS_INVALID_PARAMETER);
@@ -868,6 +899,32 @@ static VOID MainThreadProc (PVOID threadArg)
item->OriginalIrpOffset = item->OriginalOffset;
#endif
if (item->Flush)
{
InterlockedIncrement (&queue->IoThreadPendingRequestCount);
request = GetPoolBuffer (queue, sizeof (EncryptedIoRequest));
if (!request)
{
InterlockedDecrement (&queue->IoThreadPendingRequestCount);
QueueIrpCompletionFromItem (queue, item, STATUS_INSUFFICIENT_RESOURCES);
continue;
}
request->Item = item;
request->CompleteOriginalIrp = TRUE;
request->Offset.QuadPart = 0;
request->Data = NULL;
request->OrigDataBufferFragment = NULL;
request->Length = 0;
request->EncryptedOffset = 0;
request->EncryptedLength = 0;
ExInterlockedInsertTailList (&queue->IoThreadQueue, &request->ListEntry, &queue->IoThreadQueueLock);
KeSetEvent (&queue->IoThreadQueueNotEmptyEvent, IO_DISK_INCREMENT, FALSE);
continue;
}
// Handle misaligned read operations to work around a bug in Windows System Assessment Tool which does not follow FILE_FLAG_NO_BUFFERING requirements when benchmarking disk devices
if (queue->IsFilterDevice
&& !item->Write
@@ -1155,7 +1212,11 @@ NTSTATUS EncryptedIoQueueAddIrp (EncryptedIoQueue *queue, PIRP irp)
#ifdef TC_TRACE_IO_QUEUE
{
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation (irp);
Dump ("* %I64d [%I64d] %c len=%d out=%d\n", irpSp->MajorFunction == IRP_MJ_WRITE ? irpSp->Parameters.Write.ByteOffset : irpSp->Parameters.Read.ByteOffset, GetElapsedTime (&queue->LastPerformanceCounter), irpSp->MajorFunction == IRP_MJ_WRITE ? 'W' : 'R', irpSp->MajorFunction == IRP_MJ_WRITE ? irpSp->Parameters.Write.Length : irpSp->Parameters.Read.Length, queue->OutstandingIoCount);
if (irpSp->MajorFunction == IRP_MJ_FLUSH_BUFFERS)
Dump ("* F [%I64d] out=%d\n", GetElapsedTime (&queue->LastPerformanceCounter), queue->OutstandingIoCount);
else
Dump ("* %I64d [%I64d] %c len=%d out=%d\n", irpSp->MajorFunction == IRP_MJ_WRITE ? irpSp->Parameters.Write.ByteOffset : irpSp->Parameters.Read.ByteOffset, GetElapsedTime (&queue->LastPerformanceCounter), irpSp->MajorFunction == IRP_MJ_WRITE ? 'W' : 'R', irpSp->MajorFunction == IRP_MJ_WRITE ? irpSp->Parameters.Write.Length : irpSp->Parameters.Read.Length, queue->OutstandingIoCount);
}
#endif
+1
View File
@@ -155,6 +155,7 @@ typedef struct
EncryptedIoQueue *Queue;
PIRP OriginalIrp;
BOOL Write;
BOOL Flush;
ULONG OriginalLength;
LARGE_INTEGER OriginalOffset;
NTSTATUS Status;
+35
View File
@@ -40,6 +40,9 @@
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#ifdef TC_OPENBSD
#include <pwd.h>
#endif
#include <sys/mman.h>
#include <sys/statvfs.h>
#include <sys/time.h>
@@ -65,6 +68,26 @@ namespace VeraCrypt
static const uint64 VC_FUSE_METADATA_SIZE = 64 * 1024;
static const uint64 VC_FUSE_STAT_BLOCK_SIZE = 512;
#ifdef TC_OPENBSD
static bool fuse_service_get_doas_user_ids (uid_t *uid, gid_t *gid)
{
const char *env = getenv ("DOAS_USER");
if (!env || !env[0])
return false;
struct passwd *pw = getpwnam (env);
if (!pw)
return false;
if (uid)
*uid = pw->pw_uid;
if (gid)
*gid = pw->pw_gid;
return true;
}
#endif
static uint64 fuse_service_ceil_div (uint64 value, uint64 divisor)
{
return (value / divisor) + ((value % divisor) ? 1 : 0);
@@ -790,6 +813,18 @@ namespace VeraCrypt
}
catch (...) { }
}
#ifdef TC_OPENBSD
else
{
uid_t doasUid;
gid_t doasGid;
if (fuse_service_get_doas_user_ids (&doasUid, &doasGid))
{
FuseService::UserId = doasUid;
FuseService::GroupId = doasGid;
}
}
#endif
static fuse_operations fuse_service_oper;
+12 -1
View File
@@ -621,7 +621,18 @@ NTSTATUS TCDispatchQueueIRP (PDEVICE_OBJECT DeviceObject, PIRP Irp)
return STATUS_PENDING;
case IRP_MJ_FLUSH_BUFFERS:
return TCCompleteDiskIrp (Irp, STATUS_SUCCESS, 0);
if (Extension->hDeviceFile == NULL || Extension->bReadOnly)
return TCCompleteDiskIrp (Irp, STATUS_SUCCESS, 0);
if (!EncryptedIoQueueIsRunning (&Extension->Queue))
return TCCompleteDiskIrp (Irp, STATUS_SUCCESS, 0);
ntStatus = EncryptedIoQueueAddIrp (&Extension->Queue, Irp);
if (ntStatus != STATUS_PENDING)
TCCompleteDiskIrp (Irp, ntStatus, 0);
return ntStatus;
}
break;
+7
View File
@@ -909,6 +909,13 @@ void TCCloseVolume (PDEVICE_OBJECT DeviceObject, PEXTENSION Extension)
{
RestoreTimeStamp (Extension);
}
if (!Extension->bReadOnly)
{
IO_STATUS_BLOCK ioStatus;
NTSTATUS flushStatus = ZwFlushBuffersFile (Extension->hDeviceFile, &ioStatus);
if (!NT_SUCCESS (flushStatus))
Dump ("ZwFlushBuffersFile failed before closing volume: NTSTATUS 0x%08x\n", flushStatus);
}
ZwClose (Extension->hDeviceFile);
Extension->hDeviceFile = NULL;
}
+2 -2
View File
@@ -192,8 +192,8 @@ IDR_MOUNT_RSRC_HEADER HEADER "resource.h"
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,28,0
PRODUCTVERSION 1,26,28,0
FILEVERSION 1,26,28,1
PRODUCTVERSION 1,26,28,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
+2 -2
View File
@@ -28,8 +28,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,28,0
PRODUCTVERSION 1,26,28,0
FILEVERSION 1,26,28,1
PRODUCTVERSION 1,26,28,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
+13 -7
View File
@@ -511,12 +511,18 @@ copy $(TargetPath) "..\Debug\Setup Files\VeraCrypt Format-arm64.exe" &gt;NUL:
<ClInclude Include="..\Common\Xts.h" />
</ItemGroup>
<ItemGroup>
<None Include="..\Boot\EFI\DcsBoot.efi" />
<None Include="..\Boot\EFI\DcsCfg.efi" />
<None Include="..\Boot\EFI\DcsInfo.efi" />
<None Include="..\Boot\EFI\DcsInt.efi" />
<None Include="..\Boot\EFI\DcsRe.efi" />
<None Include="..\Boot\EFI\LegacySpeaker.efi" />
<None Include="..\Boot\EFI\2011UEFICA\DcsBoot.efi" />
<None Include="..\Boot\EFI\2011UEFICA\DcsCfg.efi" />
<None Include="..\Boot\EFI\2011UEFICA\DcsInfo.efi" />
<None Include="..\Boot\EFI\2011UEFICA\DcsInt.efi" />
<None Include="..\Boot\EFI\2011UEFICA\DcsRe.efi" />
<None Include="..\Boot\EFI\2011UEFICA\LegacySpeaker.efi" />
<None Include="..\Boot\EFI\2023UEFICA\DcsBoot.efi" />
<None Include="..\Boot\EFI\2023UEFICA\DcsCfg.efi" />
<None Include="..\Boot\EFI\2023UEFICA\DcsInfo.efi" />
<None Include="..\Boot\EFI\2023UEFICA\DcsInt.efi" />
<None Include="..\Boot\EFI\2023UEFICA\DcsRe.efi" />
<None Include="..\Boot\EFI\2023UEFICA\LegacySpeaker.efi" />
<None Include="..\Boot\Windows\Release_AES_SHA2\BootLoader.com.gz" />
<None Include="..\Boot\Windows\Release_Camellia\BootLoader.com.gz" />
<None Include="..\Boot\Windows\Release_Camellia\BootSector.bin" />
@@ -599,4 +605,4 @@ copy $(TargetPath) "..\Debug\Setup Files\VeraCrypt Format-arm64.exe" &gt;NUL:
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>
</Project>
+5
View File
@@ -176,6 +176,11 @@ public:
return BaseCom::GetSecureBootConfig (pSecureBootEnabled, pVeraCryptKeysLoaded);
}
virtual DWORD STDMETHODCALLTYPE GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported)
{
return BaseCom::GetEfiBootLoaderSigningSupport (pMicrosoft2023UefiCAsSupported);
}
virtual DWORD STDMETHODCALLTYPE WriteEfiBootSectorUserConfig (DWORD userConfig, BSTR customUserMessage, int pim, int hashAlg)
{
return BaseCom::WriteEfiBootSectorUserConfig (userConfig, customUserMessage,pim, hashAlg);
+2 -1
View File
@@ -16,7 +16,7 @@ import "..\Common\Password.h";
[
uuid(56327DDA-F1A7-4e13-B128-520D129BDEF6),
helpstring("VeraCrypt Format UAC Support Library"),
version(2.10) // Update ComSetup.cpp when changing version number
version(2.11) // Update ComSetup.cpp when changing version number
]
library TrueCryptFormatCom
{
@@ -51,6 +51,7 @@ library TrueCryptFormatCom
DWORD GetSecureBootConfig (BOOL* pSecureBootEnabled, BOOL *pVeraCryptKeysLoaded);
DWORD NotifyService (DWORD dwNotifyCode);
DWORD FastFileResize (BSTR filePath, __int64 fileSize);
DWORD GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported);
};
[
+2 -2
View File
@@ -25,8 +25,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,28,0
PRODUCTVERSION 1,26,28,0
FILEVERSION 1,26,28,1
PRODUCTVERSION 1,26,28,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
+6 -1
View File
@@ -48,6 +48,11 @@ namespace VeraCrypt
MainFrame::MainFrame (wxWindow* parent) : MainFrameBase (parent),
#ifdef HAVE_INDICATORS
indicator (NULL),
indicator_item_showhide (NULL),
indicator_item_mountfavorites (NULL),
indicator_item_dismountall (NULL),
indicator_item_prefs (NULL),
indicator_item_exit (NULL),
#endif
ListItemRightClickEventPending (false),
SelectedItemIndex (-1),
@@ -1445,7 +1450,7 @@ namespace VeraCrypt
try
{
uint8 buf[128];
if (read (ShowRequestFifo, buf, sizeof (buf)) > 0 && Gui->IsInBackgroundMode())
if (read (ShowRequestFifo, buf, sizeof (buf)) > 0)
Gui->SetBackgroundMode (false);
}
catch (...)
+13 -1
View File
@@ -22,6 +22,9 @@
#include "Main/Main.h"
#include "Main/Application.h"
#include "Main/GraphicUserInterface.h"
#ifdef TC_LINUX
#include "Platform/Unix/Process.h"
#endif
#include "Volume/Cipher.h"
#include "PreferencesDialog.h"
@@ -132,7 +135,16 @@ namespace VeraCrypt
#if defined (TC_MACOSX)
wxDir languagesFolder(StringConverter::ToSingle (Application::GetExecutableDirectory()) + "/../Resources/languages/");
#else
wxDir languagesFolder("/usr/share/veracrypt/languages/");
wxString languagesFolderPath("/usr/share/veracrypt/languages/");
#ifdef TC_LINUX
if (Process::IsRunningUnderAppImage (StringConverter::ToSingle (wstring (Application::GetExecutablePath()))))
{
const char* appDirEnv = getenv ("APPDIR");
if (appDirEnv)
languagesFolderPath = wxString::FromUTF8 (appDirEnv) + "/usr/share/veracrypt/languages/";
}
#endif
wxDir languagesFolder(languagesFolderPath);
#endif
wxArrayString langArray;
LanguageListBox->Append("System default");
+19 -2
View File
@@ -391,6 +391,7 @@ namespace VeraCrypt
DisplayKeyInfo (false),
LargeFilesSupport (false),
QuickFormatEnabled (false),
QuickFormatEnabledByWizard (false),
SelectedFilesystemClusterSize (0),
SelectedFilesystemType (VolumeCreationOptions::FilesystemType::FAT),
SelectedVolumeHostType (VolumeHostType::File),
@@ -446,6 +447,7 @@ namespace VeraCrypt
OuterVolume = false;
LargeFilesSupport = false;
QuickFormatEnabled = false;
QuickFormatEnabledByWizard = false;
Pim = 0;
SingleChoiceWizardPage <VolumeHostType::Enum> *page = new SingleChoiceWizardPage <VolumeHostType::Enum> (GetPageParent(), wxEmptyString, true);
@@ -595,15 +597,29 @@ namespace VeraCrypt
{
shared_ptr <VolumeLayout> layout ((OuterVolume || SelectedVolumeType != VolumeType::Hidden)? (VolumeLayout*) new VolumeLayoutV2Normal() : (VolumeLayout*) new VolumeLayoutV2Hidden());
uint64 filesystemSize = layout->GetMaxDataSize (VolumeSize);
bool hiddenVolumeItself = !OuterVolume && SelectedVolumeType == VolumeType::Hidden;
bool normalFileContainer = !OuterVolume && SelectedVolumeType == VolumeType::Normal && SelectedVolumeHostType == VolumeHostType::File;
bool existingDeviceSupportedCase = SelectedVolumePath.IsDevice() && !hiddenVolumeItself;
bool quickFormatSupported = existingDeviceSupportedCase || normalFileContainer;
VolumeFormatOptionsWizardPage *page = new VolumeFormatOptionsWizardPage (GetPageParent(), filesystemSize, SectorSize,
SelectedVolumePath.IsDevice() && (OuterVolume || SelectedVolumeType != VolumeType::Hidden), OuterVolume, LargeFilesSupport);
quickFormatSupported, OuterVolume, LargeFilesSupport);
page->SetPageTitle (LangString["FORMAT_TITLE"]);
page->SetFilesystemType (SelectedFilesystemType);
if (!OuterVolume && SelectedVolumeType == VolumeType::Hidden)
if (hiddenVolumeItself)
{
QuickFormatEnabled = true;
QuickFormatEnabledByWizard = true;
}
else
{
if (!quickFormatSupported || QuickFormatEnabledByWizard)
QuickFormatEnabled = false;
QuickFormatEnabledByWizard = false;
}
page->SetQuickFormat (QuickFormatEnabled);
return page;
@@ -1332,6 +1348,7 @@ namespace VeraCrypt
SelectedFilesystemType = page->GetFilesystemType();
QuickFormatEnabled = page->IsQuickFormatEnabled();
QuickFormatEnabledByWizard = !OuterVolume && SelectedVolumeType == VolumeType::Hidden;
if (SelectedFilesystemType != VolumeCreationOptions::FilesystemType::None
&& SelectedFilesystemType != VolumeCreationOptions::FilesystemType::FAT)
+1
View File
@@ -76,6 +76,7 @@ namespace VeraCrypt
shared_ptr <VolumeInfo> MountedOuterVolume;
bool OuterVolume;
bool QuickFormatEnabled;
bool QuickFormatEnabledByWizard;
shared_ptr <EncryptionAlgorithm> SelectedEncryptionAlgorithm;
uint32 SelectedFilesystemClusterSize;
VolumeCreationOptions::FilesystemType::Enum SelectedFilesystemType;
+3 -2
View File
@@ -1037,7 +1037,6 @@ namespace VeraCrypt
if (write (showFifo, buf, 1) == 1)
{
close (showFifo);
Gui->ShowInfo (LangString["LINUX_VC_RUNNING_ALREADY"]);
Application::SetExitCode (0);
return false;
}
@@ -1872,7 +1871,9 @@ namespace VeraCrypt
BackgroundMode = state;
#ifdef HAVE_INDICATORS
gtk_menu_item_set_label ((GtkMenuItem*) ((MainFrame*) mMainFrame)->indicator_item_showhide, LangString[Gui->IsInBackgroundMode() ? "SHOW_TC" : "HIDE_TC"].mb_str());
MainFrame *mainFrame = (MainFrame*) mMainFrame;
if (mainFrame->indicator_item_showhide)
gtk_menu_item_set_label ((GtkMenuItem*) mainFrame->indicator_item_showhide, LangString[Gui->IsInBackgroundMode() ? "SHOW_TC" : "HIDE_TC"].mb_str());
#endif
}
+29 -2
View File
@@ -106,7 +106,8 @@ FUSE_LIBS = $(shell $(PKG_CONFIG) $(VC_FUSE_PACKAGE) --libs)
#------ Executable ------
export TC_VERSION := $(shell awk -F '"' '/^[[:space:]]*#define[[:space:]]+VERSION_STRING[[:space:]]*"/ { print $$2; exit }' ../Common/Tcdefs.h)
HASH_CHAR := \#
export TC_VERSION := $(shell awk -F '"' '/^[[:space:]]*$(HASH_CHAR)define[[:space:]]+VERSION_STRING[[:space:]]*"/ { print $$2; exit }' ../Common/Tcdefs.h)
#------ Linux package naming ------
ifeq "$(PLATFORM)" "Linux"
@@ -327,6 +328,7 @@ INSTALL_DESKTOP ?= 1
INSTALL_MIME ?= 1
INSTALL_ICONS ?= 1
INSTALL_APPIMAGE_FILES ?= 1
APPIMAGE_BUNDLE_FUSE2 ?= 1
# These override values are appended below usr and used in shell recipes.
# Keep command-line/environment overrides literal and path-like.
@@ -425,6 +427,27 @@ endif
ifneq "$(INSTALL_APPIMAGE_FILES)" "0"
rm -fr $(BASE_DIR)/Setup/Linux/veracrypt.AppDir/usr
cp -r $(BASE_DIR)/Setup/Linux/usr $(BASE_DIR)/Setup/Linux/veracrypt.AppDir/.
ifneq "$(APPIMAGE_BUNDLE_FUSE2)" "0"
@set -e; \
_appdir="$(BASE_DIR)/Setup/Linux/veracrypt.AppDir"; \
_fuse_lib="$$( (ldconfig -p 2>/dev/null || /sbin/ldconfig -p 2>/dev/null || true) | awk '/libfuse\.so\.2[[:space:]]/ { print $$NF; exit }')"; \
if [ -z "$$_fuse_lib" ]; then \
for _candidate in /lib64/libfuse.so.2 /usr/lib64/libfuse.so.2 /lib/libfuse.so.2 /usr/lib/libfuse.so.2 /lib/*/libfuse.so.2 /usr/lib/*/libfuse.so.2; do \
if [ -e "$$_candidate" ]; then _fuse_lib="$$_candidate"; break; fi; \
done; \
fi; \
if [ -n "$$_fuse_lib" ]; then \
echo "Bundling AppImage FUSE2 userspace library: $$_fuse_lib"; \
mkdir -p "$$_appdir/usr/lib"; \
cp -P "$$_fuse_lib" "$$_appdir/usr/lib/"; \
_fuse_real="$$(readlink -f "$$_fuse_lib" 2>/dev/null || true)"; \
if [ -n "$$_fuse_real" ] && [ "$$_fuse_real" != "$$_fuse_lib" ]; then \
cp "$$_fuse_real" "$$_appdir/usr/lib/"; \
fi; \
else \
echo "Warning: libfuse.so.2 not found; AppImage will rely on a host FUSE2 userspace library"; \
fi
endif
ifneq "$(INSTALL_ICONS)" "0"
ln -sf usr/share/icons/hicolor/1024x1024/apps/$(APPNAME).png $(BASE_DIR)/Setup/Linux/veracrypt.AppDir/$(APPNAME).png
endif
@@ -549,7 +572,11 @@ appimage: prepare
_appimagetool_executable_name="appimagetool-$${_appimagetool_arch_suffix}.AppImage"; \
_appimagetool_executable_path="$(BASE_DIR)/Setup/Linux/$${_appimagetool_executable_name}"; \
_appimagetool_url="https://github.com/AppImage/appimagetool/releases/download/continuous/$${_appimagetool_executable_name}"; \
_final_appimage_filename="VeraCrypt-$(TC_VERSION)-$${_final_appimage_arch_suffix}.AppImage"; \
_final_appimage_gtk_suffix=""; \
if [ "$(GTK_VERSION)" = "2" ]; then \
_final_appimage_gtk_suffix="-gtk2-legacy"; \
fi; \
_final_appimage_filename="VeraCrypt-$(TC_VERSION)$${_final_appimage_gtk_suffix}-$${_final_appimage_arch_suffix}.AppImage"; \
_final_appimage_path="$(BASE_DIR)/Setup/Linux/$${_final_appimage_filename}"; \
\
echo "Preparing AppImage for $(CPU_ARCH) (using $${_appimagetool_arch_suffix})..."; \
+11 -2
View File
@@ -17,13 +17,14 @@
#ifdef TC_WINDOWS
#include "Main/resource.h"
#else
#ifdef TC_MACOSX
#include "Application.h"
#endif
#include "Platform/File.h"
#include "Platform/StringConverter.h"
#include <stdio.h>
#include "UserPreferences.h"
#if defined(TC_LINUX)
#include "Platform/Unix/Process.h"
#endif
#endif
namespace VeraCrypt
@@ -66,6 +67,14 @@ namespace VeraCrypt
string filenamePrefix = StringConverter::ToSingle (Application::GetExecutableDirectory()) + "/../Resources/languages/Language.";
#else
string filenamePrefix("/usr/share/veracrypt/languages/Language.");
#if defined(TC_LINUX)
if (Process::IsRunningUnderAppImage (StringConverter::ToSingle (wstring (Application::GetExecutablePath()))))
{
const char* appDirEnv = getenv ("APPDIR");
if (appDirEnv)
filenamePrefix = string (appDirEnv) + "/usr/share/veracrypt/languages/Language.";
}
#endif
#endif
string filenamePost(".xml");
string filename = filenamePrefix + defaultLang + filenamePost;
+12 -2
View File
@@ -766,8 +766,6 @@ namespace VeraCrypt
}
}
options->Quick = false;
uint32 sectorSizeRem = options->Size % options->SectorSize;
if (sectorSizeRem != 0)
options->Size += options->SectorSize - sectorSizeRem;
@@ -964,6 +962,18 @@ namespace VeraCrypt
throw_err (_("Specified volume size is too small to be used with Btrfs filesystem."));
}
if (options->Quick && options->Type == VolumeType::Normal)
{
if (Preferences.NonInteractive)
{
ShowWarning (_("Quick Format is enabled. Do not use --quick for an outer volume intended to contain a hidden volume. It skips writing random data to unused volume space, reducing plausible deniability. For file containers, actual disk savings depend on host filesystem sparse-file support, and later writes can fail if host space runs out."));
}
else if (!AskYesNo (LangString["WARN_QUICK_FORMAT"], false, true))
{
throw UserAbort (SRC_POS);
}
}
// Password
if (!options->Password && !Preferences.NonInteractive)
{
+7 -3
View File
@@ -1219,7 +1219,7 @@ const FileManager fileManagers[] = {
" Inexperienced users should use the graphical user interface to create a hidden\n"
" volume. When using the text user interface, the following procedure must be\n"
" followed to create a hidden volume:\n"
" 1) Create an outer volume with no filesystem.\n"
" 1) Create an outer volume with no filesystem and without --quick.\n"
" 2) Create a hidden volume within the outer volume.\n"
" 3) Mount the outer volume using hidden volume protection.\n"
" 4) Create a filesystem on the virtual device of the outer volume.\n"
@@ -1428,8 +1428,12 @@ const FileManager fileManagers[] = {
" See also options -p and --protect-hidden.\n"
"\n"
"--quick\n"
" Do not encrypt free space when creating a device-hosted volume. This option\n"
" must not be used when creating an outer volume.\n"
" Do not encrypt free space when creating a normal file-hosted or\n"
" device-hosted volume. This option must not be used when creating an outer\n"
" volume; text mode cannot infer that a normal volume will later be\n"
" used as an outer volume. For file containers, Quick Format may create sparse\n"
" or unwritten host regions; actual disk savings depend on host filesystem\n"
" sparse-file support, and later writes can fail if host space runs out.\n"
"\n"
"--random-source=FILE\n"
" Use FILE as a source of random data (e.g., when creating a volume) instead\n"
+3 -1
View File
@@ -19,6 +19,8 @@
# NOTEST: Do not test release binary
# RESOURCEDIR: Run-time resource directory
# VERBOSE: Enable verbose messages
# WITHFUSE3: Build with FUSE3 support instead of FUSE2
# WX_CONFIGURE_EXTRA_FLAGS: Extra flags passed to wxWidgets configure
# WXSTATIC: Use static wxWidgets library
# SSSE3: Enable SSSE3 support in compiler
# SSE41: Enable SSE4.1 support in compiler
@@ -736,7 +738,7 @@ endif
WX_CONFIGURE_LEGACY_FLAGS="$$WX_CONFIGURE_LEGACY_FLAGS --enable-$$option"; \
fi; \
done; \
"$(WX_ROOT)/configure" $(WX_CONFIGURE_FLAGS) $$WX_CONFIGURE_LEGACY_FLAGS >/dev/null
"$(WX_ROOT)/configure" $(WX_CONFIGURE_FLAGS) $(WX_CONFIGURE_EXTRA_FLAGS) $$WX_CONFIGURE_LEGACY_FLAGS >/dev/null
@echo Building wxWidgets library...
cd "$(WX_BUILD_DIR)" && $(MAKE) -j 4
+5
View File
@@ -193,6 +193,11 @@ public:
return BaseCom::GetSecureBootConfig (pSecureBootEnabled, pVeraCryptKeysLoaded);
}
virtual DWORD STDMETHODCALLTYPE GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported)
{
return BaseCom::GetEfiBootLoaderSigningSupport (pMicrosoft2023UefiCAsSupported);
}
virtual DWORD STDMETHODCALLTYPE WriteEfiBootSectorUserConfig (DWORD userConfig, BSTR customUserMessage, int pim, int hashAlg)
{
return BaseCom::WriteEfiBootSectorUserConfig (userConfig, customUserMessage,pim, hashAlg);
+2 -1
View File
@@ -16,7 +16,7 @@ import "..\Common\Password.h";
[
uuid(9ACF6176-5FC4-4690-A025-B3306A50EB6A),
helpstring("VeraCrypt Main UAC Support Library"),
version(2.13) // Update ComSetup.cpp when changing version number
version(2.14) // Update ComSetup.cpp when changing version number
]
library TrueCryptMainCom
{
@@ -55,6 +55,7 @@ library TrueCryptMainCom
DWORD GetSecureBootConfig (BOOL* pSecureBootEnabled, BOOL *pVeraCryptKeysLoaded);
DWORD NotifyService (DWORD dwNotifyCode);
DWORD FastFileResize (BSTR filePath, __int64 fileSize);
DWORD GetEfiBootLoaderSigningSupport (BOOL* pMicrosoft2023UefiCAsSupported);
};
[
+2 -2
View File
@@ -587,8 +587,8 @@ END
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,28,0
PRODUCTVERSION 1,26,28,0
FILEVERSION 1,26,28,1
PRODUCTVERSION 1,26,28,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
+1
View File
@@ -87,6 +87,7 @@ namespace VeraCrypt
uint64 ReadAt (const BufferPtr &buffer, uint64 position) const;
void SeekAt (uint64 position) const;
void SeekEnd (int ofset) const;
void SetLength (uint64 length) const;
void Write (const ConstBufferPtr &buffer) const;
void Write (const ConstBufferPtr &buffer, size_t length) const { Write (buffer.GetRange (0, length)); }
void WriteAt (const ConstBufferPtr &buffer, uint64 position) const;
+1
View File
@@ -29,6 +29,7 @@ namespace VeraCrypt
SyncEvent ();
~SyncEvent ();
void Reset ();
void Signal ();
void Wait ();
+36 -3
View File
@@ -125,7 +125,11 @@ namespace VeraCrypt
#elif defined (TC_OPENBSD)
struct disklabel dl;
throw_sys_sub_if (ioctl (FileHandle, DIOCGPDINFO, &dl) == -1, wstring (Path));
throw_sys_sub_if (ioctl (FileHandle, DIOCGDINFO, &dl) == -1, wstring (Path));
if (dl.d_secsize == 0)
throw ParameterIncorrect (SRC_POS);
return (uint32) dl.d_secsize;
#elif defined (TC_SOLARIS)
@@ -213,8 +217,31 @@ namespace VeraCrypt
return blockCount * blockSize;
# elif TC_OPENBSD
struct disklabel dl;
throw_sys_sub_if (ioctl (FileHandle, DIOCGPDINFO, &dl) == -1, wstring (Path));
return DL_GETDSIZE(&dl);
struct stat statData;
throw_sys_sub_if (ioctl (FileHandle, DIOCGDINFO, &dl) == -1, wstring (Path));
throw_sys_sub_if (fstat (FileHandle, &statData) == -1, wstring (Path));
if (dl.d_secsize == 0)
throw ParameterIncorrect (SRC_POS);
uint64 sectors;
int partition = DISKPART (statData.st_rdev);
if (partition == RAW_PART)
{
sectors = DL_GETDSIZE (&dl);
}
else
{
if (partition < 0 || partition >= dl.d_npartitions)
throw ParameterIncorrect (SRC_POS);
sectors = DL_GETPSIZE (&dl.d_partitions[partition]);
}
if (sectors > ((uint64) -1) / dl.d_secsize)
throw ParameterIncorrect (SRC_POS);
return sectors * dl.d_secsize;
# else
uint64 mediaSize;
throw_sys_sub_if (ioctl (FileHandle, DIOCGMEDIASIZE, &mediaSize) == -1, wstring (Path));
@@ -385,6 +412,12 @@ namespace VeraCrypt
throw_sys_sub_if (lseek (FileHandle, offset, SEEK_END) == -1, wstring (Path));
}
void File::SetLength (uint64 length) const
{
if_debug (ValidateState());
throw_sys_sub_if (ftruncate (FileHandle, length) == -1, wstring (Path));
}
void File::Write (const ConstBufferPtr &buffer) const
{
if_debug (ValidateState());
+8
View File
@@ -41,6 +41,14 @@ namespace VeraCrypt
Initialized = false;
}
void SyncEvent::Reset ()
{
assert (Initialized);
ScopeLock lock (EventMutex);
Signaled = false;
}
void SyncEvent::Signal ()
{
assert (Initialized);
+26 -7
View File
@@ -6,6 +6,7 @@
for upgrades to work ; Windows Installer ignores the 4th part -->
<?define var.FullProductVersion = 1.26.28?>
<?define var.ProductName = VeraCrypt $(var.FullProductVersion)?>
<?define var.StartMenuFolderName = VeraCrypt?>
<!-- Unique GUID identifying this family of product (32-bit and 64-bit have the same) -->
<?define var.UpgradeCode = {298F5D2B-3B01-4A13-BEFD-4B3C7BE43BC6}?>
@@ -186,7 +187,7 @@
<!-- Reference APPLICATIONPROGRAMSFOLDER to create a Start Menu Shortcut -->
<!-- See https://wixtoolset.org/documentation/manual/v3/howtos/files_and_registry/create_start_menu_shortcut.html -->
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="$(var.ProductName)"/>
<Directory Id="ApplicationProgramsFolder" Name="$(var.StartMenuFolderName)"/>
</Directory>
<!-- We do not Reference QuickLaunchFolder under AppDataFolder to create a Quick Launch Shortcut -->
@@ -2440,7 +2441,7 @@
<DirectoryRef Id="ApplicationProgramsFolder">
<!-- Creating an advertised shortcut : enhances resiliency by verifying that all the components in the feature are installed when the shortcut is activated -->
<Component Id="VCShortcutStartMenu" Guid="{9CA5F425-0268-4424-8E41-A94D90F1118D}">
<Component Id="VCShortcutStartMenu" Guid="{684DA19F-50FC-43AA-89BA-1685DAC0D585}">
<Condition>INSTALLSTARTMENUSHORTCUT</Condition>
<Shortcut Id="VCMenuShortcut"
@@ -2456,7 +2457,7 @@
<RegistryValue
Root="HKCU"
Key="Software\VeraCrypt_MSI"
Name="VCStartMenuShortcutInstalled"
Name="VCStartMenuShortcutInstalledStable"
Type="integer"
Value="1"
KeyPath="yes"/>
@@ -2464,7 +2465,7 @@
</Component>
<!-- Creating an advertised shortcut : enhances resiliency by verifying that all the components in the feature are installed when the shortcut is activated -->
<Component Id="VCExpanderShortcutStartMenu" Guid="9BA70A97-CB6D-4ED4-A0F7-A4CF9885DC33">
<Component Id="VCExpanderShortcutStartMenu" Guid="{E0C191AE-86EB-462A-9C8A-73338EC7A153}">
<Condition>INSTALLSTARTMENUSHORTCUT</Condition>
<Shortcut Id="VCExpanderStartMenuShortcut"
@@ -2480,7 +2481,7 @@
<RegistryValue
Root="HKCU"
Key="Software\VeraCrypt_MSI"
Name="VCEexpanderStartMenuShortcutInstalled"
Name="VCExpanderStartMenuShortcutInstalledStable"
Type="integer"
Value="1"
KeyPath="yes"/>
@@ -2488,7 +2489,7 @@
</Component>
<!-- Creating an advertised shortcut : enhances resiliency by verifying that all the components in the feature are installed when the shortcut is activated -->
<Component Id="VCWebsiteShortcutStartMenu" Guid="{D5AA7FFE-5256-4234-AEE1-F9F1EB6ECA4A}">
<Component Id="VCWebsiteShortcutStartMenu" Guid="{00CA573B-4B04-4397-8061-CF5B5515DDBD}">
<Condition>INSTALLSTARTMENUSHORTCUT</Condition>
<util:InternetShortcut Id="VCWebsiteStartMenuShortcut"
@@ -2503,7 +2504,7 @@
<RegistryValue
Root="HKCU"
Key="Software\VeraCrypt_MSI"
Name="VCWebsiteStartMenuShortcutInstalled"
Name="VCWebsiteStartMenuShortcutInstalledStable"
Type="integer"
Value="1"
KeyPath="yes"/>
@@ -3444,6 +3445,12 @@
<CustomAction Id="PostInst_SetData"
Property="DoPostInstall"
Value="INSTALLDIR=[APPLICATIONROOTFOLDER]" />
<!-- Create a Custom Action which sets the CustomActionData property
for CleanupOldStartMenuFolders Deferred Custom Action. -->
<CustomAction Id="CleanupOldStartMenuFolders_SetData"
Property="CleanupOldStartMenuFolders"
Value="PROGRAMMENUFOLDER=[ProgramMenuFolder]" />
<!-- Create a Custom Action which sets the CustomActionData property
for DoPostUninstall Deferred Custom Action.
@@ -3474,6 +3481,14 @@
Return="check"
BinaryKey="VeraCryptCustomActions"
DllEntry="VC_CustomAction_PostInstall" />
<!-- Best-effort cleanup of obsolete versioned Start Menu folders from previous MSI releases. -->
<CustomAction Id="CleanupOldStartMenuFolders"
Execute="deferred"
Impersonate="no"
Return="ignore"
BinaryKey="VeraCryptCustomActions"
DllEntry="VC_CustomAction_CleanupOldStartMenuFolders" />
<!-- Create our Pre-Uninstall Custom Action.
We need to run it as deferred so that it runs
@@ -3602,6 +3617,10 @@
it will execute it twice : once when it installs new files (NOT Installed), and then when it removes unnecessary files (actual upgrade: UPGRADINGPRODUCTCODE).
Therefore, we do not need to execute it at UPGRADINGPRODUCTCODE. -->
<Custom Action="DoPostInstall" After="InstallFiles">(NOT Installed AND NOT REMOVE) OR REINSTALL</Custom>
<!-- Cleanup obsolete versioned Start Menu folders as late as possible in the install transaction. -->
<Custom Action="CleanupOldStartMenuFolders_SetData" Before="CleanupOldStartMenuFolders">(NOT Installed AND NOT REMOVE) OR REINSTALL</Custom>
<Custom Action="CleanupOldStartMenuFolders" After="PublishProduct">(NOT Installed AND NOT REMOVE) OR REINSTALL</Custom>
<!-- UNINSTALLATION ONLY CAs -->
+26 -7
View File
@@ -6,6 +6,7 @@
for upgrades to work ; Windows Installer ignores the 4th part -->
<?define var.FullProductVersion = 1.26.28?>
<?define var.ProductName = VeraCrypt $(var.FullProductVersion)?>
<?define var.StartMenuFolderName = VeraCrypt?>
<!-- Unique GUID identifying this family of product (32-bit and 64-bit have the same) -->
<?define var.UpgradeCode = {813AB9FC-2117-4961-B459-EB65028EEC93}?>
@@ -186,7 +187,7 @@
<!-- Reference APPLICATIONPROGRAMSFOLDER to create a Start Menu Shortcut -->
<!-- See https://wixtoolset.org/documentation/manual/v3/howtos/files_and_registry/create_start_menu_shortcut.html -->
<Directory Id="ProgramMenuFolder">
<Directory Id="ApplicationProgramsFolder" Name="$(var.ProductName)"/>
<Directory Id="ApplicationProgramsFolder" Name="$(var.StartMenuFolderName)"/>
</Directory>
<!-- We do not Reference QuickLaunchFolder under AppDataFolder to create a Quick Launch Shortcut -->
@@ -2440,7 +2441,7 @@
<DirectoryRef Id="ApplicationProgramsFolder">
<!-- Creating an advertised shortcut : enhances resiliency by verifying that all the components in the feature are installed when the shortcut is activated -->
<Component Id="VCShortcutStartMenu" Guid="{9CA5F425-0268-4424-8E41-A94D90F1118D}">
<Component Id="VCShortcutStartMenu" Guid="{684DA19F-50FC-43AA-89BA-1685DAC0D585}">
<Condition>INSTALLSTARTMENUSHORTCUT</Condition>
<Shortcut Id="VCMenuShortcut"
@@ -2456,7 +2457,7 @@
<RegistryValue
Root="HKCU"
Key="Software\VeraCrypt_MSI"
Name="VCStartMenuShortcutInstalled"
Name="VCStartMenuShortcutInstalledStable"
Type="integer"
Value="1"
KeyPath="yes"/>
@@ -2464,7 +2465,7 @@
</Component>
<!-- Creating an advertised shortcut : enhances resiliency by verifying that all the components in the feature are installed when the shortcut is activated -->
<Component Id="VCExpanderShortcutStartMenu" Guid="9BA70A97-CB6D-4ED4-A0F7-A4CF9885DC33">
<Component Id="VCExpanderShortcutStartMenu" Guid="{E0C191AE-86EB-462A-9C8A-73338EC7A153}">
<Condition>INSTALLSTARTMENUSHORTCUT</Condition>
<Shortcut Id="VCExpanderStartMenuShortcut"
@@ -2480,7 +2481,7 @@
<RegistryValue
Root="HKCU"
Key="Software\VeraCrypt_MSI"
Name="VCEexpanderStartMenuShortcutInstalled"
Name="VCExpanderStartMenuShortcutInstalledStable"
Type="integer"
Value="1"
KeyPath="yes"/>
@@ -2488,7 +2489,7 @@
</Component>
<!-- Creating an advertised shortcut : enhances resiliency by verifying that all the components in the feature are installed when the shortcut is activated -->
<Component Id="VCWebsiteShortcutStartMenu" Guid="{D5AA7FFE-5256-4234-AEE1-F9F1EB6ECA4A}">
<Component Id="VCWebsiteShortcutStartMenu" Guid="{00CA573B-4B04-4397-8061-CF5B5515DDBD}">
<Condition>INSTALLSTARTMENUSHORTCUT</Condition>
<util:InternetShortcut Id="VCWebsiteStartMenuShortcut"
@@ -2503,7 +2504,7 @@
<RegistryValue
Root="HKCU"
Key="Software\VeraCrypt_MSI"
Name="VCWebsiteStartMenuShortcutInstalled"
Name="VCWebsiteStartMenuShortcutInstalledStable"
Type="integer"
Value="1"
KeyPath="yes"/>
@@ -3444,6 +3445,12 @@
<CustomAction Id="PostInst_SetData"
Property="DoPostInstall"
Value="INSTALLDIR=[APPLICATIONROOTFOLDER]" />
<!-- Create a Custom Action which sets the CustomActionData property
for CleanupOldStartMenuFolders Deferred Custom Action. -->
<CustomAction Id="CleanupOldStartMenuFolders_SetData"
Property="CleanupOldStartMenuFolders"
Value="PROGRAMMENUFOLDER=[ProgramMenuFolder]" />
<!-- Create a Custom Action which sets the CustomActionData property
for DoPostUninstall Deferred Custom Action.
@@ -3474,6 +3481,14 @@
Return="check"
BinaryKey="VeraCryptCustomActions"
DllEntry="VC_CustomAction_PostInstall" />
<!-- Best-effort cleanup of obsolete versioned Start Menu folders from previous MSI releases. -->
<CustomAction Id="CleanupOldStartMenuFolders"
Execute="deferred"
Impersonate="no"
Return="ignore"
BinaryKey="VeraCryptCustomActions"
DllEntry="VC_CustomAction_CleanupOldStartMenuFolders" />
<!-- Create our Pre-Uninstall Custom Action.
We need to run it as deferred so that it runs
@@ -3614,6 +3629,10 @@
it will execute it twice : once when it installs new files (NOT Installed), and then when it removes unnecessary files (actual upgrade: UPGRADINGPRODUCTCODE).
Therefore, we do not need to execute it at UPGRADINGPRODUCTCODE. -->
<Custom Action="DoPostInstall" After="InstallFiles">(NOT Installed AND NOT REMOVE) OR REINSTALL</Custom>
<!-- Cleanup obsolete versioned Start Menu folders as late as possible in the install transaction. -->
<Custom Action="CleanupOldStartMenuFolders_SetData" Before="CleanupOldStartMenuFolders">(NOT Installed AND NOT REMOVE) OR REINSTALL</Custom>
<Custom Action="CleanupOldStartMenuFolders" After="PublishProduct">(NOT Installed AND NOT REMOVE) OR REINSTALL</Custom>
<!-- UNINSTALLATION ONLY CAs -->
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+1 -1
View File
@@ -10,7 +10,7 @@ signature = "$Windows NT$"
Class = "Encryption" ;This is determined by the work this filter driver does
ClassGuid = {a0a701c0-a511-42ff-aa6c-06dc0395576f} ;This value is determined by the Class
Provider = %ProviderString%
DriverVer = 04/30/2026,1.26.28.0
DriverVer = 05/22/2026,1.26.28.1
CatalogFile = veracrypt.cat
PnpLockdown = 1
+2 -2
View File
@@ -11,10 +11,10 @@
*/
#define TC_MAIN_COM_VERSION_MAJOR 2
#define TC_MAIN_COM_VERSION_MINOR 13
#define TC_MAIN_COM_VERSION_MINOR 14
#define TC_FORMAT_COM_VERSION_MAJOR 2
#define TC_FORMAT_COM_VERSION_MINOR 10
#define TC_FORMAT_COM_VERSION_MINOR 11
#include <atlbase.h>
#include <comdef.h>
+11
View File
@@ -2,5 +2,16 @@
# Get the directory where AppRun is located
APPDIR=$(dirname "$(readlink -f "$0")")
# Prefer libraries bundled inside the AppImage. This lets the official
# AppImage carry its private FUSE2 userspace library on systems where
# libfuse.so.2 is no longer installed by default.
if [ -d "${APPDIR}/usr/lib" ]; then
if [ -n "${LD_LIBRARY_PATH:-}" ]; then
export LD_LIBRARY_PATH="${APPDIR}/usr/lib:${LD_LIBRARY_PATH}"
else
export LD_LIBRARY_PATH="${APPDIR}/usr/lib"
fi
fi
# Execute the main VeraCrypt application
exec "${APPDIR}/usr/bin/veracrypt" "$@"
+2 -2
View File
@@ -26,8 +26,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,28,0
PRODUCTVERSION 1,26,28,0
FILEVERSION 1,26,28,1
PRODUCTVERSION 1,26,28,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
+2
View File
@@ -1441,6 +1441,8 @@ BOOL DoRegUninstall (HWND hwndDlg, BOOL bRemoveDeprecated)
RegDeleteKeyExW (HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\VeraCrypt", KEY_WOW64_32KEY, 0);
RegDeleteKeyExW (HKEY_CURRENT_USER, L"Software\\VeraCrypt", KEY_WOW64_32KEY, 0);
DeleteRegistryKey (HKEY_LOCAL_MACHINE, L"Software\\VeraCrypt\\Diagnostics\\EfiBootLoader");
RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\VeraCrypt\\Diagnostics");
RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\VeraCryptVolume\\Shell\\open\\command");
RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\VeraCryptVolume\\Shell\\open");
+2 -2
View File
@@ -28,8 +28,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,26,28,0
PRODUCTVERSION 1,26,28,0
FILEVERSION 1,26,28,1
PRODUCTVERSION 1,26,28,1
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
+8 -6
View File
@@ -10,11 +10,13 @@
code distribution packages.
*/
// Keep these in sync with MainCom.idl and FormatCom.idl. MSI unregister targets these
// exact typelib versions before removing older versions.
#define TC_MAIN_COM_VERSION_MAJOR 2
#define TC_MAIN_COM_VERSION_MINOR 11
#define TC_MAIN_COM_VERSION_MINOR 14
#define TC_FORMAT_COM_VERSION_MAJOR 2
#define TC_FORMAT_COM_VERSION_MINOR 9
#define TC_FORMAT_COM_VERSION_MINOR 11
#include <atlbase.h>
#include <comdef.h>
@@ -52,9 +54,9 @@ extern "C" BOOL RegisterComServers (wchar_t *modulePath)
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR, 0, SYS_WIN32);
UnRegisterTypeLib (LIBID_TrueCryptFormatCom, TC_FORMAT_COM_VERSION_MAJOR, TC_FORMAT_COM_VERSION_MINOR, 0, SYS_WIN32);
// unregister older versions that may still exist
for (WORD i = 7; i >= 1; i--)
for (WORD i = 9; i >= 1; i--)
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-i, 0, SYS_WIN32);
for (WORD i = 5; i >= 1; i--)
for (WORD i = 6; i >= 1; i--)
UnRegisterTypeLib (LIBID_TrueCryptFormatCom, TC_FORMAT_COM_VERSION_MAJOR, TC_FORMAT_COM_VERSION_MINOR-i, 0, SYS_WIN32);
CRegObject ro;
@@ -95,9 +97,9 @@ extern "C" BOOL UnregisterComServers (wchar_t *modulePath)
return FALSE;
// unregister older versions that may still exist
for (WORD i = 7; i >= 1; i--)
for (WORD i = 9; i >= 1; i--)
UnRegisterTypeLib (LIBID_TrueCryptMainCom, TC_MAIN_COM_VERSION_MAJOR, TC_MAIN_COM_VERSION_MINOR-i, 0, SYS_WIN32);
for (WORD i = 5; i >= 1; i--)
for (WORD i = 6; i >= 1; i--)
UnRegisterTypeLib (LIBID_TrueCryptFormatCom, TC_FORMAT_COM_VERSION_MAJOR, TC_FORMAT_COM_VERSION_MINOR-i, 0, SYS_WIN32);
wchar_t module[1024];
+236 -5
View File
@@ -1730,6 +1730,9 @@ BOOL DoRegUninstall_Dll (MSIHANDLE hInstaller, BOOL bRemoveDeprecated)
RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\Classes\\VeraCryptVolume");
*/
DeleteRegistryKey (HKEY_LOCAL_MACHINE, L"Software\\VeraCrypt\\Diagnostics\\EfiBootLoader");
RegDeleteKey (HKEY_LOCAL_MACHINE, L"Software\\VeraCrypt\\Diagnostics");
if (!bRemoveDeprecated)
{
HKEY hKey;
@@ -2131,6 +2134,225 @@ void Tokenize(const wchar_t* szInput, std::vector<std::wstring>& szTokens)
}
}
static BOOL JoinPath(wchar_t *szPath, size_t cbPath, const wchar_t *szDirectory, const wchar_t *szFileName)
{
if (FAILED(StringCbCopyW(szPath, cbPath, szDirectory)))
return FALSE;
size_t cchPath = wcslen(szPath);
if (cchPath > 0 && szPath[cchPath - 1] != L'\\' && szPath[cchPath - 1] != L'/')
{
if (FAILED(StringCbCatW(szPath, cbPath, L"\\")))
return FALSE;
}
return SUCCEEDED(StringCbCatW(szPath, cbPath, szFileName));
}
static BOOL IsVersionedVeraCryptStartMenuFolderName(const wchar_t *szFolderName)
{
const wchar_t szPrefix[] = L"VeraCrypt ";
const wchar_t *szVersion = NULL;
BOOL bHasDigit = FALSE;
BOOL bHasDot = FALSE;
BOOL bPreviousDot = FALSE;
if (!szFolderName || _wcsnicmp(szFolderName, szPrefix, wcslen(szPrefix)) != 0)
return FALSE;
szVersion = szFolderName + wcslen(szPrefix);
if (*szVersion == L'\0')
return FALSE;
while (*szVersion)
{
if (*szVersion >= L'0' && *szVersion <= L'9')
{
bHasDigit = TRUE;
bPreviousDot = FALSE;
}
else if (*szVersion == L'.')
{
if (bPreviousDot)
return FALSE;
bHasDot = TRUE;
bPreviousDot = TRUE;
}
else
{
return FALSE;
}
++szVersion;
}
return bHasDigit && bHasDot && !bPreviousDot;
}
static void DeleteStartMenuShortcutIfExists(MSIHANDLE hInstaller, const wchar_t *szFolderPath, const wchar_t *szShortcutName)
{
wchar_t szShortcutPath[TC_MAX_PATH];
DWORD dwAttributes;
if (!JoinPath(szShortcutPath, sizeof(szShortcutPath), szFolderPath, szShortcutName))
{
MSILog(hInstaller, MSI_WARNING_LEVEL, L"Could not build Start Menu shortcut path for '%s'", szShortcutName);
return;
}
dwAttributes = GetFileAttributesW(szShortcutPath);
if (dwAttributes == INVALID_FILE_ATTRIBUTES || (dwAttributes & FILE_ATTRIBUTE_DIRECTORY))
return;
MSILog(hInstaller, MSI_INFO_LEVEL, L"Removing obsolete Start Menu shortcut '%s'", szShortcutPath);
if (dwAttributes & FILE_ATTRIBUTE_READONLY)
SetFileAttributesW(szShortcutPath, dwAttributes & ~FILE_ATTRIBUTE_READONLY);
if (!DeleteFileW(szShortcutPath))
{
DWORD dwError = GetLastError();
if (dwError != ERROR_FILE_NOT_FOUND && dwError != ERROR_PATH_NOT_FOUND)
{
MSILog(hInstaller, MSI_WARNING_LEVEL, L"Could not remove obsolete Start Menu shortcut '%s' (error %lu)", szShortcutPath, dwError);
}
}
}
static void CleanupVersionedVeraCryptStartMenuFolder(MSIHANDLE hInstaller, const wchar_t *szFolderPath)
{
/* Delete only known VeraCrypt-created shortcuts; keep folders with any other content. */
static const wchar_t *szShortcutNames[] =
{
L"VeraCrypt.lnk",
L"VeraCryptExpander.lnk",
L"VeraCrypt Website.url",
L"VeraCrypt User's Guide.lnk",
L"VeraCrypt User Guide.lnk",
L"Uninstall VeraCrypt.lnk"
};
for (size_t i = 0; i < ARRAYSIZE(szShortcutNames); ++i)
DeleteStartMenuShortcutIfExists(hInstaller, szFolderPath, szShortcutNames[i]);
if (RemoveDirectoryW(szFolderPath))
{
MSILog(hInstaller, MSI_INFO_LEVEL, L"Removed obsolete Start Menu folder '%s'", szFolderPath);
}
else
{
DWORD dwError = GetLastError();
if (dwError == ERROR_DIR_NOT_EMPTY)
{
MSILog(hInstaller, MSI_INFO_LEVEL, L"Obsolete Start Menu folder '%s' was left in place because it contains non-VeraCrypt items", szFolderPath);
}
else if (dwError != ERROR_FILE_NOT_FOUND && dwError != ERROR_PATH_NOT_FOUND)
{
MSILog(hInstaller, MSI_WARNING_LEVEL, L"Could not remove obsolete Start Menu folder '%s' (error %lu)", szFolderPath, dwError);
}
}
}
static void CleanupVersionedVeraCryptStartMenuFoldersInRoot(MSIHANDLE hInstaller, const wchar_t *szProgramMenuFolder)
{
wchar_t szSearchPath[TC_MAX_PATH];
WIN32_FIND_DATAW findData;
HANDLE hFind;
if (!szProgramMenuFolder || szProgramMenuFolder[0] == L'\0')
return;
if (!JoinPath(szSearchPath, sizeof(szSearchPath), szProgramMenuFolder, L"VeraCrypt *"))
{
MSILog(hInstaller, MSI_WARNING_LEVEL, L"Could not build obsolete Start Menu folder search path for '%s'", szProgramMenuFolder);
return;
}
hFind = FindFirstFileW(szSearchPath, &findData);
if (hFind == INVALID_HANDLE_VALUE)
{
DWORD dwError = GetLastError();
if (dwError != ERROR_FILE_NOT_FOUND && dwError != ERROR_PATH_NOT_FOUND)
{
MSILog(hInstaller, MSI_WARNING_LEVEL, L"Could not search obsolete Start Menu folders in '%s' (error %lu)", szProgramMenuFolder, dwError);
}
return;
}
do
{
if ((findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
&& IsVersionedVeraCryptStartMenuFolderName(findData.cFileName))
{
wchar_t szFolderPath[TC_MAX_PATH];
if (JoinPath(szFolderPath, sizeof(szFolderPath), szProgramMenuFolder, findData.cFileName))
CleanupVersionedVeraCryptStartMenuFolder(hInstaller, szFolderPath);
else
MSILog(hInstaller, MSI_WARNING_LEVEL, L"Could not build obsolete Start Menu folder path for '%s'", findData.cFileName);
}
}
while (FindNextFileW(hFind, &findData));
FindClose(hFind);
}
static void CleanupVersionedVeraCryptStartMenuFolders(MSIHANDLE hInstaller, const wchar_t *szProgramMenuFolder)
{
wchar_t szCommonPrograms[TC_MAX_PATH];
CleanupVersionedVeraCryptStartMenuFoldersInRoot(hInstaller, szProgramMenuFolder);
if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_COMMON_PROGRAMS, NULL, SHGFP_TYPE_CURRENT, szCommonPrograms)))
CleanupVersionedVeraCryptStartMenuFoldersInRoot(hInstaller, szCommonPrograms);
}
EXTERN_C UINT STDAPICALLTYPE VC_CustomAction_CleanupOldStartMenuFolders(MSIHANDLE hInstaller)
{
std::wstring szValueBuf = L"";
std::wstring szProgramMenuFolder = L"";
DWORD cchValueBuf = 0;
UINT uiStat = 0;
MSILog(hInstaller, MSI_INFO_LEVEL, L"Begin VC_CustomAction_CleanupOldStartMenuFolders");
uiStat = MsiGetProperty(hInstaller, TEXT("CustomActionData"), (LPWSTR)TEXT(""), &cchValueBuf);
if (ERROR_MORE_DATA == uiStat)
{
++cchValueBuf; // add 1 for null termination
szValueBuf.resize(cchValueBuf);
uiStat = MsiGetProperty(hInstaller, TEXT("CustomActionData"), &szValueBuf[0], &cchValueBuf);
if (ERROR_SUCCESS == uiStat)
{
MSILog(hInstaller, MSI_INFO_LEVEL, L"VC_CustomAction_CleanupOldStartMenuFolders: CustomActionData = '%s'", szValueBuf.c_str());
std::vector<std::wstring> szTokens;
Tokenize(szValueBuf.c_str(), szTokens);
for (size_t i = 0; i < szTokens.size(); i++)
{
std::wstring szToken = szTokens[i];
if (wcsncmp(szToken.c_str(), L"PROGRAMMENUFOLDER=", wcslen(L"PROGRAMMENUFOLDER=")) == 0)
{
size_t index0 = szToken.find_first_of(L"=");
if (index0 != std::wstring::npos)
{
szProgramMenuFolder = szToken.substr(index0 + 1);
MSILog(hInstaller, MSI_INFO_LEVEL, L"VC_CustomAction_CleanupOldStartMenuFolders: PROGRAMMENUFOLDER = '%s'", szProgramMenuFolder.c_str());
}
}
}
}
}
CleanupVersionedVeraCryptStartMenuFolders(hInstaller, szProgramMenuFolder.c_str());
MSILog(hInstaller, MSI_INFO_LEVEL, L"End VC_CustomAction_CleanupOldStartMenuFolders");
return ERROR_SUCCESS;
}
/*
* Same as Setup.c, function DoInstall(), but
* without the actual installation, it only prepares the system
@@ -2387,13 +2609,22 @@ EXTERN_C UINT STDAPICALLTYPE VC_CustomAction_PostInstall(MSIHANDLE hInstaller)
if ((ERROR_SUCCESS == uiStat))
{
MSILog(hInstaller, MSI_INFO_LEVEL, L"VC_CustomAction_PostInstall: CustomActionData = '%s'", szValueBuf.c_str());
if (wcsncmp(szValueBuf.c_str(), L"INSTALLDIR=", wcslen(L"INSTALLDIR=")) == 0)
std::vector<std::wstring> szTokens;
Tokenize(szValueBuf.c_str(), szTokens);
for (size_t i = 0; i < szTokens.size(); i++)
{
size_t index0 = szValueBuf.find_first_of(L"=");
if (index0 != std::wstring::npos)
std::wstring szToken = szTokens[i];
if (wcsncmp(szToken.c_str(), L"INSTALLDIR=", wcslen(L"INSTALLDIR=")) == 0)
{
szInstallDir = szValueBuf.substr(index0 + 1);
MSILog(hInstaller, MSI_INFO_LEVEL, L"VC_CustomAction_PostInstall: INSTALLDIR = '%s'", szInstallDir.c_str());
size_t index0 = szToken.find_first_of(L"=");
if (index0 != std::wstring::npos)
{
szInstallDir = szToken.substr(index0 + 1);
MSILog(hInstaller, MSI_INFO_LEVEL, L"VC_CustomAction_PostInstall: INSTALLDIR = '%s'", szInstallDir.c_str());
}
}
}
}

Some files were not shown because too many files have changed in this diff Show More