Repository navigation
KasSigner v1.0.1 — P2SH Multisig & KasSee Web
KasSigner v1.0.1
Air-gapped offline signing device for the Kaspa blockchain. ~45,000 lines of bare-metal no_std Rust on ESP32-S3.
Highlights
- P2SH multisig — first air-gapped multisig on Kaspa mainnet
- KasSee Web — browser-based watch-only companion wallet (Pure Rust → WASM), deployed at inkaswerust.github.io/KasSigner
- Critical signing fixes — sighash keyed Blake2b, BIP-340 tagged Schnorr challenge, change address chain search
- Docker toolchain v2 — Rust 1.85.0, espup 0.16.0, espflash 3.3.0
- One-step installer — macOS script: scan, install toolchain, build from source, flash
- Secure Boot V2 verified on eFuse hardware
Reproducible Build Hashes
Built from tag v1.0.1 using docker build --no-cache.
| Target | SHA-256 | Size |
|---|---|---|
| Waveshare | e453cbcb3af913284fd3ff68952640b00125b902abfe5af32862645fb8209ab1 |
818 KB |
| M5Stack | d0390ca473a8afb07a069e0a3e122b154f4acdd8f36519c8ec5d4b4aecf98fd9 |
831 KB |
# Verify yourself
docker build --platform linux/amd64 -f Dockerfile.base -t kassigner-toolchain:v2 .
docker build --platform linux/amd64 -t kassigner-build:v1.0.1 .
docker run --rm kassigner-build:v1.0.1Verified on Mainnet
| TX ID | Type |
|---|---|
8a6652fb... |
First P2SH multisig funding |
d1ffdb9f... |
First P2SH multisig spend (direct device-to-device) |
2b53e35a... |
Second funding (sorted keys verified) |
2b718bd5... |
Second P2SH spend (via KasSee relay) |
2faa58b2... |
First air-gapped broadcast (P2PK) |
277517da... |
Multi-UTXO across receive + change chains |
What's New — Device Firmware
Added
- P2SH script detection, redeem script field, v2 KSPT serializer/parser
- ShowQR signature status overlay — "PARTIAL 1/2" (orange) / "FULLY SIGNED 2/2" (teal)
- Multi-frame v2 KSPT detection in camera
- BIP85 auto-load + success sound
- SD backup delete with hold-to-confirm (4s)
- SD file list fingerprint matching ("Seed #1", "Seed #2")
- SD progress bars on decrypt and xprv import
- Pre-signing size check: rejects TX exceeding 5 inputs with warning
- One-step macOS installer (
KasSigner_Install_v1_0_1.sh)
Fixed
- Sighash: all sub-hashes now use keyed Blake2b-256 with
TransactionSigningHashdomain key - Output hash: added
script_len(u64 LE) prefix before script bytes - Schnorr challenge: switched to BIP-340 tagged hash
- Change address signing: searches both receive and change chains
- MAX_SCRIPT_SIZE bumped to 170 bytes (supports 5-of-5 multisig)
- QR frame payload reduced to 53 bytes for reliable device-to-device scanning
- Stego export loop fix, SD read screen labels, multisig slot label overlap
What's New — KasSee Web
Browser-based watch-only companion wallet. Pure Rust compiled to WASM.
- Import kpub via QR scan or paste
- Derive receive and change addresses, track UTXOs and balance
- Build unsigned KSPT transactions with fee estimation
- Send Max (sweep all UTXOs)
- Broadcast signed transactions
- P2SH multisig address creation and spend
- UTXO explorer with manual selection
- Address verification with QR + derivation path
- PWA installable on mobile
- Custom node connection (WebSocket)
Build Environment
| Component | Version |
|---|---|
| Docker base | kassigner-toolchain:v2 |
| Host Rust | 1.85.0 |
| espup | 0.16.0 |
| espflash | 3.3.0 |
| Base OS | Ubuntu 24.04 (x86_64) |
Security Layers
| Layer | Verified by |
|---|---|
| RSA-3072 Secure Boot | ESP32-S3 ROM (eFuse devices) |
| SHA-256 firmware hash | KasSigner app (every boot) |
| Schnorr signature | KasSigner app (production builds) |
| Docker reproducibility | Anyone (docker build --no-cache) |
Full Changelog
See CHANGELOG.md for the complete list of changes.