BlindVault is a privacy-preserving credential issuance and redemption service built on BLS12-381 blind signatures and DLEQ proofs.
BlindVault enables clients to request unbiased blind credentials, verify that the server signed them with a derived public key, and consume them without revealing the underlying secret material.
- Blind credential issuance using BLS12-381 blind signatures
- DLEQ proof of correct signing key usage
- Epoch and credential class key derivation from a single master seed
- Replay protection using deterministic nullifiers
- Redis-backed nullifier store for production
- JWT-protected issuance endpoint
- Health endpoint for readiness checks
- Create
configs/config.yamlor set environment variables. - Run the server:
go run ./cmd/server/main.go --config configs/config.yaml- Validate health:
curl http://localhost:8080/healthdocs/api_reference.md— API endpoints, request and response formats, and errorsdocs/client_reference.md— Go client library and CLI usagedocs/deployment_guide.md— deployment, Docker Compose, Redis setup, and health checksdocs/crypto_spec.md— cryptographic specification, DLEQ proof details, and security assumptionsdocs/crypto_vectors.md— generated test vector placeholderCONTRIBUTING.md— contribution process and testing guidelines
BlindVault includes a high-level Go client wrapper in pkg/client and a command-line interface in cmd/bv.
Build the CLI:
go build -o bv ./cmd/bvExamples:
bv blind --message "hello" --server http://localhost:8080
bv unblind --signature <blind_signature_hex> --id <request_id>
bv redeem --signature <unblinded_signature_hex> --witness <witness_hex> --class tier_gold --epoch 2026-01The blind command returns JSON with blinded, witness, and request_id. The verify command validates a DLEQ proof locally, unblind converts a blind signature into an unblinded one using the stored request state, and redeem submits the credential to /v1/credential/consume.
Client state is persisted to ~/.blindvault/state.json.
go test ./...
go test -v ./pkg/cryptogo run scripts/generate_vectors.go --output docs/crypto_vectors.mdYou can override config values with environment variables:
MASTER_SEED_HEXACTIVE_EPOCHSUPPORTED_EPOCHSDSTAUTH_SECRETREDIS_ADDRREDIS_PASSWORDREDIS_DBUSE_MEMORY_STORELISTEN_ADDR
Use use_memory_store: true only for testing. Production deployment should use Redis and protect MASTER_SEED_HEX and AUTH_SECRET with a secrets manager.