secure.c (2411B)
1 // Copyright 2022 QMK 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 4 #include "secure.h" 5 #include "timer.h" 6 #include "util.h" 7 8 #ifndef SECURE_UNLOCK_TIMEOUT 9 # define SECURE_UNLOCK_TIMEOUT 5000 10 #endif 11 12 #ifndef SECURE_IDLE_TIMEOUT 13 # define SECURE_IDLE_TIMEOUT 60000 14 #endif 15 16 #ifndef SECURE_UNLOCK_SEQUENCE 17 # define SECURE_UNLOCK_SEQUENCE {{0, 0}} 18 #endif 19 20 static secure_status_t secure_status = SECURE_LOCKED; 21 static uint32_t unlock_time = 0; 22 static uint32_t idle_time = 0; 23 24 static void secure_hook(secure_status_t secure_status) { 25 secure_hook_quantum(secure_status); 26 secure_hook_kb(secure_status); 27 } 28 29 secure_status_t secure_get_status(void) { 30 return secure_status; 31 } 32 33 void secure_lock(void) { 34 secure_status = SECURE_LOCKED; 35 secure_hook(secure_status); 36 } 37 38 void secure_unlock(void) { 39 secure_status = SECURE_UNLOCKED; 40 idle_time = timer_read32(); 41 secure_hook(secure_status); 42 } 43 44 void secure_request_unlock(void) { 45 if (secure_status == SECURE_LOCKED) { 46 secure_status = SECURE_PENDING; 47 unlock_time = timer_read32(); 48 } 49 secure_hook(secure_status); 50 } 51 52 void secure_activity_event(void) { 53 if (secure_status == SECURE_UNLOCKED) { 54 idle_time = timer_read32(); 55 } 56 } 57 58 void secure_keypress_event(uint8_t row, uint8_t col) { 59 static const uint8_t sequence[][2] = SECURE_UNLOCK_SEQUENCE; 60 static const uint8_t sequence_len = ARRAY_SIZE(sequence); 61 62 static uint8_t offset = 0; 63 if ((sequence[offset][0] == row) && (sequence[offset][1] == col)) { 64 offset++; 65 if (offset == sequence_len) { 66 offset = 0; 67 secure_unlock(); 68 } 69 } else { 70 offset = 0; 71 secure_lock(); 72 } 73 } 74 75 void secure_task(void) { 76 #if SECURE_UNLOCK_TIMEOUT != 0 77 // handle unlock timeout 78 if (secure_status == SECURE_PENDING) { 79 if (timer_elapsed32(unlock_time) >= SECURE_UNLOCK_TIMEOUT) { 80 secure_lock(); 81 } 82 } 83 #endif 84 85 #if SECURE_IDLE_TIMEOUT != 0 86 // handle idle timeout 87 if (secure_status == SECURE_UNLOCKED) { 88 if (timer_elapsed32(idle_time) >= SECURE_IDLE_TIMEOUT) { 89 secure_lock(); 90 } 91 } 92 #endif 93 } 94 95 __attribute__((weak)) bool secure_hook_user(secure_status_t secure_status) { 96 return true; 97 } 98 __attribute__((weak)) bool secure_hook_kb(secure_status_t secure_status) { 99 return secure_hook_user(secure_status); 100 }