Files
bitlogin/docs
thePR0M3TH3ANandClaude Opus 5 b85e1572ea Pin fail-closed RNG behaviour and randomUniformInt's uniformity
crypto/random.ts is the single chokepoint for every secret this codebase
mints -- recovery entropy, everyday keys, vault roots, AEAD nonces, account
ids, generated passphrases. It is correct today: it throws when no secure
source exists rather than falling back, and rejection-samples to avoid modulo
bias. Nothing in CI would have reported it if either stopped being true.

That is the gap this closes. The existing suite is strong on known-answer
vectors -- HKDF, ScalarExpand, Argon2id, BIP-39, Schnorr, GCM tamper
detection, NIP-44 official vectors -- but every one of them is satisfied by a
deterministic stream. Same input, same output. That is exactly how a
predictable RNG survives a health check that only asks whether the output
looks random.

Adds two blocks, nine tests:

- Fail-closed: no crypto object, crypto without getRandomValues, and
  getRandomValues present but not callable must each throw, and
  randomEntropy128 / generatePrivateKey / randomUniformInt must abort rather
  than substitute a value. Plus a check that normal operation resumes once a
  source is available again, so the guard cannot be satisfied by breaking
  everything permanently.
- Uniformity: chi-square over 200k draws at modulus 94, full-range coverage
  at the EFF wordlist modulus of 7776, rejection of invalid bounds, and the
  degenerate modulus of 1.

Both mutation-verified rather than assumed. Replacing the throw with a
zero-filling stub turns five fail-closed tests red. Replacing rejection
sampling with a bare `value % maxExclusive` gives chi-square 5614 against a
threshold of 147 -- while leaving every other test in the suite green, which
is the whole reason the distribution test has to exist.

Tests only; no source or behaviour change. Suite 172 -> 181.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01HtNMsKzzFTPURemX7tT19u
2026-07-31 16:29:21 -04:00
..

BitLogin Documentation

BitLogin is a static, relay-backed portable account protocol that gives users a familiar login name and password while preserving a user-controlled Nostr identity and independent phrase recovery.

This directory contains the core protocol specification, implementation notes, and experimental designs for expanding BitLogin into a portable account layer for compatible applications.

Core protocol

Portable account layer

These documents describe proposed capabilities that build on BitLogin's core identity and recovery model.

  • account-switching.md — multiple independent accounts on one device, fast switching, locking, logout, and account-aware signer behavior
  • portable-app-state.md — encrypted, user-owned application settings and lightweight state that follow the account across devices
  • portable-entitlements.md — discovery, verification, recovery, and presentation of purchases, licenses, memberships, and access rights
  • relay-and-messaging-portability.md — relay-role management, DM inbox and outbox synchronization, sent-message recovery, and conversation reconstruction

Connection Vault

The Connection Vault stores portable application credentials outside the core identity capsules as independently encrypted records. Its protocol layer (records, key hierarchy, relay sync, migration, tiers) is implemented in @bitlogin/core's src/vault/; the widget authorization layer shipped 2026-07-30 in REVEAL mode (requestNwcConnection, offerNwcConnection, and a Wallet-connections screen). Durable per-origin grants and a Connected-apps page are still to come; see connection-vault.md §19 for the open limitations.

  • connection-vault.md — overall vault architecture, key hierarchy, relay storage, authorization, recovery, and deletion; §18 records the implementation-time decisions (tier model, sudo key)
  • vault-ux.md — the agreed user-experience walkthroughs, serving as the authorization layer's acceptance criteria
  • nwc-connections.md — Nostr Wallet Connect credential profile (parser/exporter implemented in src/vault/nwc.ts)
  • s3c-format.md — portable s3c1: format for S3-compatible storage connections

How the pieces fit together

BitLogin account
├── Identity and recovery
│   ├── Credential capsule
│   ├── Recovery capsule
│   └── Everyday Nostr identity
│
├── Accounts and sessions
│   └── Multiple-account switching
│
├── Communication
│   ├── Relay preferences
│   ├── DM inbox synchronization
│   ├── DM outbox and sent-message recovery
│   └── Conversation reconstruction
│
├── Portable application experience
│   ├── App settings
│   ├── Saved state
│   └── Per-app authorization
│
├── Ownership
│   ├── Purchases
│   ├── Licenses
│   ├── Memberships
│   └── Access entitlements
│
└── Connection Vault
    ├── NWC wallet connections
    ├── S3-compatible storage connections
    └── Future service credentials

Status terminology

Documents use these labels:

  • Implemented — available in the current codebase
  • Partially implemented — some required primitives or flows exist, but the complete user-facing feature does not
  • Experimental design — documented for review and future implementation; wire formats and APIs may change

Experimental documents are not part of the stable BitLogin protocol until their schemas, security properties, migrations, and test vectors are finalized.

A practical development sequence is:

  1. Complete the core account and messaging foundations.
  2. Add independent multi-account sessions and switching.
  3. Add relay management, inbox synchronization, and sent-message recovery.
  4. Add portable application state and per-app permissions.
  5. Add entitlement discovery and a portable ownership library.
  6. Implement the Connection Vault and its NWC and S3 profiles.
  7. Move high-value authorization into stronger extension, native, or cross-origin execution boundaries.

Design principle

BitLogin should coordinate portable identity, state, ownership, and service access without becoming the centralized custodian of the user's identity, money, files, messages, or purchases.