Exemplo n.º 1
0
        public static async void HandleProofResponse(ProofResponse proofResponse, AuthSession session)
        {
            for (int i = 0; i < proofResponse.ModuleCount; i++)
            {
                if (proofResponse.State == PasswordModuleState.ClientChallenge)
                {
                    if (session.GameAccount == null && session.GameAccounts?.Count > 1)
                    {
                        session.GameAccount = session.GameAccounts.SingleOrDefault(ga =>
                                                                                   ga.Game + ga.Index == proofResponse.GameAccountGame &&
                                                                                   ga.Region == proofResponse.GameAccountRegion);

                        var proofRequest = new ProofRequest { AccountRegion = session.Account.Region };

                        proofRequest.Modules.Add(new RiskFingerprintModule
                        {
                            AccountRegion = proofRequest.AccountRegion,
                            Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "RiskFingerprint" && m.System == session.Platform)
                        });

                        await session.Send(proofRequest);

                        return;
                    }
                    else
                        session.GameAccount = session.GameAccounts[0];

                    if (session.GameAccount == null)
                        await SendAuthComplete(true, AuthResult.NoGameAccount, session);
                    else if (!session.GameAccount.IsOnline)
                    {
                        await SendAuthComplete(false, AuthResult.GlobalSuccess, session);

                        session.GameAccount.IsOnline = true;
                    }

                }
                else if (proofResponse.State == PasswordModuleState.ClientProof)
                {
                    session.SecureRemotePassword.CalculateU(proofResponse.A);
                    session.SecureRemotePassword.CalculateClientM(proofResponse.A);

                    if (session.SecureRemotePassword.ClientM.Compare(proofResponse.M1))
                    {
                        session.SecureRemotePassword.CalculateServerM(proofResponse.M1);

                        // Assign valid game accounts for the account
                        if (session.Account.GameAccounts != null)
                            session.GameAccounts = session.Account.GameAccounts.Where(ga => ga.Game == session.Program).ToList();

                        await SendProofValidation(session, proofResponse.ClientChallenge);
                    }
                    else
                        await SendAuthComplete(true, AuthResult.BadLoginInformation, session);
                }
            }
        }
Exemplo n.º 2
0
        public static async Task SendProofRequest(AuthSession session)
        {
            session.SecureRemotePassword = new SRP6a(session.Account.Salt, session.Account.Email, session.Account.PasswordVerifier);
            session.SecureRemotePassword.CalculateB();

            var proofRequest = new ProofRequest { AccountRegion = session.Account.Region };

            var thumbprintModule = new ThumbprintModule
            {
                AccountRegion = proofRequest.AccountRegion,
                Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "Thumbprint" && m.System == session.Platform),
            };

            thumbprintModule.ModuleData = thumbprintModule.Data.Data.ToByteArray();

            proofRequest.Modules.Add(thumbprintModule);
            proofRequest.Modules.Add(new PasswordModule
            {
                AccountRegion = proofRequest.AccountRegion,
                Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "Password" && m.System == session.Platform),
                SecureRemotePassword = session.SecureRemotePassword,
                State = PasswordModuleState.ServerChallenge
            });

            await session.Send(proofRequest);
        }
Exemplo n.º 3
0
        public static async Task SendProofValidation(AuthSession session, byte[] clientChallenge)
        {
            var proofRequest = new ProofRequest { AccountRegion = session.Account.Region };

            proofRequest.Modules.Add(new PasswordModule
            {
                Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "Password" && m.System == session.Platform),
                State = PasswordModuleState.ValidateProof,
                AccountRegion = proofRequest.AccountRegion,
                SecureRemotePassword = session.SecureRemotePassword, 
                Size = 161
            });

            /// SelectGameAccount module
            if (session.GameAccounts?.Count > 1)
            {
                var gameAccountBuffer = new AuthPacket();

                gameAccountBuffer.Write(0, 8);
                gameAccountBuffer.Write(session.GameAccounts.Count, 8);

                session.GameAccounts.ForEach(ga =>
                {
                    gameAccountBuffer.Write(ga.Region, 8);
                    gameAccountBuffer.WriteString(ga.Game + ga.Index, 8, false);
                });

                gameAccountBuffer.Finish();

                proofRequest.Modules.Add(new SelectGameAccountModule
                {
                    Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "SelectGameAccount" && m.System == session.Platform),
                    AccountRegion = proofRequest.AccountRegion,
                    GameAccountData = gameAccountBuffer.Data,
                    Size = (uint)gameAccountBuffer.Data.Length
                });
            }
            else
                proofRequest.Modules.Add(new RiskFingerprintModule
                {
                    Data = Manager.ModuleMgr.Modules.SingleOrDefault(m => m.Name == "RiskFingerprint" && m.System == session.Platform)
                });

            await session.Send(proofRequest);
        }