Files
recflare/packages/tools/src/password.spec.ts
T
2026-07-16 11:33:01 -04:00

28 lines
1.1 KiB
TypeScript

import { describe, expect, it } from 'vitest'
import { hashPassword, verifyPassword } from './password'
describe('password hashing', () => {
it('produces a base64 salt:hash pair', async () => {
const stored = await hashPassword('hunter2')
const [salt, hash] = stored.split(':')
expect(salt).toMatch(/^[A-Za-z0-9+/]+=*$/)
expect(hash).toMatch(/^[A-Za-z0-9+/]+=*$/)
})
it('round-trips a password it hashed', async () => {
const stored = await hashPassword('correct horse')
expect(await verifyPassword('correct horse', stored)).toBe(true)
expect(await verifyPassword('wrong horse', stored)).toBe(false)
})
// Golden vector: a `salt:hash` computed with the canonical parameters (PBKDF2-
// SHA256, 100k iterations, 256-bit). If this stops verifying, the CLI's hashing
// has drifted from @repo/domain and CLI-set passwords would fail at login.
it('verifies a hash produced with the canonical parameters', async () => {
const stored = 'BwcHBwcHBwcHBwcHBwcHBw==:QVZpoT+KgLqdTSvH1SI33TYsRXA/zkepPPmNBUZ8RyE='
expect(await verifyPassword('correct horse', stored)).toBe(true)
expect(await verifyPassword('nope', stored)).toBe(false)
})
})