█ ▄ █  ▄██▄  ▄██▄ ████▄   ▄██▄   ▄██  █▄  ▄█
█ █ █ ██  ██  ██  ██  ██ ██ ▄██ ████   ▀██▀
▀███▀ ██  ██  ██  ██  ██ ██████   ██
 ███  ██  ██  ██  ██  ██ ██▀ ██   ██   ▄██▄
  ▀    ▀██▀  ▀██▀ ████▀   ▀██▀  █████ █▀  ▀█
vprove — prove things without revealing them
│
├── PoK — proof of key      (schnorr, prove you know a secret)
├── PoP — proof of password (schnorr over a stretched password)
├── PoM — proof of membership (merkle inclusion)
└── PoL — proof of location (commit-reveal proximity)
schnorr sigma protocol over a 2048-bit safe prime (RFC3526 group 14), fiat-shamir
non-interactive. real zero-knowledge proof of knowledge — the verifier learns nothing
about your secret beyond the fact that you know it. this is a toy/educational
implementation (exponents reduced mod p-1 for simplicity), not audited crypto.
── your secret ──────────────────────────────────
── verify ────────────────────────────────────────
✓ valid — prover knows the secret behind that commitment
✗ invalid — proof does not match commitment
same schnorr math as PoK, but the secret is derived from a password via PBKDF2
(100k iterations, SHA-256) with a salt — like a login system, except the password
never gets sent anywhere, ever, including during verification.
── your password ────────────────────────────────
── verify ────────────────────────────────────────
✓ valid — prover knows the password behind that commitment
✗ invalid — proof does not match commitment
standard merkle inclusion proof, SHA-256. proves one entry is a member of a list
without revealing the rest of the list. it does reveal which entry you're proving —
true "hidden which member" proofs need zk-SNARKs, which is out of scope here.
── your list ─────────────────────────────────────
── verify ────────────────────────────────────────
✓ valid — entry is a member of that list
✗ invalid — entry is not a member, or proof is malformed
commit-reveal, not full zero-knowledge — be honest about that. you commit to your
exact coordinates now (hash + random nonce), which locks them in without revealing
anything. later you reveal the coordinates + nonce, and anyone can check the hash
matches AND that you're within the radius. this proves you couldn't have picked your
location after the fact — it does not hide your coordinates at reveal time.
── commit ────────────────────────────────────────
── reveal + verify ───────────────────────────────