Basic input demo working on qubes

This commit was typed with it ^_^
This commit is contained in:
jaseg 2018-11-08 21:53:25 +09:00
parent 9252eac840
commit 42d4bebde7
2 changed files with 240 additions and 26 deletions

View file

@ -38,8 +38,8 @@ def send_packet(ser, data, width=16):
def receive_packet(ser, width=16):
packet = ser.read_until(b'\0')
data = cobs.decode(packet[:-1])
#print(f'\033[93mReceived {len(data)} bytes\033[0m')
#hexdump(print, data, width)
print(f'\033[93mReceived {len(data)} bytes\033[0m')
hexdump(print, data, width)
return data
if __name__ == '__main__':
@ -54,6 +54,23 @@ if __name__ == '__main__':
ser = serial.Serial(args.serial, args.baudrate)
import uinput
ALL_KEYS = [ v for k, v in uinput.ev.__dict__.items() if k.startswith('KEY_') ]
MODIFIERS = [
uinput.ev.KEY_LEFTCTRL,
uinput.ev.KEY_LEFTSHIFT,
uinput.ev.KEY_LEFTALT,
uinput.ev.KEY_LEFTMETA,
uinput.ev.KEY_RIGHTCTRL,
uinput.ev.KEY_RIGHTSHIFT,
uinput.ev.KEY_RIGHTALT,
uinput.ev.KEY_RIGHTMETA,
]
map_modifiers = lambda x: [ mod for i, mod in enumerate(MODIFIERS) if x & (1<<i) ]
import keymap
map_regular = { v: getattr(uinput.ev, k) for k, v in keymap.__dict__.items() if k.startswith('KEY_') }
map_regulars = lambda keycodes: [ map_regular[kc] for kc in keycodes if kc != 0 and kc in map_regular ]
from noise.connection import NoiseConnection, Keypair
from noise.exceptions import NoiseInvalidMessage
@ -81,29 +98,50 @@ if __name__ == '__main__':
print('Handshake finished, handshake hash:')
hexdump(print, proto.get_handshake_hash(), args.width)
def noise_rx(received):
data = proto.decrypt(received)
#print('Decrypted data:')
#hexdump(print, data, args.width)
old_kcs = set()
def noise_rx(received, ui):
global old_kcs
while True:
try:
received = receive_packet(ser, args.width)
data = proto.decrypt(received)
print('Decrypted data:')
hexdump(print, data, args.width)
rtype, rlen, *report = data
if rtype != 1 or rlen != 8:
return
modbyte, _reserved, *keycodes = report
keys = map_modifiers(modbyte) + map_regulars(keycodes)
print('Emitting:', keys)
keyset = set(keys)
for key in keyset - old_kcs:
ui.emit(key, 1, syn=False)
for key in old_kcs - keyset:
ui.emit(key, 0, syn=False)
ui.syn()
old_kcs = keyset
with uinput.Device(ALL_KEYS) as ui:
while True:
try:
noise_rx(received)
except NoiseInvalidMessage as e:
orig_n = proto.noise_protocol.cipher_state_decrypt.n
print('Invalid noise message', e)
for n in [orig_n+1, orig_n+2, orig_n+3]:
try:
proto.noise_protocol.cipher_state_decrypt.n = n
noise_rx(received)
print(f' Recovered. n={n}')
break
except NoiseInvalidMessage as e:
pass
else:
print(' Unrecoverable.')
proto.noise_protocol.cipher_state_decrypt.n = orig_n
except Exception as e:
print('Invalid framing:', e)
received = receive_packet(ser, args.width)
try:
noise_rx(received, ui)
except NoiseInvalidMessage as e:
orig_n = proto.noise_protocol.cipher_state_decrypt.n
print('Invalid noise message', e)
for n in [orig_n+1, orig_n+2, orig_n+3]:
try:
proto.noise_protocol.cipher_state_decrypt.n = n
noise_rx(received, ui)
print(f' Recovered. n={n}')
break
except NoiseInvalidMessage as e:
pass
else:
print(' Unrecoverable.')
proto.noise_protocol.cipher_state_decrypt.n = orig_n
except Exception as e:
print('Invalid framing:', e)

176
keymap.py Normal file
View file

