import { timingSafeEqual } from 'node:crypto'; export function generateUnbiasedDigits(length: number): string { const result: number[] = []; while (result.length < length) { const buffer = crypto.getRandomValues(new Uint8Array(length * 2)); for (const byte of buffer) { if (byte < 250 && result.length < length) { result.push(byte % 10); } } } return result.join(''); } export function timingSafeCompare(a: string, b: string): boolean { if (typeof a !== 'string' || typeof b !== 'string') { return false; } if (a.length !== b.length) { return false; } return timingSafeEqual(Buffer.from(a), Buffer.from(b)); }