- C 66.1%
- Rust 14.4%
- Python 11.3%
- Shell 5.2%
- CMake 2.2%
- Other 0.8%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
* Add KFP v2 transport, announce proof and NIP-44 primitives to frost_tr * Randomize and verify proofs, bound NIP-44 memory and add the vector generator * Refuse overlapping NIP-44 buffers and check the proof against the stored share * State which overlaps seal and open refuse * Move the KFP vector generator under test and stop tracking its lockfile |
||
| .github | ||
| components | ||
| docs | ||
| fuzz | ||
| main | ||
| scripts | ||
| test | ||
| .clang-format | ||
| .dockerignore | ||
| .gitignore | ||
| CMakeLists.txt | ||
| dependencies.lock | ||
| Dockerfile.reproducible | ||
| Doxyfile | ||
| Justfile | ||
| LICENSE | ||
| partitions.csv | ||
| partitions.secureboot.csv | ||
| README.md | ||
| REPRODUCIBILITY.md | ||
| REUSE.toml | ||
| sdkconfig.defaults | ||
| sdkconfig.defaults.secureboot | ||
| sdkconfig.defaults.ui-test | ||
| SECURITY.md | ||
keep-esp32
Air-gapped FROST threshold signing device for Keep.
About
keep-esp32 is an ESP32-S3 firmware that turns a devkit into an air-gapped hardware signer. It stores FROST threshold key shares, signs via USB serial JSON-RPC, and never exposes private keys. The device supports Bitcoin PSBT signing and Warden policy enforcement.
Features
- FROST Threshold Signatures — FROST(secp256k1, Taproot) with the Zcash Foundation's
frost-secp256k1-tr, the implementation keep uses - Bitcoin PSBT — Parse PSBTs and compute Taproot sighashes (BIP-174, BIP-341)
- Policy Enforcement — Warden-signed policy bundles with Schnorr signature verification
- Air-Gapped — No network, USB serial JSON-RPC only
- Secure Storage — Direct partition-backed share storage (persists across firmware updates)
- Multi-Group — Store up to 8 signing shares for different groups
Quick Start
Web Flasher (Easiest)
Flash firmware directly from your browser — no tools required:
Requires Chrome or Edge.
Manual Flash
pip install esptool
Download the latest keep-merged.bin from Releases:
esptool.py --chip esp32s3 --port /dev/ttyACM0 write_flash 0x0 keep-merged.bin
cargo install --git https://github.com/privkeyio/keep keep-cli
keep frost hardware ping --device /dev/ttyACM0
Hardware
- ESP32-S3 with USB Serial JTAG support
- 8MB Flash, 8MB PSRAM recommended
- Tested on ESP32-S3-DevKitC-1-N8R8
Development
scripts/build-frost-tr.sh --docker # Rust FROST component, needs Docker
source ~/esp/esp-idf/export.sh
idf.py build
idf.py -p /dev/ttyACM0 flash monitor
Or with just:
just build
just flash-monitor
just test
See docs/USAGE.md for full CLI usage, JSON-RPC API reference, Bitcoin PSBT signing and policy enforcement.
Security
Air-gapped by design — no WiFi, no Bluetooth, no network stack. Communication is USB serial only. FROST shares are stored in a dedicated flash partition and persist across firmware updates. The device never holds a full private key. See docs/SECURITY.md for details.
Reproducible Builds
just docker-build
just verify-release v0.2.0
See docs/REPRODUCIBILITY.md for verification instructions.