mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-04-16 10:04:42 +03:00
feat(net): hook up prove version for grunt logins
This commit is contained in:
parent
60943f6abf
commit
19a7e1997b
@ -114,8 +114,8 @@ int32_t Grunt::ClientLink::CmdAuthLogonChallenge(CDataStore& msg) {
|
||||
uint8_t* salt;
|
||||
msg.GetDataInSitu(reinterpret_cast<void*&>(salt), 32);
|
||||
|
||||
uint8_t* crcSalt;
|
||||
msg.GetDataInSitu(reinterpret_cast<void*&>(crcSalt), 16);
|
||||
uint8_t* versionChallenge;
|
||||
msg.GetDataInSitu(reinterpret_cast<void*&>(versionChallenge), 16);
|
||||
|
||||
// TODO
|
||||
// if (!msg.Sub8CBBF0(1)) {
|
||||
@ -197,7 +197,7 @@ int32_t Grunt::ClientLink::CmdAuthLogonChallenge(CDataStore& msg) {
|
||||
// TODO
|
||||
// this->m_clientResponse->SetMatrixInfo(logonFlags & 0x2, matrixWidth, matrixHeight, matrixDigitCount, matrixDigitCount, 0, matrixChallengeCount, matrixSeed, this->m_srpClient.buf20, 40);
|
||||
this->m_clientResponse->SetTokenInfo(logonFlags & 0x4, tokenRequired);
|
||||
this->m_clientResponse->GetVersionProof(crcSalt);
|
||||
this->m_clientResponse->GetVersionProof(versionChallenge);
|
||||
}
|
||||
|
||||
return 2;
|
||||
@ -321,6 +321,37 @@ void Grunt::ClientLink::PackLogon(CDataStore& msg, const Logon& logon) {
|
||||
msg.Set(startPos, msg.m_size - startPos - 2);
|
||||
}
|
||||
|
||||
void Grunt::ClientLink::ProveVersion(const uint8_t* versionChecksum) {
|
||||
CDataStoreCache<1024> command;
|
||||
|
||||
// TODO cd keys
|
||||
// Grunt::CdKey cdKeys;
|
||||
// if (!this->m_loginResponse->GetCdKeys(cdKeys)) {
|
||||
// cdKeys.int0 = 0;
|
||||
// }
|
||||
|
||||
if (this->m_state == 4) {
|
||||
command.Put(static_cast<uint8_t>(CMD_AUTH_LOGON_PROOF));
|
||||
command.PutData(this->m_srpClient.clientPublicKey, sizeof(this->m_srpClient.clientPublicKey));
|
||||
command.PutData(this->m_srpClient.clientProof, sizeof(this->m_srpClient.clientProof));
|
||||
|
||||
uint8_t versionProof[SHA1_DIGEST_SIZE];
|
||||
SHA1_CONTEXT ctx;
|
||||
SHA1_Init(&ctx);
|
||||
SHA1_Update(&ctx, this->m_srpClient.clientPublicKey, sizeof(this->m_srpClient.clientPublicKey));
|
||||
SHA1_Update(&ctx, versionChecksum, 20);
|
||||
SHA1_Final(versionProof, &ctx);
|
||||
command.PutData(versionProof, sizeof(versionProof));
|
||||
|
||||
// TODO cd keys
|
||||
command.Put(static_cast<uint8_t>(0));
|
||||
} else {
|
||||
// TODO
|
||||
}
|
||||
|
||||
this->Send(command);
|
||||
}
|
||||
|
||||
void Grunt::ClientLink::Send(CDataStore& msg) {
|
||||
this->m_critSect.Enter();
|
||||
|
||||
|
@ -69,6 +69,7 @@ class Grunt::ClientLink : public WowConnectionResponse, Grunt::Pending, Grunt::T
|
||||
void Disconnect();
|
||||
void LogonNewSession(const Logon& logon);
|
||||
void PackLogon(CDataStore& msg, const Logon& logon);
|
||||
void ProveVersion(const uint8_t* versionChecksum);
|
||||
void Send(CDataStore& msg);
|
||||
void SetState(int32_t state);
|
||||
};
|
||||
|
@ -11,7 +11,7 @@ class Grunt::ClientResponse {
|
||||
virtual bool Connected(const NETADDR& addr) = 0;
|
||||
virtual bool OnlineIdle() = 0;
|
||||
virtual void GetLogonMethod() = 0;
|
||||
virtual void GetVersionProof(const uint8_t* crcSalt) = 0;
|
||||
virtual void GetVersionProof(const uint8_t* versionChallenge) = 0;
|
||||
virtual void SetPinInfo(bool enabled, uint32_t a3, const uint8_t* a4) = 0;
|
||||
virtual void SetMatrixInfo(bool enabled, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, bool a7, uint8_t a8, uint64_t a9, const uint8_t* a10, uint32_t a11) = 0;
|
||||
virtual void SetTokenInfo(bool enabled, uint8_t required) = 0;
|
||||
@ -19,6 +19,7 @@ class Grunt::ClientResponse {
|
||||
virtual LOGIN_STATE NextSecurityState(LOGIN_STATE state) = 0;
|
||||
virtual void GetRealmList() = 0;
|
||||
virtual void Logon(const char* a2, const char* a3) = 0;
|
||||
virtual void ProveVersion(const uint8_t* versionChecksum) = 0;
|
||||
virtual void Logoff() = 0;
|
||||
virtual void Init(LoginResponse* loginResponse) = 0;
|
||||
};
|
||||
|
@ -88,11 +88,11 @@ void GruntLogin::GetRealmList() {
|
||||
// TODO
|
||||
}
|
||||
|
||||
void GruntLogin::GetVersionProof(const uint8_t* crcSalt) {
|
||||
void GruntLogin::GetVersionProof(const uint8_t* versionChallenge) {
|
||||
if (this->IsReconnect()) {
|
||||
// TODO
|
||||
} else {
|
||||
memcpy(this->m_crcSalt, crcSalt, sizeof(this->m_crcSalt));
|
||||
memcpy(this->m_versionChallenge, versionChallenge, sizeof(this->m_versionChallenge));
|
||||
LOGIN_STATE nextState = this->NextSecurityState(LOGIN_STATE_FIRST_SECURITY);
|
||||
this->m_loginResponse->UpdateLoginStatus(nextState, LOGIN_OK, nullptr, 0);
|
||||
}
|
||||
@ -144,6 +144,32 @@ LOGIN_STATE GruntLogin::NextSecurityState(LOGIN_STATE state) {
|
||||
return LOGIN_STATE_CHECKINGVERSIONS;
|
||||
}
|
||||
|
||||
void GruntLogin::ProveVersion(const uint8_t* versionChecksum) {
|
||||
if (!this->m_loggedOn) {
|
||||
return;
|
||||
}
|
||||
|
||||
this->m_clientLink->ProveVersion(versionChecksum);
|
||||
|
||||
this->m_loginResponse->m_loginState = LOGIN_STATE_HANDSHAKING;
|
||||
this->m_loginResponse->m_loginResult = LOGIN_OK;
|
||||
|
||||
char stateStr[64];
|
||||
SStrCopy(stateStr, Grunt::g_LoginStateStringNames[LOGIN_STATE_HANDSHAKING], sizeof(stateStr));
|
||||
|
||||
char resultStr[64];
|
||||
SStrCopy(resultStr, Grunt::g_LoginResultStringNames[LOGIN_OK], sizeof(resultStr));
|
||||
|
||||
this->m_loginResponse->LoginServerStatus(
|
||||
LOGIN_STATE_HANDSHAKING,
|
||||
LOGIN_OK,
|
||||
nullptr,
|
||||
stateStr,
|
||||
resultStr,
|
||||
0
|
||||
);
|
||||
}
|
||||
|
||||
void GruntLogin::SetMatrixInfo(bool enabled, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, bool a7, uint8_t a8, uint64_t a9, const uint8_t* a10, uint32_t a11) {
|
||||
// TODO
|
||||
}
|
||||
|
@ -8,14 +8,14 @@
|
||||
class GruntLogin : public Login {
|
||||
public:
|
||||
// Member variables
|
||||
uint8_t m_crcSalt[16];
|
||||
uint8_t m_versionChallenge[16];
|
||||
Grunt::ClientLink* m_clientLink = nullptr;
|
||||
|
||||
// Virtual member functions
|
||||
virtual ~GruntLogin();
|
||||
virtual bool Connected(const NETADDR& addr);
|
||||
virtual void GetLogonMethod();
|
||||
virtual void GetVersionProof(const uint8_t* crcSalt);
|
||||
virtual void GetVersionProof(const uint8_t* versionChallenge);
|
||||
virtual void SetPinInfo(bool enabled, uint32_t a3, const uint8_t* a4);
|
||||
virtual void SetMatrixInfo(bool enabled, uint8_t a3, uint8_t a4, uint8_t a5, uint8_t a6, bool a7, uint8_t a8, uint64_t a9, const uint8_t* a10, uint32_t a11);
|
||||
virtual void SetTokenInfo(bool enabled, uint8_t tokenRequired);
|
||||
@ -23,6 +23,7 @@ class GruntLogin : public Login {
|
||||
virtual LOGIN_STATE NextSecurityState(LOGIN_STATE state);
|
||||
virtual void GetRealmList();
|
||||
virtual void Logon(const char* a2, const char* a3);
|
||||
virtual void ProveVersion(const uint8_t* versionChecksum);
|
||||
virtual void Logoff();
|
||||
virtual void Init(LoginResponse* loginResponse);
|
||||
};
|
||||
|
@ -8,6 +8,8 @@ class SRP6_Random;
|
||||
class SRP6_Client {
|
||||
public:
|
||||
// Member variables
|
||||
uint8_t clientPublicKey[32];
|
||||
uint8_t clientProof[20];
|
||||
uint8_t accountNameDigest[SHA1_DIGEST_SIZE];
|
||||
uint8_t interimDigest[SHA1_DIGEST_SIZE];
|
||||
SHA1_CONTEXT ctx;
|
||||
|
Loading…
Reference in New Issue
Block a user