#include "configuration.h" #ifdef MESHTASTIC_LOCKDOWN #include "LockdownDisplay.h" #ifdef MESHTASTIC_ENCRYPTED_STORAGE #include "security/EncryptedStorage.h" #endif #include namespace meshtastic_security { // Screen-lock latch. Set when the display powers off (idle timeout etc.), // cleared only when a client authenticates with the passphrase. Separate // from storage-lock state: the device keeps routing while this is set, // only the display is gated. // // Initialised to true so that even a token-auto-unlocked cold boot comes // up with a redacted screen. Otherwise an attacker holding a screen-locked // device could simply power-cycle it (RAM latch resets) to get back to a // content screen. Operator must authenticate from a client to reveal // content after any boot. // // std::atomic so cross-task reads (PowerFSM / Screen / InputBroker) see // writes immediately and the compiler is not free to speculate the load. // Plain bool happens to work on single-core Cortex-M4 today but breaks // silently the moment lockdown ports to ESP32 / RP2040 / LTO whole-program // elision. static std::atomic s_screenLocked{true}; bool shouldRedactDisplay() { #ifdef MESHTASTIC_ENCRYPTED_STORAGE // Lockdown not active (capable build, never provisioned or disabled): // never redact the display - behave like stock firmware. if (!EncryptedStorage::isLockdownActive()) return false; if (!EncryptedStorage::isUnlocked()) return true; #endif return s_screenLocked.load(std::memory_order_relaxed); } void lockScreen() { s_screenLocked.store(true, std::memory_order_relaxed); } void unlockScreen() { s_screenLocked.store(false, std::memory_order_relaxed); } } // namespace meshtastic_security #endif // MESHTASTIC_LOCKDOWN