Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/board/system76/common/include/board/options.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ enum {
OPT_ALLOW_BAT_BOOST,
OPT_ALWAYS_ON_USB,
OPT_GPU_MUX_CTRL,
OPT_KB_PRIVACY,
OPT_KB_PRIVACY_MAX_DELAY_MS,
NUM_OPTIONS
};

Expand Down
31 changes: 28 additions & 3 deletions src/board/system76/common/kbc.c
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
// SPDX-License-Identifier: GPL-3.0-only

#include "include/board/options.h"
#include <arch/delay.h>
#include <arch/time.h>
#include <board/kbc.h>
#include <board/kbscan.h>
#include <board/keymap.h>
#include <common/debug.h>
#include <common/macro.h>
#include <common/rng.h>
#include <ec/espi.h>
#include <ec/ps2.h>

Expand Down Expand Up @@ -80,10 +83,13 @@ static const uint16_t kbc_typematic_period[32] = {
};
// clang-format on

static uint8_t kbc_buffer[16] = { 0 };
static uint8_t kbc_buffer[32] = { 0 };
static uint8_t kbc_buffer_head = 0;
static uint8_t kbc_buffer_tail = 0;

static bool kbc_buffer_privacy = false;
static uint8_t kbc_buffer_privacy_next_time = 0;

