mirror of
https://github.com/mangosfour/server.git
synced 2025-12-15 19:37:02 +00:00
[8445] Fixed redundant calculation of v and s on every login
The SRP-6 specifications clearly say, that v and s are only to be calculated on registering a user and changing his password; calculating them on every login is plain waste.
This commit is contained in:
parent
4d0088e7a9
commit
3b1b68595b
8 changed files with 47 additions and 60 deletions
|
|
@ -760,7 +760,7 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
|
|||
LocaleConstant locale;
|
||||
std::string account;
|
||||
Sha1Hash sha1;
|
||||
BigNumber v, s, g, N, x, I;
|
||||
BigNumber v, s, g, N;
|
||||
WorldPacket packet, SendAddonPacked;
|
||||
|
||||
BigNumber K;
|
||||
|
|
@ -792,12 +792,11 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
|
|||
"sessionkey, " //2
|
||||
"last_ip, " //3
|
||||
"locked, " //4
|
||||
"sha_pass_hash, " //5
|
||||
"v, " //6
|
||||
"s, " //7
|
||||
"expansion, " //8
|
||||
"mutetime, " //9
|
||||
"locale " //10
|
||||
"v, " //5
|
||||
"s, " //6
|
||||
"expansion, " //7
|
||||
"mutetime, " //8
|
||||
"locale " //9
|
||||
"FROM account "
|
||||
"WHERE username = '%s'",
|
||||
safe_account.c_str ());
|
||||
|
|
@ -816,57 +815,21 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
|
|||
|
||||
Field* fields = result->Fetch ();
|
||||
|
||||
expansion = ((sWorld.getConfig(CONFIG_EXPANSION) > fields[8].GetUInt8()) ? fields[8].GetUInt8() : sWorld.getConfig(CONFIG_EXPANSION));
|
||||
expansion = ((sWorld.getConfig(CONFIG_EXPANSION) > fields[7].GetUInt8()) ? fields[7].GetUInt8() : sWorld.getConfig(CONFIG_EXPANSION));
|
||||
|
||||
N.SetHexStr ("894B645E89E1535BBDAD5B8B290650530801B18EBFBF5E8FAB3C82872A3E9BB7");
|
||||
g.SetDword (7);
|
||||
I.SetHexStr (fields[5].GetString ());
|
||||
|
||||
//In case of leading zeros in the I hash, restore them
|
||||
uint8 mDigest[SHA_DIGEST_LENGTH];
|
||||
memset (mDigest, 0, SHA_DIGEST_LENGTH);
|
||||
|
||||
if (I.GetNumBytes () <= SHA_DIGEST_LENGTH)
|
||||
memcpy (mDigest, I.AsByteArray (), I.GetNumBytes ());
|
||||
|
||||
std::reverse (mDigest, mDigest + SHA_DIGEST_LENGTH);
|
||||
|
||||
s.SetHexStr (fields[7].GetString ());
|
||||
sha1.UpdateData (s.AsByteArray (), s.GetNumBytes ());
|
||||
sha1.UpdateData (mDigest, SHA_DIGEST_LENGTH);
|
||||
sha1.Finalize ();
|
||||
x.SetBinary (sha1.GetDigest (), sha1.GetLength ());
|
||||
v = g.ModExp (x, N);
|
||||
v.SetHexStr(fields[5].GetString());
|
||||
s.SetHexStr (fields[6].GetString ());
|
||||
|
||||
const char* sStr = s.AsHexStr (); //Must be freed by OPENSSL_free()
|
||||
const char* vStr = v.AsHexStr (); //Must be freed by OPENSSL_free()
|
||||
const char* vold = fields[6].GetString ();
|
||||
|
||||
DEBUG_LOG ("WorldSocket::HandleAuthSession: (s,v) check s: %s v_old: %s v_new: %s",
|
||||
DEBUG_LOG ("WorldSocket::HandleAuthSession: (s,v) check s: %s v: %s",
|
||||
sStr,
|
||||
vold,
|
||||
vStr);
|
||||
|
||||
loginDatabase.PExecute ("UPDATE account "
|
||||
"SET "
|
||||
"v = '0', "
|
||||
"s = '0' "
|
||||
"WHERE username = '%s'",
|
||||
safe_account.c_str ());
|
||||
|
||||
if (!vold || strcmp (vStr, vold))
|
||||
{
|
||||
packet.Initialize (SMSG_AUTH_RESPONSE, 1);
|
||||
packet << uint8 (AUTH_UNKNOWN_ACCOUNT);
|
||||
SendPacket (packet);
|
||||
delete result;
|
||||
OPENSSL_free ((void*) sStr);
|
||||
OPENSSL_free ((void*) vStr);
|
||||
|
||||
sLog.outBasic ("WorldSocket::HandleAuthSession: User not logged.");
|
||||
return -1;
|
||||
}
|
||||
|
||||
OPENSSL_free ((void*) sStr);
|
||||
OPENSSL_free ((void*) vStr);
|
||||
|
||||
|
|
@ -892,9 +855,9 @@ int WorldSocket::HandleAuthSession (WorldPacket& recvPacket)
|
|||
|
||||
K.SetHexStr (fields[2].GetString ());
|
||||
|
||||
time_t mutetime = time_t (fields[9].GetUInt64 ());
|
||||
time_t mutetime = time_t (fields[8].GetUInt64 ());
|
||||
|
||||
locale = LocaleConstant (fields[10].GetUInt8 ());
|
||||
locale = LocaleConstant (fields[9].GetUInt8 ());
|
||||
if (locale >= MAX_LOCALE)
|
||||
locale = LOCALE_enUS;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue