Example #1
0
        public static void DecryptPacket(ClientState state, byte[] packet)
        {
            using (var reader = new Reader(packet))
            {
                var ID = reader.ReadUInt16();
                reader.Seek(3, SeekOrigin.Current);
                var Version = reader.ReadUInt16();

                byte[] cipherText = reader.ReadAllBytes, plainText;

                var Name = Packet_Names.GetName(ID);

                switch (ID)
                {
                case 20100:
                case 20103:
                {
                    plainText = cipherText;

                    break;
                }

                case 20104:
                {
                    var nonce = GenericHash.Hash(
                        state.Nonce.Concat(state.ClientKey.PublicKey).Concat(state.ServerKey).ToArray(), null, 24);

                    plainText = PublicKeyBox.Open(cipherText, nonce, state.ClientKey.PrivateKey, state.ServerKey);

                    state.ServerState.Nonce     = plainText.Take(24).ToArray();
                    state.ServerState.SharedKey = plainText.Skip(24).Take(32).ToArray();

                    plainText = plainText.Skip(24).Skip(32).ToArray();

                    break;
                }

                default:
                {
                    state.ServerState.Nonce = Utilities.Increment(Utilities.Increment(state.ServerState.Nonce));

                    plainText = SecretBox.Open(new byte[16].Concat(cipherText).ToArray(), state.ServerState.Nonce,
                                               state.ServerState.SharedKey);

                    break;
                }
                }

                ServerCrypto.EncryptPacket(state.ServerState, ID, Version, plainText);

                Console.WriteLine(
                    $"[{DateTime.Now.ToLongTimeString()}, SERVER, {ID}] {Resources.Definition.Decode(new Reader(plainText), ID)}");

                Logger.Write(BitConverter.ToString(plainText).Replace("-", string.Empty), $"{ID}_{Name}",
                             LogType.PACKET);
            }
        }