Skip to content

Commit 359a0d8

Browse files
committed
Added User Interface to change iteration time for LUKS encryption
1 parent 1945973 commit 359a0d8

5 files changed

Lines changed: 111 additions & 4 deletions

File tree

archinstall/lib/disk/device_handler.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
from ..general import SysCommand, SysCommandWorker
1515
from ..luks import Luks2
1616
from ..models.device_model import (
17+
DEFAULT_ITER_TIME,
1718
BDevice,
1819
BtrfsMountOption,
1920
DeviceModification,
@@ -308,14 +309,15 @@ def encrypt(
308309
mapper_name: str | None,
309310
enc_password: Password | None,
310311
lock_after_create: bool = True,
312+
iter_time: int = DEFAULT_ITER_TIME,
311313
) -> Luks2:
312314
luks_handler = Luks2(
313315
dev_path,
314316
mapper_name=mapper_name,
315317
password=enc_password,
316318
)
317319

318-
key_file = luks_handler.encrypt()
320+
key_file = luks_handler.encrypt(iter_time=iter_time)
319321

320322
self.udev_sync()
321323

@@ -346,7 +348,7 @@ def format_encrypted(
346348
password=enc_conf.encryption_password,
347349
)
348350

349-
key_file = luks_handler.encrypt()
351+
key_file = luks_handler.encrypt(iter_time=enc_conf.iter_time)
350352

351353
self.udev_sync()
352354

archinstall/lib/disk/encryption_menu.py

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
from archinstall.tui.types import Alignment, FrameProperties
1818

1919
from ..menu.abstract_menu import AbstractSubMenu
20-
from ..models.device_model import Fido2Device
20+
from ..models.device_model import DEFAULT_ITER_TIME, Fido2Device
2121
from ..models.users import Password
2222
from ..output import FormattedOutput
2323
from ..utils.util import get_password
@@ -65,6 +65,14 @@ def _define_menu_options(self) -> list[MenuItem]:
6565
preview_action=self._preview,
6666
key='encryption_password',
6767
),
68+
MenuItem(
69+
text=tr('Iteration time'),
70+
action=lambda x: select_iteration_time(x),
71+
value=self._enc_config.iter_time,
72+
dependencies=[self._check_dep_enc_type],
73+
preview_action=self._preview,
74+
key='iter_time',
75+
),
6876
MenuItem(
6977
text=tr('Partitions'),
7078
action=lambda x: select_partitions_to_encrypt(self._device_modifications, x),
@@ -120,6 +128,7 @@ def run(self, additional_title: str | None = None) -> DiskEncryption | None:
120128

121129
enc_type: EncryptionType | None = self._item_group.find_by_key('encryption_type').value
122130
enc_password: Password | None = self._item_group.find_by_key('encryption_password').value
131+
iter_time: int | None = self._item_group.find_by_key('iter_time').value
123132
enc_partitions = self._item_group.find_by_key('partitions').value
124133
enc_lvm_vols = self._item_group.find_by_key('lvm_volumes').value
125134

@@ -140,6 +149,7 @@ def run(self, additional_title: str | None = None) -> DiskEncryption | None:
140149
partitions=enc_partitions,
141150
lvm_volumes=enc_lvm_vols,
142151
hsm_device=self._enc_config.hsm_device,
152+
iter_time=iter_time or DEFAULT_ITER_TIME,
143153
)
144154

145155
return None
@@ -153,6 +163,9 @@ def _preview(self, item: MenuItem) -> str | None:
153163
if (enc_pwd := self._prev_password()) is not None:
154164
output += f'\n{enc_pwd}'
155165

166+
if (iter_time := self._prev_iter_time()) is not None:
167+
output += f'\n{iter_time}'
168+
156169
if (fido_device := self._prev_hsm()) is not None:
157170
output += f'\n{fido_device}'
158171

@@ -214,6 +227,14 @@ def _prev_hsm(self) -> str | None:
214227
output += f' ({fido_device.manufacturer}, {fido_device.product})'
215228
return f'{tr("HSM device")}: {output}'
216229

230+
def _prev_iter_time(self) -> str | None:
231+
iter_time = self._item_group.find_by_key('iter_time').value
232+
233+
if iter_time and iter_time != DEFAULT_ITER_TIME:
234+
return f'{tr("Iteration time")}: {iter_time}ms'
235+
236+
return None
237+
217238

