Skip to content

Commit

Permalink
Trying to implement timed packet drops but the timing values aren't c…
Browse files Browse the repository at this point in the history
…onsistent or expected on the server
  • Loading branch information
lodicolo committed Jul 31, 2020
1 parent f6b4b58 commit 9bd53ef
Show file tree
Hide file tree
Showing 26 changed files with 458 additions and 183 deletions.
3 changes: 3 additions & 0 deletions Intersect (Core)/Intersect (Core).csproj
Expand Up @@ -306,9 +306,11 @@
<Compile Include="Models\INamedObject.cs" />
<Compile Include="Network\Ceras.cs" />
<Compile Include="Network\ConnectionPacket.cs" />
<Compile Include="Network\ConnectionStatistics.cs" />
<Compile Include="Network\Events\ConnectionEventArgs.cs" />
<Compile Include="Network\NetworkStatus.cs" />
<Compile Include="Network\PacketDispatcher.cs" />
<Compile Include="Network\Packets\AbstractTimedPacket.cs" />
<Compile Include="Network\Packets\Client\AbandonQuestPacket.cs" />
<Compile Include="Network\Packets\Client\ActivateEventPacket.cs" />
<Compile Include="Network\Packets\Client\AdminActionPacket.cs" />
Expand Down Expand Up @@ -579,6 +581,7 @@
<Compile Include="Utilities\TextUtils.cs" />
<Compile Include="Utilities\CSharpFeatures.cs" />
<Compile Include="Utilities\ReflectionUtils.cs" />
<Compile Include="Utilities\Timing.cs" />
<Compile Include="Utilities\ValueUtils.cs" />
<Compile Include="Utilities\VersionHelper.cs" />
<Compile Include="Localization\LocaleArgument.cs" />
Expand Down
3 changes: 3 additions & 0 deletions Intersect (Core)/Network/AbstractConnection.cs
Expand Up @@ -18,6 +18,7 @@ protected AbstractConnection(Guid? guid = null)
}

Guid = guid.Value;
Statistics = new ConnectionStatistics();
}

public Ceras Ceras { get; } = new Ceras(true);
Expand All @@ -43,6 +44,8 @@ public virtual void Dispose()

public abstract int Port { get; }

public ConnectionStatistics Statistics { get; }

public abstract bool Send(IPacket packet);

public virtual void HandleConnected()
Expand Down
36 changes: 31 additions & 5 deletions Intersect (Core)/Network/ConnectionPacket.cs
Expand Up @@ -3,6 +3,8 @@

using Ceras;

using Intersect.Utilities;

using JetBrains.Annotations;

#if INTERSECT_DIAGNOSTIC
Expand All @@ -11,10 +13,8 @@

namespace Intersect.Network
{

public abstract class ConnectionPacket : CerasPacket
{

protected const int SIZE_HANDSHAKE_SECRET = 32;

protected RSACryptoServiceProvider mRsa;
Expand All @@ -23,6 +23,10 @@ public abstract class ConnectionPacket : CerasPacket

protected byte[] mHandshakeSecret;

protected long mTimeMs;
protected long mRawTimeMs;
protected long mOffset;

protected ConnectionPacket()
{
}
Expand All @@ -32,6 +36,10 @@ protected ConnectionPacket(RSACryptoServiceProvider rsa, byte[] handshakeSecret)
mRsa = rsa ?? throw new ArgumentNullException();

mHandshakeSecret = handshakeSecret;

TimeMs = Timing.Global.TimeMs;
RawTimeMs = Timing.Global.RawTimeMs;
Offset = Timing.Global.Offset.Ticks / TimeSpan.TicksPerMillisecond;
}

[Exclude]
Expand All @@ -41,11 +49,31 @@ public byte[] HandshakeSecret
set => mHandshakeSecret = value;
}

[Exclude]
public long TimeMs
{
get => mTimeMs;
set => mTimeMs = value;
}

[Exclude]
public long RawTimeMs
{
get => mRawTimeMs;
set => mRawTimeMs = value;
}

[Exclude]
public long Offset
{
get => mOffset;
set => mOffset = value;
}

[Include, NotNull]
protected byte[] EncryptedData
{
get => mEncryptedData;

set => mEncryptedData = value;
}

