diff --git a/src/nitrokey/trussed/admin_app.py b/src/nitrokey/trussed/admin_app.py index fba9c2e..c051cee 100644 --- a/src/nitrokey/trussed/admin_app.py +++ b/src/nitrokey/trussed/admin_app.py @@ -30,6 +30,7 @@ class AdminCommand(Enum): SET_CONFIG = 0x83 FACTORY_RESET = 0x84 FACTORY_RESET_APP = 0x85 + LIST_AVAILABLE_CONFIG = 0x86 def is_legacy_command(self) -> bool: if self == AdminCommand.UPDATE: @@ -150,6 +151,21 @@ def check(cls, i: int, msg: str) -> None: raise Exception(f"{msg}: {error}") +class ConfigField: + name: str + requires_touch: bool + requires_reboot: bool + destructive: bool + + def __init__( + self, name: str, requires_touch: bool, requires_reboot: bool, destructive: bool + ): + self.name = name + self.requires_touch = requires_touch + self.requires_reboot = requires_reboot + self.destructive = destructive + + class AdminApp: def __init__(self, device: TrussedDevice) -> None: self.device = device @@ -266,6 +282,22 @@ def set_config(self, key: str, value: str) -> None: assert reply ConfigStatus.check(reply[0], "Failed to set config value") + def list_available_config(self) -> list[ConfigField]: + reply = self._call(AdminCommand.LIST_AVAILABLE_CONFIG) + parsed = cbor.decode(reply) + print(parsed) + ret = [] + for field in parsed: + ret.append( + ConfigField( + field["name"], + field["requires_touch"], + field["requires_reboot"], + field["destructive"], + ) + ) + return ret + def factory_reset(self) -> bool: try: reply = self._call(AdminCommand.FACTORY_RESET, response_len=1)