public static uint[] ToUints(byte[] bytes) { Deserializer deserializer = new Deserializer(bytes); uint[] uints = new uint[5]; uints[0] = deserializer.ReadUInt32(); uints[1] = deserializer.ReadUInt32(); uints[2] = deserializer.ReadUInt32(); uints[3] = deserializer.ReadUInt32(); uints[4] = deserializer.ReadUInt32(); return uints; }
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[] {}; }