Expand All @@ -68,7 +96,5 @@ protected static void DumpKey(RSAParameters parameters, bool isPublic)
Log.Diagnostic($"Q: {BitConverter.ToString(parameters.Q)}");
#endif
}

}

}
23 changes: 23 additions & 0 deletions Intersect (Core)/Network/ConnectionStatistics.cs
@@ -0,0 +1,23 @@
namespace Intersect.Network
{
public class ConnectionStatistics
{
public long Ping { get; set; }

public long DroppedMessages { get; set; }

public long ReceivedPackets { get; set; }

public long ReceivedBytes { get; set; }

public long ReceivedMessages { get; set; }

public long ResentMessages { get; set; }

public long SentPackets { get; set; }

public long SentBytes { get; set; }

public long SentMessages { get; set; }
}
}
10 changes: 5 additions & 5 deletions Intersect (Core)/Network/IConnection.cs
@@ -1,11 +1,11 @@
using System;
using JetBrains.Annotations;

using System;

namespace Intersect.Network
{

public interface IConnection : IDisposable
{

Guid Guid { get; }

Ceras Ceras { get; }
Expand All @@ -16,14 +16,14 @@ public interface IConnection : IDisposable

int Port { get; }

[NotNull] ConnectionStatistics Statistics { get; }

bool Send(IPacket packet);

void HandleConnected();

void HandleApproved();

void HandleDisconnected();

}

}
26 changes: 26 additions & 0 deletions Intersect (Core)/Network/Packets/AbstractTimedPacket.cs
@@ -0,0 +1,26 @@

using System;

using Intersect.Utilities;

namespace Intersect.Network.Packets
{
public abstract class AbstractTimedPacket : CerasPacket
{
protected AbstractTimedPacket()
{
TimeMs = Timing.Global.TimeMs;
RealTimeMs = Timing.Global.RealTimeMs;
RawTimeMs = Timing.Global.RawTimeMs;
OffsetMs = Timing.Global.Offset.Ticks / TimeSpan.TicksPerMillisecond;
}

public long TimeMs { get; set; }

public long RealTimeMs { get; set; }

public long RawTimeMs { get; set; }

public long OffsetMs { get; set; }
}
}
40 changes: 31 additions & 9 deletions Intersect (Core)/Network/Packets/ApprovalPacket.cs
Expand Up @@ -55,19 +55,24 @@ public byte[] AesKey

