From c151198e9477d930e0758e2d8db81b41354373c1 Mon Sep 17 00:00:00 2001 From: WardPearce Date: Sat, 14 Feb 2026 05:02:07 +1300 Subject: [PATCH] Derive login hash in background --- materialious/package-lock.json | 7 + materialious/package.json | 1 + materialious/src/lib/api/backend.ts | 26 ++- .../routes/(app)/internal/login/+page.svelte | 157 ++++++++++-------- .../internal/login/workers/derivePassword.ts | 17 ++ 5 files changed, 126 insertions(+), 82 deletions(-) create mode 100644 materialious/src/routes/(app)/internal/login/workers/derivePassword.ts diff --git a/materialious/package-lock.json b/materialious/package-lock.json index 77daf739..075729ec 100644 --- a/materialious/package-lock.json +++ b/materialious/package-lock.json @@ -27,6 +27,7 @@ "buffer": "^6.0.3", "capacitor-music-controls-plugin": "^6.1.0", "capacitor-nodejs": "https://github.com/hampoelz/capacitor-nodejs/releases/download/v1.0.0-beta.9/capacitor-nodejs.tgz", + "comlink": "^4.4.2", "cookie-signature": "^1.2.2", "dayjs": "^1.11.19", "dexie": "^4.2.1", @@ -6340,6 +6341,12 @@ "node": ">= 0.8" } }, + "node_modules/comlink": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/comlink/-/comlink-4.4.2.tgz", + "integrity": "sha512-OxGdvBmJuNKSCMO4NTl1L47VRp6xn2wG4F/2hYzB6tiCb709otOxtEYCSvK80PtjODfXXZu8ds+Nw5kVCjqd2g==", + "license": "Apache-2.0" + }, "node_modules/commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", diff --git a/materialious/package.json b/materialious/package.json index c889a2f0..5450ac1d 100644 --- a/materialious/package.json +++ b/materialious/package.json @@ -72,6 +72,7 @@ "buffer": "^6.0.3", "capacitor-music-controls-plugin": "^6.1.0", "capacitor-nodejs": "https://github.com/hampoelz/capacitor-nodejs/releases/download/v1.0.0-beta.9/capacitor-nodejs.tgz", + "comlink": "^4.4.2", "cookie-signature": "^1.2.2", "dayjs": "^1.11.19", "dexie": "^4.2.1", diff --git a/materialious/src/lib/api/backend.ts b/materialious/src/lib/api/backend.ts index bee4e095..4b56b0b9 100644 --- a/materialious/src/lib/api/backend.ts +++ b/materialious/src/lib/api/backend.ts @@ -111,22 +111,19 @@ export async function postSubscribeBackend(authorId: string) { if (resp.ok) parseChannelRSS(authorId); } +export type DerivePassword = (rawPassword: string, passwordSalt: Uint8Array) => Promise; + export async function createUserBackend( username: string, rawPassword: string, - captchaPayload: string + captchaPayload: string, + derivePassword: DerivePassword ): Promise { await sodium.ready; const passwordSalt = sodium.randombytes_buf(sodium.crypto_pwhash_SALTBYTES); - const loginHash = sodium.crypto_pwhash( - 32, - rawPassword, - passwordSalt, - sodium.crypto_pwhash_OPSLIMIT_SENSITIVE, - sodium.crypto_pwhash_MEMLIMIT_SENSITIVE, - sodium.crypto_pwhash_ALG_DEFAULT - ); + + const loginHash = await derivePassword(rawPassword, passwordSalt); const decryptionKeySalt = sodium.randombytes_buf(sodium.crypto_pwhash_SALTBYTES); const rawDecryptionKey = sodium.crypto_pwhash( @@ -175,7 +172,8 @@ export async function createUserBackend( export async function loginUserBackend( username: string, rawPassword: string, - captchaPayload: string + captchaPayload: string, + derivePassword: DerivePassword ): Promise { await sodium.ready; @@ -184,13 +182,9 @@ export async function loginUserBackend( const passwordSalts = await passwordSaltsResp.json(); - const loginHash = sodium.crypto_pwhash( - 32, + const loginHash = await derivePassword( rawPassword, - sodium.from_base64(passwordSalts.passwordSalt), - sodium.crypto_pwhash_OPSLIMIT_SENSITIVE, - sodium.crypto_pwhash_MEMLIMIT_SENSITIVE, - sodium.crypto_pwhash_ALG_DEFAULT + sodium.from_base64(passwordSalts.passwordSalt) ); const loginResp = await fetch('/api/user/login', { diff --git a/materialious/src/routes/(app)/internal/login/+page.svelte b/materialious/src/routes/(app)/internal/login/+page.svelte index 5b9fb34e..f2c4a9dc 100644 --- a/materialious/src/routes/(app)/internal/login/+page.svelte +++ b/materialious/src/routes/(app)/internal/login/+page.svelte @@ -1,9 +1,12 @@ - +{/if}