public async Task HandleAsync(ChannelReader <byte> reader, ChannelWriter <byte> writer, Client clientModel) { Requests.RS_LOGON_PROOF request = await RS_LOGON_PROOF_Reader.ReadAsync(reader); // Calculate U and M1 clientModel.AuthEngine.CalculateU(request.A); clientModel.AuthEngine.CalculateM1(); // AuthEngine.CalculateCRCHash() if (!clientModel.AuthEngine.M1.SequenceEqual(request.M1)) { // Wrong pass logger.Debug("Wrong password for user {0}.", clientModel.AccountName); await AUTH_LOGON_PROOF_Writer.WriteAsync(writer, new AUTH_LOGON_PROOF(AccountState.LOGIN_BAD_PASS)); } else { clientModel.AuthEngine.CalculateM2(request.M1); await AUTH_LOGON_PROOF_Writer.WriteAsync(writer, new AUTH_LOGON_PROOF( AccountState.LOGIN_OK, clientModel.AuthEngine.M2)); // Set SSHash in DB string sshash = string.Concat(clientModel.AuthEngine.SsHash.Select(x => x.ToString("X2"))); await accountStorage.UpdateAccountAsync(sshash, clientModel.RemoteEnpoint.Address.ToString(), Strings.Format(DateAndTime.Now, "yyyy-MM-dd"), clientModel.AccountName); logger.Debug("Auth success for user {0} [{1}]", clientModel.AccountName, sshash); } }