public override bool Encrypt()
{
using (var approvalBuffer = new MemoryBuffer())
using (var buffer = new MemoryBuffer())
{
#if INTERSECT_DIAGNOSTIC
Log.Debug($"Handshake secret: {BitConverter.ToString(HandshakeSecret)}.");
Log.Debug($"Specified AES Key: {BitConverter.ToString(AesKey)}");
Log.Debug($"Assigning UUID: {Guid}).");
#endif
approvalBuffer.Write(HandshakeSecret, SIZE_HANDSHAKE_SECRET);
approvalBuffer.Write(AesKey, SIZE_AES_KEY);
approvalBuffer.Write(Guid.ToByteArray(), SIZE_GUID);
buffer.Write(HandshakeSecret, SIZE_HANDSHAKE_SECRET);
buffer.Write(AesKey, SIZE_AES_KEY);
buffer.Write(Guid.ToByteArray(), SIZE_GUID);
buffer.Write(TimeMs);
#if DEBUG
buffer.Write(RawTimeMs);
buffer.Write(Offset);
#endif

Debug.Assert(mRsa != null, "mRsa != null");
EncryptedData = mRsa.Encrypt(approvalBuffer.ToArray(), true) ??
EncryptedData = mRsa.Encrypt(buffer.ToArray(), true) ??
throw new InvalidOperationException("Failed to encrypt the buffer.");

return true;
Expand All @@ -84,25 +89,42 @@ public override bool Decrypt(RSACryptoServiceProvider rsa)
}

var decryptedApproval = mRsa.Decrypt(EncryptedData, true);
using (var approvalBuffer = new MemoryBuffer(decryptedApproval))
using (var buffer = new MemoryBuffer(decryptedApproval))
{
if (!approvalBuffer.Read(out mHandshakeSecret, SIZE_HANDSHAKE_SECRET))
if (!buffer.Read(out mHandshakeSecret, SIZE_HANDSHAKE_SECRET))
{
return false;
}

if (!approvalBuffer.Read(out mAesKey, SIZE_AES_KEY))
if (!buffer.Read(out mAesKey, SIZE_AES_KEY))
{
return false;
}

if (!approvalBuffer.Read(out var guidData, SIZE_GUID) || guidData == null)
if (!buffer.Read(out var guidData, SIZE_GUID) || guidData == null)
{
return false;
}

Guid = new Guid(guidData);

if (!buffer.Read(out mTimeMs))
{
return false;
}

#if DEBUG
if (!buffer.Read(out mRawTimeMs))
{
return false;
}

if (!buffer.Read(out mOffset))
{
return false;
}
#endif

#if INTERSECT_DIAGNOSTIC
Log.Debug($"Handshake secret: {BitConverter.ToString(HandshakeSecret)}.");
Log.Debug($"Assigned AES Key: {BitConverter.ToString(AesKey)}");
Expand Down
2 changes: 1 addition & 1 deletion Intersect (Core)/Network/Packets/Client/AttackPacket.cs
Expand Up @@ -3,7 +3,7 @@
namespace Intersect.Network.Packets.Client
{

public class AttackPacket : CerasPacket
public class AttackPacket : AbstractTimedPacket
{

public AttackPacket(Guid target)
Expand Down
2 changes: 1 addition & 1 deletion Intersect (Core)/Network/Packets/Client/MovePacket.cs
Expand Up @@ -3,7 +3,7 @@
namespace Intersect.Network.Packets.Client
{

public class MovePacket : CerasPacket
public class MovePacket : AbstractTimedPacket
{

public MovePacket(Guid mapId, byte x, byte y, byte dir)
Expand Down
48 changes: 35 additions & 13 deletions Intersect (Core)/Network/Packets/HailPacket.cs
Expand Up @@ -57,10 +57,15 @@ public RSAParameters RsaParameters

public override bool Encrypt()
{
using (var hailBuffer = new MemoryBuffer())
using (var buffer = new MemoryBuffer())
{
hailBuffer.Write(VersionData);
hailBuffer.Write(HandshakeSecret, SIZE_HANDSHAKE_SECRET);
buffer.Write(VersionData);
buffer.Write(HandshakeSecret, SIZE_HANDSHAKE_SECRET);
buffer.Write(TimeMs);
#if DEBUG
buffer.Write(RawTimeMs);
buffer.Write(Offset);
#endif

#if INTERSECT_DIAGNOSTIC
Log.Debug($"VersionData: {BitConverter.ToString(VersionData)}");
Expand All @@ -69,17 +74,17 @@ public override bool Encrypt()

Debug.Assert(RsaParameters.Modulus != null, "RsaParameters.Modulus != null");
var bits = (ushort)(RsaParameters.Modulus.Length << 3);
hailBuffer.Write(bits);
hailBuffer.Write(RsaParameters.Exponent, 3);
hailBuffer.Write(RsaParameters.Modulus, bits >> 3);
buffer.Write(bits);
buffer.Write(RsaParameters.Exponent, 3);
buffer.Write(RsaParameters.Modulus, bits >> 3);

#if INTERSECT_DIAGNOSTIC
DumpKey(RsaParameters, true);
#endif

Debug.Assert(mRsa != null, "mRsa != null");

EncryptedData = mRsa.Encrypt(hailBuffer.ToArray(), true) ??
EncryptedData = mRsa.Encrypt(buffer.ToArray(), true) ??
throw new InvalidOperationException("Failed to encrypt the buffer.");

return true;
Expand All @@ -98,35 +103,52 @@ public override bool Decrypt(RSACryptoServiceProvider rsa)
}

var decryptedHail = mRsa.Decrypt(EncryptedData, true);
using (var hailBuffer = new MemoryBuffer(decryptedHail))
using (var buffer = new MemoryBuffer(decryptedHail))
{
if (!hailBuffer.Read(out mVersionData))
if (!buffer.Read(out mVersionData))
{
return false;
}

if (!buffer.Read(out mHandshakeSecret, SIZE_HANDSHAKE_SECRET))
{
return false;
}

if (!buffer.Read(out mTimeMs))
{
return false;
}

if (!hailBuffer.Read(out mHandshakeSecret, SIZE_HANDSHAKE_SECRET))
#if DEBUG
if (!buffer.Read(out mRawTimeMs))
{
return false;
}

if (!buffer.Read(out mOffset))
{
return false;
}
#endif

#if INTERSECT_DIAGNOSTIC
Log.Debug($"VersionData: {BitConverter.ToString(VersionData)}");
Log.Debug($"Handshake secret: {BitConverter.ToString(HandshakeSecret)}.");
#endif

if (!hailBuffer.Read(out ushort bits))
if (!buffer.Read(out ushort bits))
{
return false;
}

RsaParameters = new RSAParameters();
if (!hailBuffer.Read(out mRsaParameters.Exponent, 3))
if (!buffer.Read(out mRsaParameters.Exponent, 3))
{
return false;
}

if (!hailBuffer.Read(out mRsaParameters.Modulus, bits >> 3))
if (!buffer.Read(out mRsaParameters.Modulus, bits >> 3))
{
return false;
}
Expand Down

0 comments on commit 9bd53ef

Please sign in to comment.