diff --git a/web/packages/accounts/services/srp.ts b/web/packages/accounts/services/srp.ts index e3bb047a8f..5fdc412c66 100644 --- a/web/packages/accounts/services/srp.ts +++ b/web/packages/accounts/services/srp.ts @@ -258,6 +258,41 @@ export interface SRPSetupAttributes { loginSubKey: string; } +/** + * + * @param loginSubKey The user's SRP password (autogenerated, derived + * deterministically from their KEK by {@link deriveSRPPassword}). + * + * @returns + */ +export const generateSRPSetupAttributes = async ( + loginSubKey: string, +): Promise => { + const cryptoWorker = await sharedCryptoWorker(); + + const srpSalt = await cryptoWorker.generateDeriveKeySalt(); + + // Museum schema requires this to be a UUID. + const srpUserID = uuidv4(); + + const srpVerifierBuffer = SRP.computeVerifier( + SRP.params["4096"], + convertBase64ToBuffer(srpSalt), + Buffer.from(srpUserID), + convertBase64ToBuffer(loginSubKey), + ); + + const srpVerifier = convertBufferToBase64(srpVerifierBuffer); + + const result = { srpUserID, srpSalt, srpVerifier, loginSubKey }; + + log.debug( + () => `SRP setup attributes generated: ${JSON.stringify(result)}`, + ); + + return result; +}; + interface SetupSRPRequest { srpUserID: string; srpSalt: string; @@ -444,41 +479,6 @@ export const convertBase64ToBuffer = (base64: string) => { return Buffer.from(base64, "base64"); }; -/** - * - * @param loginSubKey The user's SRP password (autogenerated, derived - * deterministically from their KEK by {@link deriveSRPPassword}). - * - * @returns - */ -export const generateSRPSetupAttributes = async ( - loginSubKey: string, -): Promise => { - const cryptoWorker = await sharedCryptoWorker(); - - const srpSalt = await cryptoWorker.generateDeriveKeySalt(); - - // Museum schema requires this to be a UUID. - const srpUserID = uuidv4(); - - const srpVerifierBuffer = SRP.computeVerifier( - SRP.params["4096"], - convertBase64ToBuffer(srpSalt), - Buffer.from(srpUserID), - convertBase64ToBuffer(loginSubKey), - ); - - const srpVerifier = convertBufferToBase64(srpVerifierBuffer); - - const result = { srpUserID, srpSalt, srpVerifier, loginSubKey }; - - log.debug( - () => `SRP setup attributes generated: ${JSON.stringify(result)}`, - ); - - return result; -}; - export const loginViaSRP = async ( srpAttributes: SRPAttributes, kek: string,