A Zero-Knowledge Proof (ZKP) system for privacy-preserving income verification using post-quantum cryptography.
Traditional income verification exposes your exact salary to:
- Banks (loan applications)
- Landlords (rental agreements)
- Employers (background checks)
Privacy Risk: Sensitive financial data is stored in centralized databases vulnerable to breaches.
QS-PPI uses Zero-Knowledge Proofs (ZKPs) to prove your income exceeds a threshold without revealing the exact amount.
β
Zero-Knowledge Privacy: Income never revealed, only threshold satisfaction
β
Post-Quantum Secure: ML-DSA-65 (NIST FIPS 204) for 20+ year security
β
W3C VC 2.0 Compliant: Industry-standard verifiable credentials
β
Unlinkability: Different proofs for same income across verifiers
β
Fast Performance: ~220ms end-to-end latency per credential
β
28/28 Tests Passing: Production-ready implementation
Location: docs/index.html
Live URL: https://goldlion123rp.github.io/QS-PPI/ (after enabling Pages)
Features:
- π Issuer Dashboard: Live stats, PQ status banner, registry table
- π Issue Credential: W3C VC 2.0 form with live JSON-LD preview
- π Holder Wallet: ZKP circuit visualization, proof generation
- π¨ Theme Switcher: Dark / Light / Auto modes
- β‘ Single file: No dependencies, instant load
Setup: See docs/README.md for 1-minute GitHub Pages setup.
Location: qsppi-dashboard/
Tech: Next.js 15 + React 18 + Tailwind CSS + Lucide Icons
Features:
- Interactive components with real-time updates
- API client for backend integration (
lib/zkp-api.ts) - Fully working proof generation/verification
Setup:
cd qsppi-dashboard
npm install
npm run dev
# Visit http://localhost:3000Location: web/index.html
Purpose: Simple prover/verifier UI for testing
Usage:
cd web
open index.html # or double-click-
ZKP Circuit (
circuits_incomeProof.circom)- Proves:
income > thresholdwithout revealing exact income - Constraints: ~145K (Groth16, BN254 curve)
- Steps:
- Num2Bits(32): Prevent field overflow
- GreaterThan(32): Compare income vs threshold
- Fiat-Shamir: Bind challenge to prevent replay attacks
- Proves:
-
Post-Quantum Signatures
- ML-DSA-65 (NIST FIPS 204): Quantum-resistant digital signatures
- Hybrid Mode: ECDSA (secp256k1) + ML-DSA for backward compatibility
-
W3C Verifiable Credentials 2.0
- JSON-LD format with
@contextnamespaces - Issuer: Banks, Employers
- Holder: End-users (wallet)
- Verifier: Loan officers, landlords
- JSON-LD format with
-
Unlinkability
- Unique blinding salts per presentation
- Poseidon hash commitments
- Jaccard similarity < 0.05 across verifiers
- Node.js 18+
- npm 9+
- Circom 2.1.9
- snarkjs 0.7.5
git clone https://github.com/GoldLion123RP/QS-PPI.git
cd QS-PPI
npm installcd circuits
circom circuits_incomeProof.circom --r1cs --wasm --sym
snarkjs groth16 setup circuits_incomeProof.r1cs pot16_final.ptau circuit_0000.zkey
snarkjs zkey export verificationkey circuit_final.zkey verification_key.json
cd ..node src/server.js
# Server runs on http://localhost:3001npm test
# Expected: 28/28 tests passing| Metric | Value | Notes |
|---|---|---|
| Proof Generation | ~220 ms | Browser WASM (Intel i5) |
| Proof Verification | ~18 ms | Node.js backend |
| Circuit Constraints | ~145K | Groth16 (BN254) |
| Proof Size | ~1.2 KB | Compressed Groth16 proof |
| Unlinkability | Jaccard < 0.05 | Cross-verifier presentations |
| PQ Signature Size | ~2.5 KB | ML-DSA-65 |
POST /api/issue
Body: { "name": "Rahul Pal", "incomeINR": 750000, "employer": "HDFC Bank" }
Response: { "credential": {...}, "commitment": "0x1267..." }POST /api/prove
Body: { "incomeINR": 750000, "thresholdINR": 500000, "blindingSalt": "0x8f3a...", "verifierId": "bank-001" }
Response: { "proof": {...}, "isValid": true }POST /api/verify
Body: { "proof": {...}, "publicSignals": [...], "verifierId": "bank-001" }
Response: { "isValid": true, "timestamp": "2026-03-01T14:00:00Z" }-
Zero-Knowledge: Verifier learns ONLY:
- β Income > Threshold (boolean)
- β NOT the exact income value
-
Post-Quantum Security:
- ML-DSA-65 resists Grover's algorithm (2^128 security)
- 20+ year security horizon
-
Unlinkability:
- Same income generates different proofs per verifier
- Prevents cross-organization tracking
-
Replay Protection:
- Fiat-Shamir challenge binding
- Timestamp + nonce in transcript
-
Soundness:
- Groth16 proof system: Computational soundness
- Cannot forge proofs for false statements
Problem: Banks require exact salary slips
Solution: Prove "income > 5 LPA" without revealing βΉ7,50,000
Problem: Landlords ask for 3 months' bank statements
Solution: Prove "income > 3x rent" with zero-knowledge
Problem: New employers verify previous income
Solution: Prove "previous income > threshold" without disclosing to competitors
Problem: Subsidy eligibility reveals exact income
Solution: Prove "income < eligibility threshold" privately
- START_HERE.md: Beginner's guide
- QUICKSTART.md: 5-minute setup
- PROJECT_SUMMARY.md: Technical deep dive
- DELIVERABLES.md: Hackathon submission checklist
- docs/README.md: GitHub Pages setup
| Layer | Technology |
|---|---|
| ZKP Circuit | Circom 2.1.9 (Groth16, BN254) |
| PQ Signatures | ML-DSA-65 (NIST FIPS 204) |
| Backend | Node.js 18 + Express |
| Frontend | React 18 + Next.js 15 + Tailwind CSS |
| Standards | W3C VC 2.0, DID Core |
| Hashing | Poseidon (zkSNARK-friendly) |
| Testing | Jest + Mocha |
npm test
β Circuit constraints validation (28 tests)
β Proof generation (valid & invalid inputs)
β Proof verification
β W3C VC 2.0 compliance
β ML-DSA-65 signatures
β Unlinkability (Jaccard similarity)
β API endpoints
β Replay attack prevention
Result: 28/28 passingQS-PPI/
βββ circuits/ # ZKP circuits (Circom)
β βββ circuits_incomeProof.circom
βββ src/ # Backend (Node.js)
β βββ server.js
β βββ zkp.js
β βββ pqc.js
βββ tests/ # Test suite
β βββ test_zkp.js
βββ docs/ # GitHub Pages dashboard
β βββ index.html # Single-page UI
β βββ README.md # Pages setup guide
βββ qsppi-dashboard/ # React dashboard (optional)
β βββ app/
β βββ components/
β βββ lib/
βββ web/ # Basic demo UI
β βββ index.html
βββ README.md # This file
βββ package.json
Team: Rahul Pal & Akash Dutta
Track: Privacy-First Finance
Built With: ZKP + Post-Quantum Cryptography
- Live Dashboard: https://goldlion123rp.github.io/QS-PPI/
- GitHub Repo: https://github.com/GoldLion123RP/QS-PPI
- Documentation: START_HERE.md
- W3C VC 2.0 Spec: https://www.w3.org/TR/vc-data-model-2.0/
- ML-DSA (NIST FIPS 204): https://csrc.nist.gov/pubs/fips/204/final
This project is licensed under the Apache License 2.0. See the LICENSE and LICENSE.md files for details.
Rahul Pal
- Age: 26
- Location: Kolkata, West Bengal, India
- Education: Engineering Student (3rd Year, 6th Semester)
- Email: goldlion123.rp@gmail.com
- GitHub: @GoldLion123RP
Akash Dutta
- Age: 26
- Location: Kolkata, West Bengal, India
- Education: Engineering Student (3rd Year, 6th Semester)
- Email: akashdutta0701@gmail.com
- GitHub: @Escape-thematrix
Built for Privacy. Secured by Math. Ready for the Future.