@ -0,0 +1,176 @@
KEY_RESERVED = 0x00
KEY_A = 0x04
KEY_B = 0x05
KEY_C = 0x06
KEY_D = 0x07
KEY_E = 0x08
KEY_F = 0x09
KEY_G = 0x0a
KEY_H = 0x0b
KEY_I = 0x0c
KEY_J = 0x0d
KEY_K = 0x0e
KEY_L = 0x0f
KEY_M = 0x10
KEY_N = 0x11
KEY_O = 0x12
KEY_P = 0x13
KEY_Q = 0x14
KEY_R = 0x15
KEY_S = 0x16
KEY_T = 0x17
KEY_U = 0x18
KEY_V = 0x19
KEY_W = 0x1a
KEY_X = 0x1b
KEY_Y = 0x1c
KEY_Z = 0x1d
KEY_1 = 0x1e
KEY_2 = 0x1f
KEY_3 = 0x20
KEY_4 = 0x21
KEY_5 = 0x22
KEY_6 = 0x23
KEY_7 = 0x24
KEY_8 = 0x25
KEY_9 = 0x26
KEY_0 = 0x27
KEY_ENTER = 0x28
KEY_ESC = 0x29
KEY_BACKSPACE = 0x2a
KEY_TAB = 0x2b
KEY_SPACE = 0x2c
KEY_MINUS = 0x2d
KEY_EQUAL = 0x2e
KEY_LEFTBRACE = 0x2f
KEY_RIGHTBRACE = 0x30
KEY_BACKSLASH = 0x31
KEY_SEMICOLON = 0x33
KEY_APOSTROPHE = 0x34
KEY_GRAVE = 0x35
KEY_COMMA = 0x36
KEY_DOT = 0x37
KEY_SLASH = 0x38
KEY_CAPSLOCK = 0x39
KEY_F1 = 0x3a
KEY_F2 = 0x3b
KEY_F3 = 0x3c
KEY_F4 = 0x3d
KEY_F5 = 0x3e
KEY_F6 = 0x3f
KEY_F7 = 0x40
KEY_F8 = 0x41
KEY_F9 = 0x42
KEY_F10 = 0x43
KEY_F11 = 0x44
KEY_F12 = 0x45
KEY_SYSRQ = 0x46
KEY_SCROLLLOCK = 0x47
KEY_PAUSE = 0x48
KEY_INSERT = 0x49
KEY_HOME = 0x4a
KEY_PAGEUP = 0x4b
KEY_DELETE = 0x4c
KEY_END = 0x4d
KEY_PAGEDOWN = 0x4e
KEY_RIGHT = 0x4f
KEY_LEFT = 0x50
KEY_DOWN = 0x51
KEY_UP = 0x52
KEY_NUMLOCK = 0x53
KEY_KPSLASH = 0x54
KEY_KPASTERISK = 0x55
KEY_KPMINUS = 0x56
KEY_KPPLUS = 0x57
KEY_KPENTER = 0x58
KEY_KP1 = 0x59
KEY_KP2 = 0x5a
KEY_KP3 = 0x5b
KEY_KP4 = 0x5c
KEY_KP5 = 0x5d
KEY_KP6 = 0x5e
KEY_KP7 = 0x5f
KEY_KP8 = 0x60
KEY_KP9 = 0x61
KEY_KP0 = 0x62
KEY_KPDOT = 0x63
KEY_102ND = 0x64
KEY_COMPOSE = 0x65
KEY_POWER = 0x66
KEY_KPEQUAL = 0x67
KEY_F13 = 0x68
KEY_F14 = 0x69
KEY_F15 = 0x6a
KEY_F16 = 0x6b
KEY_F17 = 0x6c
KEY_F18 = 0x6d
KEY_F19 = 0x6e
KEY_F20 = 0x6f
KEY_F21 = 0x70
KEY_F22 = 0x71
KEY_F23 = 0x72
KEY_F24 = 0x73
KEY_OPEN = 0x74
KEY_HELP = 0x75
KEY_PROPS = 0x76
KEY_FRONT = 0x77
KEY_STOP = 0x78
KEY_AGAIN = 0x79
KEY_UNDO = 0x7a
KEY_CUT = 0x7b
KEY_COPY = 0x7c
KEY_PASTE = 0x7d
KEY_FIND = 0x7e
KEY_MUTE = 0x7f
KEY_VOLUMEUP = 0x80
KEY_VOLUMEDOWN = 0x81
KEY_KPCOMMA = 0x85
KEY_RO = 0x87
KEY_KATAKANAHIRAGANA = 0x88
KEY_YEN = 0x89
KEY_HENKAN = 0x8a
KEY_MUHENKAN = 0x8b
KEY_KPJPCOMMA = 0x8c
KEY_HANGEUL = 0x90
KEY_HANJA = 0x91
KEY_KATAKANA = 0x92
KEY_HIRAGANA = 0x93
KEY_ZENKAKUHANKAKU = 0x94
KEY_KPLEFTPAREN = 0xb6
KEY_KPRIGHTPAREN = 0xb7
KEY_LEFTCTRL = 0xe0
KEY_LEFTSHIFT = 0xe1
KEY_LEFTALT = 0xe2
KEY_LEFTMETA = 0xe3
KEY_RIGHTCTRL = 0xe4
KEY_RIGHTSHIFT = 0xe5
KEY_RIGHTALT = 0xe6
KEY_RIGHTMETA = 0xe7
KEY_PLAYPAUSE = 0xe8
KEY_STOPCD = 0xe9
KEY_PREVIOUSSONG = 0xea
KEY_NEXTSONG = 0xeb
KEY_EJECTCD = 0xec
KEY_VOLUMEUP = 0xed
KEY_VOLUMEDOWN = 0xee
KEY_MUTE = 0xef
KEY_WWW = 0xf0
KEY_BACK = 0xf1
KEY_FORWARD = 0xf2
KEY_STOP = 0xf3
KEY_FIND = 0xf4
KEY_SCROLLUP = 0xf5
KEY_SCROLLDOWN = 0xf6
KEY_EDIT = 0xf7
KEY_SLEEP = 0xf8
KEY_COFFEE = 0xf9
KEY_REFRESH = 0xfa
KEY_CALC = 0xfb