Go to file
2022-12-31 00:37:44 -06:00
.vscode + Finished authentication 2022-09-10 14:28:54 -05:00
security Updated Authentication to describe the change from uuid 2022-12-31 00:37:44 -06:00
smartkeyboard/auth + Started ThreatModel.md 2022-12-31 00:34:03 -06:00
util added utility to remove fenced code blocks from final html docs since srcweave is a pain in that regard 2022-09-08 13:35:51 -05:00
.gitattributes added gitattributes with linguist ignores 2022-09-10 14:33:46 -05:00
.gitignore + Started ThreatModel.md 2022-12-31 00:34:03 -06:00
Dependencies.md + Started ThreatModel.md 2022-12-31 00:34:03 -06:00
EnvironmentVariables.md + Finished authentication 2022-09-10 14:28:54 -05:00
LICENSE.md Add license and move websocket to Streaming file 2022-12-27 17:05:32 -06:00
Makefile + Started ThreatModel.md 2022-12-31 00:34:03 -06:00
ReadMe.md + Started ThreatModel.md 2022-12-31 00:34:03 -06:00
Server.md + Started ThreatModel.md 2022-12-31 00:34:03 -06:00
Streaming.md Add license and move websocket to Streaming file 2022-12-27 17:05:32 -06:00
ThreatModel.md + Started ThreatModel.md 2022-12-31 00:34:03 -06:00

GoSmartKeyboard

Copyright 2022 Kevin Froman Licensed under GPLv3

Work in progress

Introduction

GoSmartKeyboard is a daemon that allows you to have a more powerful keyboarding experience. It is meant to be used with a secondary device, such as an Android phone or a raspberry pi.

This is done with a simple websocket server meant to accept a single connection, authenticate it, and stream UTF16 characters and send them as key strokes into the window manager. With a simple daemon like this we can enhance keyboarding with inteligent features.

The goal of this particular daemon is not to perfectly emulate a HID, so it may trip up on Windows UAC or game anticheat systems.

Why a smart keyboard?

Keyboards have been an essential element of computing since the beginning, however they have not evolved much. Everything has a smart variant, so why not keyboards?

A smart keyboard could, for example, be used for the following:

  • Typical macros
  • Buffer typed text before sending it to the client, preventing invalid commands or input. (This would also save some CPU on low power machines, this is how many early teletype systems worked)
  • Clever CLI tricks, think vim or cowsay on your keyboard!
  • Isolated password manager
  • One Time Passwords
  • Virtual keyboard switch or communicating with multiple daemons at once
  • Easily attach to VMs
  • Text storage, such as configuration or SSH pubkeys
  • On-the-fly spell checking or translation
  • On-the-fly encryption (ex: PGP sign every message you type), isolated from the perhaps untrusted computer
  • Easy layout configuration
  • Delay keystrokes by a few dozen or so milliseconds to reduce key stroke timing biometrics

Some points about the design of this project:

  • Written in go with the literate tool srcweave, so this markdown book is actually the source code
  • The project is test-driven
  • KISS principle above All
  • Small and light core
  • Advanced features provided via plugins
  • Well defined threat model

Daemon Entrypoint

Right out of the gate, we make sure a token is provisioned. In the future we will use the system keyring.

Then we can start the web server and listen for websocket connections.


--- entrypoint

    func main(){
        tokenBase64, _ := auth.ProvisionToken()
        fmt.Println(tokenBase64)
        server.StartServer()
    }

---


--- /main.go
    package main

    import(
        "fmt"
        "keyboard.voidnet.tech/server"
        "keyboard.voidnet.tech/auth"
    )


    @{entrypoint}

---



--- set network bind globals

    var string unixSocketPath
    var bool unixSocketPathExists
    var string tcpBindAddress
    var bool tcpBindAddressExists
    var string tcpBindPort
    var bool tcpBindPortExists

---