qmk_firmware/quantum/secure.c

88 lines
2.0 KiB
C
Raw Normal View History

2022-04-10 23:43:18 +00:00
// Copyright 2022 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include "secure.h"
#include "timer.h"
#ifndef SECURE_UNLOCK_TIMEOUT
# define SECURE_UNLOCK_TIMEOUT 5000
#endif
#ifndef SECURE_IDLE_TIMEOUT
# define SECURE_IDLE_TIMEOUT 60000
#endif
2022-04-11 00:59:48 +00:00
#ifndef SECURE_UNLOCK_SEQUENCE
# define SECURE_UNLOCK_SEQUENCE \
{ \
{ 0, 0 } \
2022-04-11 00:59:48 +00:00
}
#endif
2022-04-10 23:43:18 +00:00
secure_status_t secure_status = SECURE_LOCKED;
static uint32_t unlock_time = 0;
static uint32_t idle_time = 0;
secure_status_t secure_get_status(void) {
return secure_status;
}
void secure_lock(void) {
secure_status = SECURE_LOCKED;
}
void secure_unlock(void) {
secure_status = SECURE_UNLOCKED;
idle_time = timer_read32();
}
void secure_request_unlock(void) {
if (secure_status == SECURE_LOCKED) {
secure_status = SECURE_PENDING;
unlock_time = timer_read32();
}
}
2022-04-11 01:14:19 +00:00
void secure_activity_event(void) {
if (secure_status == SECURE_UNLOCKED) {
idle_time = timer_read32();
}
}
2022-04-10 23:43:18 +00:00
void secure_keypress_event(uint8_t row, uint8_t col) {
2022-04-11 00:59:48 +00:00
static const uint8_t sequence[][2] = SECURE_UNLOCK_SEQUENCE;
2022-04-12 00:49:30 +00:00
static const uint8_t sequence_len = sizeof(sequence) / sizeof(sequence[0]);
2022-04-11 00:59:48 +00:00
2022-04-12 00:49:30 +00:00
static uint8_t offset = 0;
2022-04-11 00:59:48 +00:00
if ((sequence[offset][0] == row) && (sequence[offset][1] == col)) {
2022-04-12 00:49:30 +00:00
offset++;
if (offset == sequence_len) {
offset = 0;
2022-04-12 12:53:12 +00:00
secure_unlock();
2022-04-12 00:49:30 +00:00
}
2022-04-11 00:59:48 +00:00
} else {
2022-04-12 00:49:30 +00:00
offset = 0;
2022-04-11 00:59:48 +00:00
secure_lock();
}
2022-04-10 23:43:18 +00:00
}
void secure_task(void) {
#if SECURE_UNLOCK_TIMEOUT != 0
// handle unlock timeout
if (secure_status == SECURE_PENDING) {
if (timer_elapsed32(unlock_time) >= SECURE_UNLOCK_TIMEOUT) {
secure_lock();
}
}
#endif
#if SECURE_IDLE_TIMEOUT != 0
// handle idle timeout
if (secure_status == SECURE_UNLOCKED) {
if (timer_elapsed32(idle_time) >= SECURE_IDLE_TIMEOUT) {
secure_lock();
}
}
#endif
}