public byte[] Compress(byte[] buffer) { byte[] compressed = compressor.Compress(buffer); Serializer serializer = new Serializer(); serializer.Write((short)compressed.Length); serializer.Write((short)buffer.Length); serializer.Write(compressed); return serializer.GetBytes(); }
public static byte[] ToBytes(uint[] uints) { Serializer serializer = new Serializer(); serializer.Write(uints[0]); serializer.Write(uints[1]); serializer.Write(uints[2]); serializer.Write(uints[3]); serializer.Write(uints[4]); return serializer.GetBytes(); }
public byte[] Serialize(ISession session, IMessage message) { // serialize the data into a bytestream Serializer serializer = new Serializer(); message.Serialize(serializer); // postprocessing... byte[] compressed = this.compressor.Compress(serializer.GetBytes()); byte[] encrypted = this.encryptor.Encrypt(compressed); return encrypted; }
public IEnumerable<IMessage> Deserialize(ISession session, byte[] data) { Deserializer deserializer = new Deserializer(data); while (deserializer.BaseStream.Position < deserializer.BaseStream.Length) { byte header = deserializer.ReadByte(); byte length = deserializer.ReadByte(); switch (length) { case 0x05: // Version deserializer.BaseStream.Position += 2; /*this.clientVersion = */deserializer.ReadUInt32(); deserializer.BaseStream.Position += 56; // Probably wrong offset break; case 0x42: // PublicKey byte[] publicKey = deserializer.ReadBytes(64); byte[] sharedKey = DiffieHellman.GenerateSharedKey(publicKey, Keys.PrivateKey, Keys.Prime); byte[] randomBytes = CryptoUtils.GetRandomBytes(); byte[] hashedRandomBytes = CryptoUtils.Hash(randomBytes); byte[] xoredRandomBytes = CryptoUtils.XOR(randomBytes, sharedKey); this.key = hashedRandomBytes; Serializer serializer = new Serializer(); serializer.Write((byte)0x01); // RC4Seed Header serializer.Write((byte)0x16); // RC4Seed Length serializer.Write(xoredRandomBytes); // xored RC4Key session.Send(serializer.GetBytes()); session.State = prepareNewState(); break; default: Console.WriteLine("Unhandled packet, header: {0}, length: {1}", header, length); break; } } // mock up, since we return the byte-encoded messages directly return new IMessage[] {}; }