vMangos SRP6 in JavaScript - Twigie/vmangos_guides GitHub Wiki
Thank you Microsoft Copilot, and masterking32/WoWSimpleRegistration
import crypto from 'crypto';
import { BigInteger } from 'jsbn';
export function calculateSRP6Verifier(username, password, salt) {
salt = Buffer.from(salt,'hex')
const g = new BigInteger('7');
const N = new BigInteger('894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7', 16);
const h1 = crypto.createHash('sha1').update(Buffer.from(`${username.toUpperCase()}:${password.toUpperCase()}`)).digest();
let h2 = crypto.createHash('sha1').update(Buffer.concat([Buffer.from(salt).reverse(), h1])).digest(); // From haukw
const h2BigInt = new BigInteger(h2.reverse().toString('hex'), 16);
const verifier = g.modPow(h2BigInt, N);
let verifierBytes = Buffer.from(verifier.toByteArray().reverse());
if (verifierBytes.length > 32) {
verifierBytes = verifierBytes.slice(0, 32);
} else {
verifierBytes = Buffer.concat([verifierBytes, Buffer.alloc(32 - verifierBytes.length)], 32);
}
verifierBytes = verifierBytes.reverse();
return verifierBytes.toString('hex').toUpperCase();
}