218239
def select_encryption_type(
219240
device_modifications: list[DeviceModification],
@@ -354,3 +375,50 @@ def select_lvm_vols_to_encrypt(
354375
return volumes
355376

356377
return []
378+
379+
380+
def select_iteration_time(preset: int | None = None) -> int | None:
381+
header = tr('Enter iteration time for LUKS encryption (in milliseconds)') + '\n'
382+
header += tr('Higher values increase security but slow down boot time') + '\n'
383+
header += tr(f'Default: {DEFAULT_ITER_TIME}ms, Recommended range: 1000-60000') + '\n'
384+
385+
def validate_iter_time(value: str | None) -> str | None:
386+
if not value:
387+
return tr('Iteration time cannot be empty')
388+
389+
try:
390+
iter_time = int(value)
391+
if iter_time < 100:
392+
return tr('Iteration time must be at least 100ms')
393+
if iter_time > 120000:
394+
return tr('Iteration time must be at most 120000ms')
395+
return None
396+
except ValueError:
397+
return tr('Please enter a valid number')
398+
399+
try:
400+
from archinstall.tui.curses_menu import EditMenu
401+
from archinstall.tui.result import ResultType
402+
from archinstall.tui.types import Alignment
403+
404+
result = EditMenu(
405+
tr('Iteration time (ms)'),
406+
header=header,
407+
alignment=Alignment.CENTER,
408+
allow_skip=True,
409+
default_text=str(preset) if preset else str(DEFAULT_ITER_TIME),
410+
validator=validate_iter_time,
411+
).input()
412+
413+
match result.type_:
414+
case ResultType.Skip:
415+
return preset
416+
case ResultType.Selection:
417+
if not result.text():
418+
return preset
419+
return int(result.text())
420+
case ResultType.Reset:
421+
return None
422+
except ImportError:
423+
# Fallback for non-interactive mode
424+
return preset or DEFAULT_ITER_TIME

archinstall/lib/disk/filesystem.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,7 @@ def _encrypt_lvm_vols(
287287
vol.mapper_name,
288288
enc_config.encryption_password,
289289
lock_after_create,
290+
iter_time=enc_config.iter_time,
290291
)
291292

292293
enc_vols[vol] = luks_handler
@@ -317,6 +318,7 @@ def _encrypt_partitions(
317318
part_mod.mapper_name,
318319
enc_config.encryption_password,
319320
lock_after_create=lock_after_create,
321+
iter_time=enc_config.iter_time,
320322
)
321323

322324
enc_mods[part_mod] = luks_handler

archinstall/lib/models/device_model.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from ..output import debug
2020

2121
ENC_IDENTIFIER = 'ainst'
22-
22+
DEFAULT_ITER_TIME = 10000
2323

2424
class DiskLayoutType(Enum):
2525
Default = 'default_layout'
@@ -1471,6 +1471,7 @@ class _DiskEncryptionSerialization(TypedDict):
14711471
partitions: list[str]
14721472
lvm_volumes: list[str]
14731473
hsm_device: NotRequired[_Fido2DeviceSerialization]
1474+
iter_time: NotRequired[int]
14741475

14751476

14761477
@dataclass
@@ -1480,6 +1481,7 @@ class DiskEncryption:
14801481
partitions: list[PartitionModification] = field(default_factory=list)
14811482
lvm_volumes: list[LvmVolume] = field(default_factory=list)
14821483
hsm_device: Fido2Device | None = None
1484+
iter_time: int = DEFAULT_ITER_TIME
14831485

14841486
def __post_init__(self) -> None:
14851487
if self.encryption_type in [EncryptionType.Luks, EncryptionType.LvmOnLuks] and not self.partitions:
@@ -1504,6 +1506,9 @@ def json(self) -> _DiskEncryptionSerialization:
15041506
if self.hsm_device:
15051507
obj['hsm_device'] = self.hsm_device.json()
15061508

1509+
if self.iter_time != DEFAULT_ITER_TIME: # Only include if not default
1510+
obj['iter_time'] = self.iter_time
1511+
15071512
return obj
15081513

15091514
@classmethod
@@ -1559,6 +1564,9 @@ def parse_arg(
15591564
if hsm := disk_encryption.get('hsm_device', None):
15601565
enc.hsm_device = Fido2Device.parse_arg(hsm)
15611566

1567+
if iter_time := disk_encryption.get('iter_time', None):
1568+
enc.iter_time = iter_time
1569+
15621570
return enc
15631571

15641572

archinstall/locales/base.pot

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -959,6 +959,33 @@ msgstr ""
959959
msgid "Encryption type"
960960
msgstr ""
961961

962+
msgid "Iteration time"
963+
msgstr ""
964+
965+
msgid "Enter iteration time for LUKS encryption (in milliseconds)"
966+
msgstr ""
967+
968+
msgid "Higher values increase security but slow down boot time"
969+
msgstr ""
970+
971+
msgid "Default: 10000ms, Recommended range: 1000-60000"
972+
msgstr ""
973+
974+
msgid "Iteration time (ms)"
975+
msgstr ""
976+
977+
msgid "Iteration time cannot be empty"
978+
msgstr ""
979+
980+
msgid "Iteration time must be at least 100ms"
981+
msgstr ""
982+
983+
msgid "Iteration time must be at most 120000ms"
984+
msgstr ""
985+
986+
msgid "Please enter a valid number"
987+
msgstr ""
988+
962989
msgid "Partitions"
963990
msgstr ""
964991

0 commit comments

Comments
 (0)