Answers 'how do you get keys to login elsewhere' — both mechanisms, Signal/WhatsApp style: Server: - migration 0002: key_backups (recovery blobs) + provisions (QR relay), ciphertext only - routes/backup.js: POST/GET /api/backup, /backup/exists; provision new/get/complete - routes/keys.js: POST /api/keys/reset — atomically wipe stale prekeys + install fresh (fixes Bad MAC: restore regenerates prekey IDs that INSERT-OR-IGNORE kept stale) Crypto (crypto.js): - exportIdentityBlob/importIdentityBlob (identity travels only encrypted) - generateRecoveryCode (120-bit Crockford base32) + encrypt/decryptWithCode (PBKDF2 250k) - ephemeral ECDH (P-256) encrypt/decrypt for QR transfer Client (app.js): account-menu 'Set up recovery code' + 'Link a device' (camera scan via BarcodeDetector or paste); auth-screen 'Restore with recovery code' + 'Link from another device' (shows QR + code, polls, restores). Vendored qrcode-generator. All verified live end-to-end (3-process isolated-store integration tests): restore-from-code and QR-link both let a fresh device receive + decrypt messages. SW cache v3->v4. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
24 lines
676 B
JSON
24 lines
676 B
JSON
{
|
|
"name": "cipher",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"description": "Cipher — end-to-end encrypted messenger (Signal Protocol) on Cloudflare",
|
|
"type": "module",
|
|
"scripts": {
|
|
"dev": "wrangler dev",
|
|
"deploy": "wrangler deploy",
|
|
"db:migrate:local": "wrangler d1 migrations apply cipher --local",
|
|
"db:migrate": "wrangler d1 migrations apply cipher --remote"
|
|
},
|
|
"dependencies": {
|
|
"hono": "^4.6.14"
|
|
},
|
|
"devDependencies": {
|
|
"@privacyresearch/libsignal-protocol-typescript": "^0.0.16",
|
|
"buffer": "^6.0.3",
|
|
"esbuild": "^0.28.1",
|
|
"fake-indexeddb": "^6.2.5",
|
|
"qrcode-generator": "^2.0.4",
|
|
"wrangler": "^4.96.0"
|
|
}
|
|
}
|