mirror of
https://github.com/veracrypt/VeraCrypt.git
synced 2026-08-30 12:47:02 +00:00
Compare commits
26
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f9089b0202 | ||
|
|
4ad36447b2 | ||
|
|
9b20099255 | ||
|
|
d0bc546614 | ||
|
|
6774de941d | ||
|
|
5d7a2a78b8 | ||
|
|
0190270f9d | ||
|
|
3c771c07fc | ||
|
|
a173a11cfe | ||
|
|
66ddd29c91 | ||
|
|
0d86b9b3e6 | ||
|
|
5bd9277970 | ||
|
|
854f85f013 | ||
|
|
fc2efd0b8f | ||
|
|
d1f73ce429 | ||
|
|
79bee911be | ||
|
|
1fd2fb06cd | ||
|
|
c3ce2db9ac | ||
|
|
c4acb6a0be | ||
|
|
b97b0f2c06 | ||
|
|
21f773cd6d | ||
|
|
aaffec8b5c | ||
|
|
4f71883ac1 | ||
|
|
964ecde6a1 | ||
|
|
86082f3bf5 | ||
|
|
1f256ae3f2 |
@@ -4,6 +4,10 @@
|
||||
# CLion
|
||||
.idea/
|
||||
|
||||
# Python build/test artifacts
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
|
||||
# VC Linux build artifacts
|
||||
*.o
|
||||
*.o0
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<entry lang="nb" key="IDC_BROWSE">Bla &gjennom...</entry>
|
||||
<entry lang="nb" key="IDC_DESKTOP_ICON">Legg til VeraCrypt-ikon på &skrivebordet</entry>
|
||||
<entry lang="nb" key="IDC_DONATE">Doner nå...</entry>
|
||||
<entry lang="nb" key="IDC_FILE_TYPE">Assosier .hc-fil&utvidelsen med VeraCrypt</entry>
|
||||
<entry lang="nb" key="IDC_FILE_TYPE">Tilknytt .hc-filutvidelsen &med VeraCrypt</entry>
|
||||
<entry lang="nb" key="IDC_OPEN_CONTAINING_FOLDER">&Åpne målplasseringen når ferdig</entry>
|
||||
<entry lang="nb" key="IDC_PROG_GROUP">Legg til VeraCrypt i &Start-menyen</entry>
|
||||
<entry lang="nb" key="IDC_SYSTEM_RESTORE">Opprett system&gjenopprettingspunkt</entry>
|
||||
@@ -29,7 +29,7 @@
|
||||
<entry lang="nb" key="IDC_CIPHER_TEST">&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&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">&Lukk token sesjon (logg ut) etter at et volum er montert</entry>
|
||||
<entry lang="nb" key="IDC_CLOSE_TOKEN_SESSION_AFTER_MOUNT">&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&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 &hurtigtasten 'Monter favorittvolumer' trykkes</entry>
|
||||
<entry lang="nb" key="IDC_FAVORITE_MOUNT_ON_ARRIVAL">Monter valgt volum når dets vertsenhet blir &tilkoblet</entry>
|
||||
<entry lang="nb" key="IDC_FAVORITE_MOUNT_ON_LOGON">Monter valgt volum ved pålog&ning</entry>
|
||||
<entry lang="nb" key="IDC_FAVORITE_MOUNT_ON_LOGON">Monter valgt volum ved påloggi&ng</entry>
|
||||
<entry lang="nb" key="IDC_FAVORITE_MOUNT_READONLY">Monter valgt volum som skrivebeskytt&et</entry>
|
||||
<entry lang="nb" key="IDC_FAVORITE_MOUNT_REMOVABLE">Monter valgt volum som fjern&bart medium</entry>
|
||||
<entry lang="nb" key="IDC_FAVORITE_MOVE_DOWN">Flytt &ned</entry>
|
||||
@@ -135,8 +135,8 @@
|
||||
<entry lang="nb" key="IDC_FAVORITE_REMOVE">&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&het...</entry>
|
||||
<entry lang="nb" key="IDC_SELECT_FILE">Velg &Fil...</entry>
|
||||
<entry lang="nb" key="IDC_SELECT_PKCS11_MODULE">Velg &Bibliotek...</entry>
|
||||
<entry lang="nb" key="IDC_SELECT_FILE">Velg &fil...</entry>
|
||||
<entry lang="nb" key="IDC_SELECT_PKCS11_MODULE">Velg &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 &Filutforsker-vindu for montert volum</entry>
|
||||
<entry lang="nb" key="IDC_TRAV_CACHE_PASSWORDS">&Mellomlagre passord i driverminne</entry>
|
||||
<entry lang="nb" key="IDC_TRUECRYPT_MODE">&TrueCrypt-modus</entry>
|
||||
<entry lang="nb" key="IDC_UNMOUNTALL">Demonter &Alle</entry>
|
||||
<entry lang="nb" key="IDC_UNMOUNTALL">Demonter &alle</entry>
|
||||
<entry lang="nb" key="IDC_VOLUME_PROPERTIES">&Volumegenskaper...</entry>
|
||||
<entry lang="nb" key="IDC_VOLUME_TOOLS">&Volumverktøy...</entry>
|
||||
<entry lang="nb" key="IDC_WIPE_CACHE">&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 &Sti...</entry>
|
||||
<entry lang="nb" key="IDC_ADD_KEYFILE_PATH">Legg til &sti...</entry>
|
||||
<entry lang="nb" key="IDC_AUTO">&Autotest alle</entry>
|
||||
<entry lang="nb" key="IDC_CONTINUE">&Fortsett</entry>
|
||||
<entry lang="nb" key="IDC_DECRYPT">&Dekrypter</entry>
|
||||
<entry lang="nb" key="IDC_DELETE">&Slett</entry>
|
||||
<entry lang="nb" key="IDC_ENCRYPT">&Krypter</entry>
|
||||
<entry lang="nb" key="IDC_EXPORT">&Eksport...</entry>
|
||||
<entry lang="nb" key="IDC_EXPORT">&Eksporter...</entry>
|
||||
<entry lang="nb" key="IDC_GENERATE_AND_SAVE_KEYFILE">Generer og lagre nøkkelfil...</entry>
|
||||
<entry lang="nb" key="IDC_GENERATE_KEYFILE">&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">&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' > '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 & slett mellomlager</entry>
|
||||
<entry lang="nb" key="HK_FORCE_UNMOUNT_ALL_AND_WIPE">Tving demontering av alle & slett mellomlager</entry>
|
||||
<entry lang="nb" key="HK_FORCE_UNMOUNT_ALL_AND_WIPE_AND_EXIT">Tving demontering av alle, slett mellomlager & 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 på 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>
|
||||
|
||||
@@ -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.
@@ -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>
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -62,7 +62,8 @@ In such situations, the issue can be solved by disabling VeraCrypt waiting dialo
|
||||
by selecting <em>System</em> > <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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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> </p>
|
||||
<p><a href="Hidden%20Operating%20System.html" style="text-align:left; color:#0080c0; text-decoration:none; font-weight:bold">Next Section >></a></p>
|
||||
</div>
|
||||
|
||||
@@ -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>> <em>Organize System Favorite Volumes</em>, select the volume, click
|
||||
|
||||
@@ -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> > <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> > <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.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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
|
||||
|
||||
@@ -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))
|
||||
Executable
+452
@@ -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\""
|
||||
Executable
+864
@@ -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)
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
@@ -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 ()
|
||||
{
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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);
|
||||
|
||||
@@ -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));
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
|
||||
#if defined(__AVX2__)
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
#include "blake2/blake2b.h"
|
||||
#include "blake2/blamka-round-opt.h"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -155,6 +155,7 @@ typedef struct
|
||||
EncryptedIoQueue *Queue;
|
||||
PIRP OriginalIrp;
|
||||
BOOL Write;
|
||||
BOOL Flush;
|
||||
ULONG OriginalLength;
|
||||
LARGE_INTEGER OriginalOffset;
|
||||
NTSTATUS Status;
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -511,12 +511,18 @@ copy $(TargetPath) "..\Debug\Setup Files\VeraCrypt Format-arm64.exe" >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" >NUL:
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
</Project>
|
||||
</Project>
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
};
|
||||
|
||||
[
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 (...)
|
||||
|
||||
@@ -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");
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -29,6 +29,7 @@ namespace VeraCrypt
|
||||
SyncEvent ();
|
||||
~SyncEvent ();
|
||||
|
||||
void Reset ();
|
||||
void Signal ();
|
||||
void Wait ();
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -41,6 +41,14 @@ namespace VeraCrypt
|
||||
Initialized = false;
|
||||
}
|
||||
|
||||
void SyncEvent::Reset ()
|
||||
{
|
||||
assert (Initialized);
|
||||
|
||||
ScopeLock lock (EventMutex);
|
||||
Signaled = false;
|
||||
}
|
||||
|
||||
void SyncEvent::Signal ()
|
||||
{
|
||||
assert (Initialized);
|
||||
|
||||
@@ -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 -->
|
||||
|
||||
|
||||
@@ -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.
@@ -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
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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" "$@"
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
@@ -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
|
||||
|
||||
@@ -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
@@ -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
Reference in New Issue
Block a user