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();
}