static bool kbc_buffer_pop(uint8_t *scancode) {
if (kbc_buffer_head == kbc_buffer_tail) {
return false;
Expand Down Expand Up @@ -459,8 +465,23 @@ void kbc_event(struct Kbc *kbc) {
uint8_t sts;

// Read from scancode buffer when possible
if (state == KBC_STATE_NORMAL && kbc_buffer_pop(&state_data)) {
state = KBC_STATE_KEYBOARD;
if (state == KBC_STATE_NORMAL) {
if (options_get(OPT_KB_PRIVACY)) {
uint8_t time = time_get();
Comment thread
mkopec marked this conversation as resolved.
Outdated
if (time >= kbc_buffer_privacy_next_time) {
TRACE("KB_Priv: dleay of %d passed\n", kbc_buffer_privacy_next_time);
if (kbc_buffer_pop(&state_data)) {
state = KBC_STATE_KEYBOARD;
kbc_buffer_privacy_next_time = time +
(uint16_t)(nondeterministic_rng() %
(uint16_t)options_get(OPT_KB_PRIVACY_MAX_DELAY_MS));
}
}
} else {
if (kbc_buffer_pop(&state_data)) {
state = KBC_STATE_KEYBOARD;
}
}
}

// Read from touchpad when possible
Expand Down Expand Up @@ -521,3 +542,7 @@ void kbc_event(struct Kbc *kbc) {
kbc_on_output_empty(kbc);
}
}

void kbc_toggle_delay_randomization() {
options_set(OPT_KB_PRIVACY, options_get(OPT_KB_PRIVACY) ^ 1);
}
9 changes: 9 additions & 0 deletions src/board/system76/common/kbscan.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
#include <board/power.h>
#include <common/macro.h>
#include <common/debug.h>
#include <common/rng.h>

// Default to not n-key rollover
#ifndef KM_NKEY
Expand Down Expand Up @@ -202,6 +203,13 @@ bool kbscan_press(uint16_t key, bool pressed, uint8_t *layer) {
pmc_swi();
}

if (key == K_KB_PRIVACY && pressed) {
DEBUG("Toggling keyboard privacy\n");
rng_seed(time_get());
kbc_toggle_delay_randomization();
return true;
}

if (key == K_FNLOCK && pressed) {
DEBUG("Toggling FnLock\n");
keymap_fnlock ^= 1;
Expand Down Expand Up @@ -316,6 +324,7 @@ static inline bool key_should_repeat(uint16_t key) {
case K_CAMERA_TOGGLE:
case K_DISPLAY_TOGGLE:
case K_FAN_TOGGLE:
case K_KB_PRIVACY:
case K_KBD_BKL:
case K_KBD_COLOR:
case K_KBD_TOGGLE:
Expand Down
2 changes: 2 additions & 0 deletions src/board/system76/common/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ uint8_t DEFAULT_OPTIONS[NUM_OPTIONS] = {
[OPT_ALLOW_BAT_BOOST] = 0,
[OPT_ALWAYS_ON_USB] = 0,
[OPT_GPU_MUX_CTRL] = 0,
[OPT_KB_PRIVACY] = 0,
[OPT_KB_PRIVACY_MAX_DELAY_MS] = 100,
};
// clang-format on

Expand Down
1 change: 1 addition & 0 deletions src/common/common.mk
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
common-y += i2c.c
common-y += keymap.c
common-y += version.c
common-y += rng.c
1 change: 1 addition & 0 deletions src/common/include/common/keymap.h
Original file line number Diff line number Diff line change
Expand Up @@ -284,5 +284,6 @@ uint16_t keymap_translate(uint16_t key);

#define KF_CUSTOM (0x0200)
#define K_FNLOCK (KF_CUSTOM | 0x01)
#define K_KB_PRIVACY (KF_CUSTOM | 0x02)

#endif // _COMMON_KEYMAP_H
12 changes: 12 additions & 0 deletions src/common/include/common/rng.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
// SPDX-License-Identifier: GPL-3.0-only

#ifndef _COMMON_RNG_H
#define _COMMON_RNG_H

#include <stdint.h>

void rng_seed(uint16_t seed);
uint16_t simple_rng(void);
uint16_t nondeterministic_rng(void);

#endif
36 changes: 36 additions & 0 deletions src/common/rng.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
// SPDX-License-Identifier: GPL-3.0-only
//
#include <common/rng.h>
#include <arch/time.h>

#define LFSR_MASK 0xB400u

static uint16_t simple_rng_reg = -1U;
static uint16_t nondeterministic_rng_reg = -1U;

void rng_seed(uint16_t seed) {
// 0 is invalid state, the generator locks up on 0
uint16_t s = seed ? seed : -1U;
simple_rng_reg = s;
nondeterministic_rng_reg = s;
}

uint16_t _galois_fsr(uint16_t lfsr) {
uint16_t bit = lfsr & 1U;
lfsr >>= 1U;
if (bit) {
lfsr ^= LFSR_MASK;
}
return lfsr;
}

uint16_t simple_rng(void) {
simple_rng_reg = _galois_fsr(simple_rng_reg);
return simple_rng_reg;
}

uint16_t nondeterministic_rng(void) {
nondeterministic_rng_reg += (uint16_t)(time_get());
nondeterministic_rng_reg = _galois_fsr(nondeterministic_rng_reg);
return nondeterministic_rng_reg;
}
2 changes: 1 addition & 1 deletion src/ec/ite/include/ec/kbc.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ uint8_t kbc_status(struct Kbc *kbc);
uint8_t kbc_read(struct Kbc *kbc);
bool kbc_keyboard(struct Kbc *kbc, uint8_t data, uint16_t timeout);
bool kbc_mouse(struct Kbc *kbc, uint8_t data, uint16_t timeout);

void kbc_toggle_delay_randomization();
volatile uint8_t __xdata __at(0x1300) KBHICR;
volatile uint8_t __xdata __at(0x1302) KBIRQR;
volatile uint8_t __xdata __at(0x1304) KBHISR;
Expand Down
4 changes: 2 additions & 2 deletions src/keyboard/system76/14in_83/keymap/combo_iso_ansi.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ LAYOUT_ISO(
),
LAYOUT_ISO(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_PAUSE, K_NUM_LOCK, K_SCROLL_LOCK,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_4, K_5, K_6, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_ASTERISK, K_MINUS, K_EQUALS, K_BKSP,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_MIC_MUTE, K_5, K_6, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_ASTERISK, K_MINUS, K_EQUALS, K_BKSP,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_NUM_4, K_NUM_5, K_NUM_6, K_NUM_SLASH, K_BRACE_OPEN, K_BRACE_CLOSE, K_ENTER,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_BACKSLASH,
K_FNLOCK, K_A, K_KB_PRIVACY, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_BACKSLASH,
K_LEFT_SHIFT, K_INT_1, K_Z, K_X, K_C, K_V, K_B, K_N, K_NUM_0, K_COMMA, K_NUM_PERIOD, K_NUM_PLUS, K_RIGHT_SHIFT,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_HOME, K_UP, K_END,
K_LEFT, K_DOWN, K_RIGHT
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ LAYOUT_ISO(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_KBD_BKL, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_PAUSE, K_NUM_LOCK, K_SCROLL_LOCK,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_MIC_MUTE, K_5, K_6, K_NUM_7, K_NUM_8, K_NUM_9, K_NUM_ASTERISK, K_MINUS, K_EQUALS, K_BKSP,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_NUM_4, K_NUM_5, K_NUM_6, K_NUM_SLASH, K_BRACE_OPEN, K_BRACE_CLOSE, K_ENTER,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_BACKSLASH,
K_FNLOCK, K_A, K_KB_PRIVACY, K_D, K_F, K_G, K_H, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_MINUS, K_QUOTE, K_BACKSLASH,
K_LEFT_SHIFT, K_INT_1, K_Z, K_X, K_C, K_V, K_B, K_N, K_NUM_0, K_COMMA, K_NUM_PERIOD, K_NUM_PLUS, K_RIGHT_SHIFT,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_HOME, K_UP, K_END,
K_LEFT, K_DOWN, K_RIGHT
Expand Down
2 changes: 1 addition & 1 deletion src/keyboard/system76/15in_102/keymap/default.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ LAYOUT(
K_ESC, K_TOUCHPAD, K_DISPLAY_TOGGLE, K_MUTE, K_F4, K_VOLUME_DOWN, K_VOLUME_UP, K_DISPLAY_MODE, K_BRIGHTNESS_DOWN, K_BRIGHTNESS_UP, K_CAMERA_TOGGLE, K_AIRPLANE_MODE, K_SUSPEND, K_PRINT_SCREEN, K_SCROLL_LOCK, K_DEL, K_HOME, K_END, K_PAUSE, K_PAUSE,
K_PLAY_PAUSE, K_FAN_TOGGLE, K_2, K_3, K_4, K_5, K_6, K_7, K_8, K_9, K_0, K_MINUS, K_EQUALS, K_BKSP, K_NUM_LOCK, K_KBD_COLOR, K_KBD_TOGGLE, K_KBD_DOWN,
K_TAB, K_Q, K_W, K_E, K_R, K_T, K_Y, K_U, K_I, K_O, K_P, K_BRACE_OPEN, K_BRACE_CLOSE, K_BACKSLASH, K_NUM_7, K_NUM_8, K_NUM_9, K_KBD_UP,
K_FNLOCK, K_A, K_S, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6,
K_FNLOCK, K_A, K_KB_PRIVACY, K_D, K_F, K_G, K_H, K_J, K_K, K_L, K_SEMICOLON, K_QUOTE, K_ENTER, K_NUM_4, K_NUM_5, K_NUM_6,
K_LEFT_SHIFT, K_Z, K_X, K_C, K_V, K_B, K_N, K_M, K_COMMA, K_PERIOD, K_SLASH, K_RIGHT_SHIFT, K_UP, K_NUM_1, K_NUM_2, K_NUM_3, K_NUM_ENTER,
K_LEFT_CTRL, KT_FN, K_LEFT_SUPER, K_LEFT_ALT, K_SPACE, K_RIGHT_ALT, K_APP, K_RIGHT_CTRL, K_LEFT, K_DOWN, K_RIGHT, K_NUM_0, K_NUM_PERIOD
)
Expand Down
Loading