1111 PartitionModification ,
1212)
1313from archinstall .lib .translationhandler import tr
14- from archinstall .tui .curses_menu import SelectMenu
14+ from archinstall .tui .curses_menu import EditMenu , SelectMenu
1515from archinstall .tui .menu_item import MenuItem , MenuItemGroup
1616from archinstall .tui .result import ResultType
1717from archinstall .tui .types import Alignment , FrameProperties
1818
1919from ..menu .abstract_menu import AbstractSubMenu
20- from ..models .device_model import Fido2Device
20+ from ..models .device_model import DEFAULT_ITER_TIME , Fido2Device
2121from ..models .users import Password
2222from ..output import FormattedOutput
2323from ..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 = select_iteration_time ,
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,15 @@ 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+ enc_type = self ._item_group .find_by_key ('encryption_type' ).value
233+
234+ if iter_time and enc_type != EncryptionType .NoEncryption :
235+ return f'{ tr ("Iteration time" )} : { iter_time } ms'
236+
237+ return None
238+
217239
218240def select_encryption_type (
219241 device_modifications : list [DeviceModification ],
@@ -354,3 +376,42 @@ def select_lvm_vols_to_encrypt(
354376 return volumes
355377
356378 return []
379+
380+
381+ def select_iteration_time (preset : int | None = None ) -> int | None :
382+ header = tr ('Enter iteration time for LUKS encryption (in milliseconds)' ) + '\n '
383+ header += tr ('Higher values increase security but slow down boot time' ) + '\n '
384+ header += tr (f'Default: { DEFAULT_ITER_TIME } ms, Recommended range: 1000-60000' ) + '\n '
385+
386+ def validate_iter_time (value : str | None ) -> str | None :
387+ if not value :
388+ return None
389+
390+ try :
391+ iter_time = int (value )
392+ if iter_time < 100 :
393+ return tr ('Iteration time must be at least 100ms' )
394+ if iter_time > 120000 :
395+ return tr ('Iteration time must be at most 120000ms' )
396+ return None
397+ except ValueError :
398+ return tr ('Please enter a valid number' )
399+
400+ result = EditMenu (
401+ tr ('Iteration time' ),
402+ header = header ,
403+ alignment = Alignment .CENTER ,
404+ allow_skip = True ,
405+ default_text = str (preset ) if preset else str (DEFAULT_ITER_TIME ),
406+ validator = validate_iter_time ,
407+ ).input ()
408+
409+ match result .type_ :
410+ case ResultType .Skip :
411+ return preset
412+ case ResultType .Selection :
413+ if not result .text ():
414+ return preset
415+ return int (result .text ())
416+ case ResultType .Reset :
417+ return None
0 commit comments