{"id":48757200,"url":"https://github.com/jbcom/paranoid-passwd","last_synced_at":"2026-04-15T04:00:51.997Z","repository":{"id":340691742,"uuid":"1167102282","full_name":"jbcom/paranoid-passwd","owner":"jbcom","description":null,"archived":false,"fork":false,"pushed_at":"2026-04-10T04:44:40.000Z","size":239,"stargazers_count":0,"open_issues_count":2,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-13T03:35:26.703Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jbcom.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-02-26T00:09:43.000Z","updated_at":"2026-02-26T18:31:55.000Z","dependencies_parsed_at":null,"dependency_job_id":"8fa451a7-6340-4c2e-8b56-1fca530ebc56","html_url":"https://github.com/jbcom/paranoid-passwd","commit_stats":null,"previous_names":["jbcom/paranoid-passwd"],"tags_count":8,"template":false,"template_full_name":null,"purl":"pkg:github/jbcom/paranoid-passwd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbcom%2Fparanoid-passwd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbcom%2Fparanoid-passwd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbcom%2Fparanoid-passwd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbcom%2Fparanoid-passwd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jbcom","download_url":"https://codeload.github.com/jbcom/paranoid-passwd/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jbcom%2Fparanoid-passwd/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31825515,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-14T18:05:02.291Z","status":"online","status_checked_at":"2026-04-15T02:00:06.175Z","response_time":63,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-04-13T03:30:25.637Z","updated_at":"2026-04-15T04:00:51.975Z","avatar_url":"https://github.com/jbcom.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"---\ntitle: paranoid-passwd\nupdated: 2026-04-09\nstatus: current\ndomain: product\n---\n\n\u003cdiv align=\"center\"\u003e\n\n# paranoid-passwd\n\n### The Password Generator That Trusts No One — Not Even Its Own Creator\n\n**A self-auditing cryptographic password generator that treats the LLM that built it as an adversary.**\n\n\u003c!-- CI/CD Status --\u003e\n[![CI](https://img.shields.io/github/actions/workflow/status/jbcom/paranoid-passwd/ci.yml?branch=main\u0026label=CI\u0026logo=github\u0026style=flat-square)](https://github.com/jbcom/paranoid-passwd/actions/workflows/ci.yml)\n[![CD](https://img.shields.io/github/actions/workflow/status/jbcom/paranoid-passwd/cd.yml?branch=main\u0026label=CD\u0026logo=github\u0026style=flat-square)](https://github.com/jbcom/paranoid-passwd/actions/workflows/cd.yml)\n[![Release](https://img.shields.io/github/actions/workflow/status/jbcom/paranoid-passwd/release.yml?label=Release\u0026logo=github\u0026style=flat-square)](https://github.com/jbcom/paranoid-passwd/actions/workflows/release.yml)\n\n\u003c!-- Supply Chain Security --\u003e\n[![SLSA Level 3](https://img.shields.io/badge/SLSA-Level%203-green?style=flat-square\u0026logo=slsa)](https://slsa.dev)\n[![Sigstore](https://img.shields.io/badge/Sigstore-Cosign%20Signed-blueviolet?style=flat-square\u0026logo=sigstore)](https://www.sigstore.dev/)\n[![SBOM](https://img.shields.io/badge/SBOM-CycloneDX-blue?style=flat-square\u0026logo=linuxfoundation)](https://cyclonedx.org/)\n\n\u003c!-- Code Quality --\u003e\n[![OpenSSF Scorecard](https://img.shields.io/ossf-scorecard/github.com/jbcom/paranoid-passwd?style=flat-square\u0026label=OpenSSF%20Scorecard)](https://securityscorecards.dev/viewer/?uri=github.com/jbcom/paranoid-passwd)\n[![CodeQL](https://img.shields.io/github/actions/workflow/status/jbcom/paranoid-passwd/codeql.yml?label=CodeQL\u0026logo=github\u0026style=flat-square)](https://github.com/jbcom/paranoid-passwd/security/code-scanning)\n\n\u003c!-- Project Info --\u003e\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow?style=flat-square)](LICENSE)\n[![GitHub release](https://img.shields.io/github/v/release/jbcom/paranoid-passwd?style=flat-square\u0026logo=github)](https://github.com/jbcom/paranoid-passwd/releases)\n[![GitHub stars](https://img.shields.io/github/stars/jbcom/paranoid-passwd?style=flat-square\u0026logo=github)](https://github.com/jbcom/paranoid-passwd/stargazers)\n\n\u003c!-- Tech Stack --\u003e\n[![C](https://img.shields.io/badge/C-00599C?style=flat-square\u0026logo=c\u0026logoColor=white)](src/paranoid.c)\n[![WebAssembly](https://img.shields.io/badge/WebAssembly-654FF0?style=flat-square\u0026logo=webassembly\u0026logoColor=white)](https://webassembly.org/)\n[![Zig](https://img.shields.io/badge/Zig-F7A41D?style=flat-square\u0026logo=zig\u0026logoColor=white)](https://ziglang.org/)\n[![OpenSSL](https://img.shields.io/badge/OpenSSL-721412?style=flat-square\u0026logo=openssl\u0026logoColor=white)](https://www.openssl.org/)\n[![Wolfi](https://img.shields.io/badge/Wolfi-4A4A55?style=flat-square\u0026logo=linux\u0026logoColor=white)](https://wolfi.dev/)\n\n[**Live Demo**](https://paranoid-passwd.com) · [**Documentation**](#documentation) · [**Security**](SECURITY.md) · [**Report Bug**](https://github.com/jbcom/paranoid-passwd/issues)\n\n\u003c/div\u003e\n\n---\n\n## What's New in v3\n\n\u003e **Zero-Trust Password Generation with Wolfi Supply Chain Security**\n\nv3 is a complete rearchitecture: Docker multi-stage builds are replaced by [melange](https://github.com/chainguard-dev/melange) + [apko](https://github.com/chainguard-dev/apko) on [Wolfi](https://wolfi.dev/), the 1.5MB OpenSSL WASM dependency is eliminated in favor of a compact FIPS 180-4 SHA-256 implementation + WASI `random_get`, and the build system moves from Makefile to CMake with Zig cross-compilation.\n\n| Feature | Description |\n|---------|-------------|\n| **Wolfi + melange/apko** | Declarative, reproducible package builds and OCI images — no Dockerfile, no shell-in-shell |\n| **\u003c100KB WASM** | Compact FIPS 180-4 SHA-256 + WASI `random_get` replaces the 1.5MB OpenSSL WASM link |\n| **Platform abstraction** | `paranoid_platform.h` separates native (OpenSSL) and WASM (compact SHA-256 + WASI) backends |\n| **CMake build system** | Native tests via CTest, WASM via Zig cross-compilation toolchain (`cmake/wasm32-wasi.cmake`) |\n| **SBOM + SLSA L3** | Software Bill of Materials + non-falsifiable build provenance on every release |\n| **Cosign signing** | Keyless signatures via GitHub OIDC, recorded in Sigstore's Rekor transparency log |\n| **Playwright E2E** | Browser tests verify the full HTML/CSS/JS/WASM path |\n| **acutest C tests** | Native unit tests with NIST FIPS 180-4 known-answer vectors run before WASM compilation |\n| **release-please** | Automated, attested releases with signed artifacts |\n| **Double compilation** | Ken Thompson defense — Zig and Clang must produce matching WASM binaries |\n\n**Every artifact is:**\n- Built in a Wolfi environment via melange (declarative, auditable recipe)\n- Tested at the C level (CTest) AND in the browser (Playwright)\n- Attested with SBOM + SLSA provenance\n- Signed with Cosign (keyless)\n- Deployed only from verified releases\n\n```bash\n# Verify any release\ncosign verify ghcr.io/jbcom/paranoid-passwd:latest \\\n  --certificate-oidc-issuer=https://token.actions.githubusercontent.com \\\n  --certificate-identity-regexp=\"https://github.com/jbcom/paranoid-passwd/.*\"\n```\n\n---\n\n## What is paranoid-passwd?\n\n`paranoid-passwd` is a C program compiled to WebAssembly that generates cryptographic passwords inside a WASM sandbox. It runs a comprehensive 7-layer statistical audit entirely in C, using a platform abstraction layer: OpenSSL RAND_bytes for native builds, WASI `random_get` (backed by Web Crypto `getRandomValues`) for WASM builds. The browser never touches the random bytes — JavaScript only reads the results from WASM linear memory.\n\n**Key Features:**\n- **CSPRNG delegation** — WASI `random_get` in browser (backed by OS CSPRNG), OpenSSL RAND_bytes native\n- **Rejection sampling** — Uniform distribution with no modulo bias\n- **7-layer statistical audit** — Chi-squared, serial correlation, collision detection, entropy proofs, birthday paradox, pattern checks, NIST conformance\n- **WASM sandbox isolation** — JavaScript cannot modify random bytes\n- **Fail-closed design** — No JavaScript fallback (intentional)\n- **\u003c100KB WASM binary** — No OpenSSL in WASM; compact FIPS 180-4 SHA-256 implementation\n- **Full transparency** — All code auditable, complete threat model disclosed\n\n---\n\n## Live Demo\n\n**[Try it now](https://paranoid-passwd.com)** — Deployed from signed releases to GitHub Pages\n\nGenerate a 32-character password using 94 printable ASCII characters with **209.75 bits of entropy**. The tool will:\n1. Generate the password using the platform CSPRNG\n2. Run 7 statistical tests to verify randomness\n3. Display detailed audit results with visual indicators\n4. Show brute-force resistance calculations\n\n---\n\n## Quick Start\n\n### Option 1: Use the Live Demo (Recommended)\n\nVisit **[paranoid-passwd.com](https://paranoid-passwd.com)** — no installation needed.\n\n### Option 2: CLI — verified install from attested GitHub Releases\n\n```bash\n# Pick your platform: linux-amd64 | linux-arm64 | darwin-amd64 | darwin-arm64\nPLATFORM=darwin-arm64\n\n# Resolve the latest release tag (avoids hardcoding a stale version)\nTAG=$(gh release view --repo jbcom/paranoid-passwd --json tagName --jq .tagName)\nVERSION=\"${TAG#paranoid-passwd-v}\"\n\n# Download tarball + checksums\ngh release download \"$TAG\" --repo jbcom/paranoid-passwd \\\n    -p \"paranoid-passwd-${VERSION}-${PLATFORM}.tar.gz\" -p \"checksums.txt\"\n\n# Verify sigstore-signed provenance — fails if not built by our release workflow\ngh attestation verify \"paranoid-passwd-${VERSION}-${PLATFORM}.tar.gz\" --owner jbcom\n\n# Run it\ntar xzf \"paranoid-passwd-${VERSION}-${PLATFORM}.tar.gz\"\n\"./paranoid-passwd-${VERSION}-${PLATFORM}/paranoid-passwd\" --length 32\n```\n\nNo `curl | bash`. The attestation chain walks from the GitHub Release\ntarball → sigstore → Rekor transparency log → the exact workflow run\nthat produced the binary. See **[docs/CLI.md](docs/CLI.md)** for full\nCLI usage, flag reference, exit codes, and the Homebrew tap / Wolfi apk\ninstall paths.\n\n### Option 3: Local Build with CMake\n\n```bash\n# Clone repository\ngit clone https://github.com/jbcom/paranoid-passwd.git\ncd paranoid-passwd\n\n# --- Native build (tests) ---\n# Prerequisites: CMake \u003e= 3.20, OpenSSL dev libraries\ncmake -B build/native -DCMAKE_BUILD_TYPE=Debug\ncmake --build build/native\nctest --test-dir build/native --output-on-failure\n\n# --- WASM build ---\n# Prerequisites: Zig \u003e= 0.13.0, wabt (optional, for wasm-validate)\ncmake -B build/wasm \\\n    -DCMAKE_TOOLCHAIN_FILE=cmake/wasm32-wasi.cmake \\\n    -DCMAKE_BUILD_TYPE=Release\ncmake --build build/wasm\n\n# --- Serve locally ---\nmkdir -p build/site\ncp www/index.html www/style.css www/app.js build/site/\ncp build/wasm/paranoid.wasm build/site/\ncp build/wasm/BUILD_MANIFEST.json build/site/\npython3 -m http.server 8080 --directory build/site\n# Open http://localhost:8080\n```\n\n---\n\n## Architecture\n\nFor the full file map and component diagram, see [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md).\n\n### The Trust Boundary\n\nThere is exactly **ONE** trust boundary in the entire system — 3 lines of JavaScript:\n\n```javascript\n// WASI shim — the ONLY security-critical JavaScript\nrandom_get(ptr, len) {\n  crypto.getRandomValues(new Uint8Array(mem.buffer, ptr, len));\n  return 0;\n}\n```\n\nEverything above this runs in WASM linear memory. Everything below is the OS kernel.\n\nFor the complete entropy chain and supply chain security details, see\n[docs/SUPPLY-CHAIN.md](docs/SUPPLY-CHAIN.md) and [docs/BUILD.md](docs/BUILD.md).\n\n---\n\n## Threat Model\n\n`paranoid-passwd` treats the LLM that built it as an adversary. Six primary threats:\n\n| ID | Threat | Status |\n|----|--------|--------|\n| **T1** | Training data leakage (passwords biased toward breach dumps) | Mitigated via CSPRNG delegation |\n| **T2** | Token distribution bias (softmax non-uniformity) | Mitigated via rejection sampling |\n| **T3** | Deterministic reproduction (same prompt -\u003e same password) | Mitigated via hardware entropy |\n| **T4** | Prompt injection steering | Residual (code is LLM-authored) |\n| **T5** | Hallucinated security claims | **CRITICAL** — verify the math yourself |\n| **T6** | Screen/conversation exposure | Advisory (clear clipboard) |\n\n**T5 is the most dangerous** because it makes all other threats invisible. If the chi-squared implementation has a bug, the audit will still \"pass.\"\n\nRead the full threat model: [docs/THREAT-MODEL.md](docs/THREAT-MODEL.md)\n\n---\n\n## Security\n\n### Entropy Specifications\n\n| Metric | Value |\n|--------|-------|\n| **Password length** | 32 characters |\n| **Character set** | 94 printable ASCII |\n| **Entropy** | 209.75 bits |\n| **Search space** | 94^32 ~ 1.38 x 10^63 |\n| **Brute-force resistance** | 2.19 x 10^43 years @ 10^12 hash/s |\n| **Birthday paradox** | ~4.37 x 10^31 passwords for 50% collision |\n\n\u003e **Note**: These calculations assume the default 32-char, 94-symbol charset. Verify independently: entropy = log2(94) x 32 ≈ 209.75 bits. See [Honest Limitations](#honest-limitations) — this code was written by an LLM.\n\n### Statistical Audit (7 Layers)\n\n| Layer | Test | Purpose |\n|-------|------|---------|\n| 1 | **Chi-Squared** | Verifies character frequency matches expected uniform distribution |\n| 2 | **Serial Correlation** | Checks for positional dependencies (lag-1 autocorrelation) |\n| 3 | **Collision Detection** | Generates 500-password batch, verifies uniqueness via SHA-256 |\n| 4 | **Entropy Proofs** | Calculates log2(N) x L, validates against NIST standards |\n| 5 | **Birthday Paradox** | Computes collision probability for given batch size |\n| 6 | **Pattern Checks** | Detects runs, cycles, and trivial sequences |\n| 7 | **NIST Conformance** | Validates against SP 800-63B entropy requirements |\n\n### Reporting Security Issues\n\nSee [SECURITY.md](SECURITY.md) for our security policy and disclosure process.\n\n---\n\n## Honest Limitations\n\n\u003e **We believe in radical transparency about what this tool can and cannot guarantee.**\n\n1. **This code was written by an LLM.** The CSPRNG primitives (WASI `random_get`, OpenSSL `RAND_bytes`) are sound, but the glue code (rejection sampling, chi-squared approximations, struct offsets) could contain subtle errors.\n\n2. **Statistical tests are necessary but not sufficient.** Passing chi-squared proves consistency with randomness, not randomness itself.\n\n3. **Struct offset assumptions.** The JavaScript reader relies on hardcoded byte offsets. Runtime verification catches compiler mismatches, but if verification itself is wrong, JS reads garbage.\n\n4. **The WASI shim is 3 lines of JS that are not WASM-isolated.** A sufficiently motivated attacker controlling the browser could replace `crypto.getRandomValues`.\n\n5. **This threat model is not peer-reviewed.** The 6-threat taxonomy is LLM-derived, not from published research.\n\nRead all limitations: [AGENTS.md](AGENTS.md#honest-limitations)\n\n---\n\n## Documentation\n\n| Document | Purpose |\n|----------|---------|\n| [AGENTS.md](AGENTS.md) | LLM clean room protocols, hallucination patterns, verification checklists |\n| [STANDARDS.md](STANDARDS.md) | Code quality rules, style conventions |\n| [SECURITY.md](SECURITY.md) | Security policy, disclosure process, LLM threat model |\n| [CHANGELOG.md](CHANGELOG.md) | Version history and release notes |\n| [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) | System architecture diagrams and data flow |\n| [docs/DESIGN.md](docs/DESIGN.md) | Design decisions and rationale |\n| [docs/TESTING.md](docs/TESTING.md) | Test strategy, coverage, how to run |\n| [docs/BUILD.md](docs/BUILD.md) | CMake pipeline, SRI injection, reproducible builds |\n| [docs/SUPPLY-CHAIN.md](docs/SUPPLY-CHAIN.md) | SLSA Level 3 attestation, Cosign, SBOM, melange/apko |\n| [docs/THREAT-MODEL.md](docs/THREAT-MODEL.md) | Comprehensive threat analysis (18 threats) |\n| [docs/AUDIT.md](docs/AUDIT.md) | Statistical audit methodology (7 layers) |\n| [docs/STATE.md](docs/STATE.md) | Current development state and planned work |\n\n---\n\n## Contributing\n\nWe welcome:\n\n- **Cryptographer review** of `src/paranoid.c` (especially rejection sampling and chi-squared)\n- **Struct layout verification** (compare offsets against `wasm-objdump` output)\n- **Additional statistical tests** (NIST SP 800-22, Dieharder)\n- **New LLM threat vectors** as the field evolves\n- **Accessibility improvements** to the web frontend\n\nSee [docs/TESTING.md](docs/TESTING.md) for development setup, build commands, and contributing guidelines.\n\n### Security Policy\n\nContributions that weaken the security posture will be rejected:\n- Removing fail-closed behavior\n- Replacing CSPRNG with PRNG\n- Removing/weakening statistical tests\n- Suppressing threat model warnings\n- Unpinning GitHub Actions from commit SHAs\n\n---\n\n## License\n\nMIT License — see [LICENSE](LICENSE) for details.\n\nRead the full honest limitations in [AGENTS.md](AGENTS.md).\n\n---\n\n**Built with transparency. Audited with paranoia.**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbcom%2Fparanoid-passwd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjbcom%2Fparanoid-passwd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjbcom%2Fparanoid-passwd/lists"}