No description
Store challenge from handleGetChallenge in session, then verify against it in handleSolve. Previously a fresh challenge was generated for verification, making auth trivially bypassable. |
||
|---|---|---|
| cmd/qccd | ||
| internal | ||
| mobile | ||
| pkg/types | ||
| .gitignore | ||
| config.yaml.example | ||
| go.mod | ||
| go.sum | ||
| LICENSE | ||
| main.go | ||
| README.md | ||
QuiC Call
A server for audio/video calls between people. A family phone system replacement.
No WebRTC. No STUN/TURN. Everything goes through the server.
How it works
- Client connects via QUIC (TLS + ACME Let's Encrypt)
- Server sends a PoW (Hashcash) challenge
- Client solves it, sends solution with their Ed25519 public key
- Server allocates a phone number (
+0 XXX YYY ZZZ), issues an X.509 certificate proving ownership - Client can re-roll the number once per 24h
- To call someone, dial their number — server relays media blindly (E2EE)
Architecture
- Transport: QUIC (hysteria fork of quic-go) over UDP
- TLS: Automatic via certmagic + Cloudflare DNS-01 (ACME)
- Auth: Proof-of-Work (Hashcash SHA-256), no passwords
- PKI: Ed25519 CA, X.509 client certs with phone number as CN
- DB: Custom append-only frame-based engine with AES-256-GCM at-rest encryption (hash-chain integrity)
- Signaling: Binary varint frames over QUIC streams
- Media relay: Unreliable QUIC datagrams, server forwards blindly
- Congestion control: Brutal (CBR) from Hysteria
- E2EE: X25519 + HKDF + ChaCha20-Poly1305 (key exchange during signaling)
Status
Pre-alpha. Server compiles and passes vet. No client application exists yet.
Quick start
# Build
go build -o qccd ./cmd/qccd
# Configure
cp config.yaml.example config.yaml
# edit config.yaml — set ACME domains, email, Cloudflare API token
# Run
./qccd server
Configuration
See config.yaml.example.
Key options:
| Field | Default | Description |
|---|---|---|
server.listen |
:1963 |
UDP listen address |
pow.difficulty |
22 |
PoW leading zero bits |
identity.cooldown |
24h |
Minimum time between number re-rolls |
identity.prefix |
+0 |
Phone number prefix |
ca.key_type |
ed25519 |
CA key type |
relay.bandwidth_up |
100 mbps |
Media relay upstream bandwidth |
Dependencies
github.com/apernet/quic-go— QUIC transport (Hysteria fork)github.com/caddyserver/certmagic+github.com/libdns/cloudflare— ACME TLSgolang.org/x/crypto— X25519, ChaCha20-Poly1305, HKDF
License
AGPL-3.0-only