public static bool TryDecrypt(byte[] data, out ZoneTicket ticket) { ticket = default(ZoneTicket); using (var ms = new MemoryStream()) { var decryptor = _rijndael.CreateDecryptor(_rijndael.Key, _rijndael.IV); using (var cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Write)) { cs.Write(data, 0, data.Length); } var decryptedData = ms.ToArray(); var ticketData = decryptedData.Skip(_md5HashSize).ToArray(); var size = Marshal.SizeOf(ticket); if (ticketData.Length != size) { return(false); } if (!decryptedData.Take(_md5HashSize).SequenceEqual(_md5.ComputeHash(ticketData))) { return(false); } ticket = ticketData.ToStruct <ZoneTicket>(); return(true); } }
public void SendReplyCommand(Character character, Player player, Command replyCommand) { Logger.Info("[Zone EQ] start sending reply command. player: " + player.Eid + " character:" + character.Id + " reply:" + replyCommand); var result = new Dictionary <string, object> { { k.characterID, character.Id }, { k.rootEID, character.Eid }, { k.corporationEID, character.CorporationEid }, { k.allianceEID, character.AllianceEid }, { k.zone, new Dictionary <string, object> { { k.robot, player.ToDictionary() }, { k.guid, ZoneTicket.CreateAndEncryptFor(character) }, { k.plugin, _zone.Configuration.PluginName }, { k.decor, _zone.DecorHandler.DecorObjectsToDictionary() }, { k.plants, _zone.Configuration.PlantRules.GetPlantInfoForClient() }, { k.buildings, _zone.GetBuildingsDictionaryForCharacter(player.Character) } } } }; Message.Builder.SetCommand(replyCommand) .WithData(result) .WrapToResult() .ToCharacter(character) .Send(); Logger.Info("[Zone EQ] end sending reply command. player: " + player.Eid + " character:" + character.Id + " reply:" + replyCommand); }
private static byte[] Encrypt(ZoneTicket ticket) { using (var ms = new MemoryStream()) { var encryptor = _rijndael.CreateEncryptor(_rijndael.Key, _rijndael.IV); using (var cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) { var e = ticket.ToByteArray(); var h = _md5.ComputeHash(e); cs.Write(h, 0, h.Length); cs.Write(e, 0, e.Length); } return(ms.ToArray()); } }
private void HandleAuth(Packet packet) { packet.ReadInt(); // mar nem kell var count = (int)(packet.Length - packet.Position) - sizeof(long); var encrypted = packet.ReadBytes(count); var character = ZoneTicket.GetCharacterFromEncryptedTicket(encrypted); character.ThrowIfEqual(null, ErrorCodes.WTFErrorMedicalAttentionSuggested); Logger.Info($"Socket authentication successful. zone: {_zone.Id} character: {character.Id}"); Character = character; AccessLevel = character.AccessLevel; if (!_zone.TryGetPlayer(character, out Player player)) { // nincs kint a terepen ezert betoltjuk player = Player.LoadPlayerAndAddToZone(_zone, character); } var session = player.Session as ZoneSession; session?.OnStopped(); _beamsMonitor = new BeamsMonitor(this); _beamsMonitor.Subscribe(_zone.Beams); _weatherMonitor = Observer <Packet> .Create(OnWeatherUpdated); _zone.Weather.Subscribe(_weatherMonitor); _terrainUpdateNotifier = CreateTerrainNotifier(player); player.SetSession(this); player.SendInitSelf(); player.ApplyTeleportSicknessEffect(); player.ApplyInvulnerableEffect(); _player = player; }