Skip to content

Commit 201e14d

Browse files
committed
New Aes system & Tcp holepunch
1 parent 25c0c53 commit 201e14d

File tree

63 files changed

+5080
-291
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

63 files changed

+5080
-291
lines changed

Benchmarks/RelayBenchmark/Program.cs

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,8 @@ private static void SerializerTest()
179179
Payload = new byte[32]
180180
};
181181
static Stopwatch sw = new Stopwatch();
182+
static long sumsum = 0;
183+
182184
private static void RelayTest()
183185
{
184186
//string ip = "79.52.134.220";
@@ -187,23 +189,26 @@ private static void RelayTest()
187189

188190
var cert = new X509Certificate2("client.pfx", "greenpass");
189191
var scert = new X509Certificate2("server.pfx", "greenpass");
190-
// var server = new SecureProtoRelayServer(20011, scert);
191-
// server.StartServer();
192+
var server = new SecureProtoRelayServer(20020, scert);
193+
server.StartServer();
192194
//Task.Run(async () => { while (true) { await Task.Delay(10000); server.GetTcpStatistics(out var generalStats, out _); Console.WriteLine(generalStats.ToString()); } });
193195
var clients = new List<RelayClient>();
194196
int numclients = 2;
195197
var pending = new Task[numclients];
198+
Task.Run(async () => { while (true) { await Task.Delay(1000); Console.WriteLine(Interlocked.Exchange(ref sumsum, 0).ToString("N0")); } });
199+
196200
// Parallel.For(0, numclients, (i) =>
197201
for (int i = 0; i < numclients; i++)
198202

199203
{
200-
var client = new RelayClient(cert);
204+
var client = new RelayClient(cert,0);
201205
client.OnMessageReceived += (reply) => ClientMsgReceived(client, reply);
202206
client.OnUdpMessageReceived += (reply) => ClientUdpReceived(client, reply);
203207
//client.OnPeerRegistered += (id) => { /*if (client.sessionId.CompareTo(id) > 0)*/ client.RequestHolePunchAsync(id, 10000, false); };
204208
try
205209
{
206-
pending[i] = client.ConnectAsync(ip, 20011);
210+
pending[i] = client.ConnectAsync(ip, 20020);
211+
//client.StartPingService();
207212
// client.Connect(ip, 20011);
208213
clients.Add(client);
209214
//client.StartPingService();
@@ -230,8 +235,10 @@ private static void RelayTest()
230235
if (peer.Key == Guid.Empty)
231236
throw new Exception();
232237

233-
//var a = client.RequestHolePunchAsync(peer.Key, 10000, false);
234-
//pndg.Add(a);
238+
// var a = client.RequestTcpHolePunchAsync(peer.Key);
239+
// pndg.Add(a);
240+
var aa = client.RequestHolePunchAsync(peer.Key, 10000, false);
241+
pndg.Add(aa);
235242
//client.TestHP(peer.Key, 10000, false);
236243
// Console.WriteLine(peer.Key+" cnt=> "+ ++cc);
237244
}
@@ -243,29 +250,32 @@ private static void RelayTest()
243250

244251

245252
Thread.Sleep(1000);
253+
Console.WriteLine("all good");
254+
246255
// Parallel.ForEach(clients, (client) =>
247256
foreach (var client in clients)
248257
{
249258
var testMessage = new MessageEnvelope()
250259
{
251260
Header = "Test",
252-
Payload = new byte[255000]
261+
Payload = new byte[320000]
253262
};
254263
for (int i = 0; i < testMessage.PayloadCount; i++)
255264
{
256265
testMessage.Payload[i] = (byte)i;
257266
}
258-
for (int i = 0; i < 100; i++)
267+
for (int i = 0; i < 1; i++)
259268
{
260269
//return;
261270
foreach (var peer in client.Peers.Keys)
262271
{
263272
//await client.SendRequestAndWaitResponse(peer, testMessage,1000);
264-
//client.SendAsyncMessage(peer, testMessage);
265-
//client.SendUdpMesssage(peer, testMessage);
273+
// client.SendAsyncMessage(peer, testMessage);
274+
client.SendUdpMessage(peer, testMessage);
275+
// client.SendRudpMessage(peer, testMessage);
266276
// client.BroadcastMessage(testMessage);
267277
//client.BroadcastUdpMessage(testMessage);
268-
client.SendRudpMessage(peer,testMessage);
278+
// client.SendRudpMessage(peer,testMessage);
269279
}
270280
}
271281
break;
@@ -276,13 +286,14 @@ private static void RelayTest()
276286

277287
sw.Start();
278288
sw2.Start();
279-
280289
void ClientMsgReceived(RelayClient client, MessageEnvelope reply)
281290
{
291+
//Interlocked.Add(ref sumsum, reply.PayloadCount);
292+
Interlocked.Increment(ref sumsum);
282293
//Interlocked.Increment(ref totMsgCl);
283294
client.SendAsyncMessage(reply.From, reply);
284295
// Console.WriteLine("R " + sw.ElapsedMilliseconds);
285-
sw.Restart();
296+
// sw.Restart();
286297
}
287298

288299

@@ -299,8 +310,8 @@ void ClientUdpReceived(RelayClient client, MessageEnvelope reply)
299310
// var b = (byte)i;
300311
// }
301312
//}
302-
//client.SendUdpMesssage(reply.From, reply);
303-
client.SendRudpMessage(reply.From, reply);
313+
client.SendUdpMessage(reply.From, reply);
314+
// client.SendRudpMessage(reply.From, reply);
304315
return;
305316
if (client == clients[0])
306317
{

Benchmarks/TcpBenchmark/Program.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ private static void InitializeClients()
115115
}
116116
Task.WaitAll(toWait);
117117
Console.WriteLine("All Clients Connected");
118+
Console.WriteLine(server.SessionCount);
118119

119120
}
120121

Benchmarks/TcpBenchmark/TcpMessageBenchmark.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
5-
<TargetFramework>net7.0</TargetFramework>
5+
<TargetFramework>net8.0</TargetFramework>
66
<Nullable>enable</Nullable>
77
<Platforms>AnyCPU;ARM32</Platforms>
88
</PropertyGroup>
Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,10 @@
1-
using MessagePack;
2-
using MessagePackNetwork.Components;
1+
using MessagePackNetwork.Components;
32
using NetworkLibrary.MessageProtocol.Fast;
4-
using System;
5-
using System.Collections.Generic;
6-
using System.Linq;
7-
using System.Text;
8-
using System.Threading.Tasks;
93

104
namespace MessagePackNetwork.MessageProtocol
115
{
126
internal class MessagePackMessageClient:GenericMessageClientWrapper<MessagepackSerializer>
137
{
8+
149
}
1510
}

NetworkLibrary/Components/ByteMessageReader.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,14 @@ public class ByteMessageReader
1616
private int currentExpectedByteLenght;
1717
private int originalCapacity;
1818

19-
private readonly Guid Guid;
2019
public event Action<byte[], int, int> OnMessageReady;
2120

2221
private bool awaitingHeader;
2322

24-
public ByteMessageReader(Guid guid, int bufferSize = 256000)
23+
public ByteMessageReader( int bufferSize = 256000)
2524
{
2625
awaitingHeader = true;
2726
currentExpectedByteLenght = 4;
28-
Guid = guid;
2927

3028
headerBuffer = new byte[HeaderLenght];
3129
originalCapacity = bufferSize;
Lines changed: 60 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,104 +1,91 @@
1-
using System.Collections.Concurrent;
1+
using NetworkLibrary.Components.Crypto;
2+
using NetworkLibrary.Components.Crypto.Algorithms;
3+
using NetworkLibrary.Utils;
4+
using System;
5+
using System.Collections.Concurrent;
6+
using System.ComponentModel;
7+
using System.Drawing;
8+
using System.Security.Cryptography;
29

310
namespace NetworkLibrary.Components
411
{
512
public class ConcurrentAesAlgorithm
613
{
7-
private readonly ConcurrentBag<AesAlgorithm> algorithmPool = new ConcurrentBag<AesAlgorithm>();
8-
private readonly byte[] key;
9-
private readonly byte[] IV;
10-
public ConcurrentAesAlgorithm(byte[] key, byte[] IV)
14+
IAesEngine encryptionEngine;
15+
IAesEngine cbcRandomIV;
16+
IAesEngine cbcCounterIV;
17+
IAesEngine cbcCounterIVHMAC;
18+
IAesEngine gcm;
19+
IAesEngine noEncryption;
20+
21+
public ConcurrentAesAlgorithm(byte[] key, AesMode aesType = AesMode.GCM)
1122
{
12-
this.key = key;
13-
this.IV = IV;
14-
algorithmPool.Add(new AesAlgorithm(key, IV));
23+
var IV = GenerateIV(key);
24+
encryptionEngine = new AesManager(key, IV, aesType);
25+
cbcRandomIV = new AesManager(key, IV, AesMode.CBCRandomIV);
26+
cbcCounterIV = new AesManager(key, IV, AesMode.CBCCtrIV);
27+
cbcCounterIVHMAC = new AesManager(key, IV, AesMode.CBCCtrIVHMAC);
28+
29+
gcm = new AesManager(key, IV, AesMode.GCM);
30+
noEncryption = new AesManager(key, IV, AesMode.None);
1531
}
1632

17-
private AesAlgorithm RentAlgorithm()
33+
private byte[] GenerateIV(byte[] key)
1834
{
19-
if (!algorithmPool.TryTake(out var cry))
20-
{
21-
cry = new AesAlgorithm(key, IV);
22-
}
23-
return cry;
35+
SHA256 sHA = SHA256.Create();
36+
var hash = sHA.ComputeHash(key);
37+
return ByteCopy.ToArray(hash, 0, 16);
2438
}
2539

26-
private void ReturnAlgorithm(AesAlgorithm alg)
40+
private IAesEngine GetEngine(byte val)
2741
{
28-
algorithmPool.Add(alg);
29-
42+
switch (val)
43+
{
44+
case (byte)AesMode.CBCRandomIV:
45+
return cbcRandomIV;
46+
case (byte)AesMode.CBCCtrIV:
47+
return cbcCounterIV;
48+
case (byte)AesMode.CBCCtrIVHMAC:
49+
return cbcCounterIVHMAC;
50+
case (byte)AesMode.GCM:
51+
return gcm;
52+
case (byte)AesMode.None:
53+
return noEncryption;
54+
55+
default:
56+
throw new NotSupportedException(val.ToString());
57+
}
3058
}
3159
public byte[] Decrypt(byte[] bytes) => Decrypt(bytes, 0, bytes.Length);
3260
public byte[] Decrypt(byte[] bytes, int offset, int count)
3361
{
34-
var cry = RentAlgorithm();
35-
byte[] res;
36-
try
37-
{
38-
res = cry.Decrypt(bytes, offset, count);
39-
40-
}
41-
catch
42-
{
43-
cry.Dispose();
44-
throw;
45-
}
46-
ReturnAlgorithm(cry);
47-
return res;
62+
byte val = bytes[offset++];
63+
count--;
64+
return GetEngine(val).Decrypt(bytes, offset, count);
65+
4866
}
4967
public int DecryptInto(byte[] source, int sourceOffset, int sourceCount, byte[] output, int outputOffset)
5068
{
51-
var cry = RentAlgorithm();
52-
int res;
53-
try
54-
{
55-
res = cry.DecryptInto(source, sourceOffset, sourceCount, output, outputOffset);
56-
57-
}
58-
catch
59-
{
60-
cry.Dispose();
61-
throw;
62-
}
63-
ReturnAlgorithm(cry);
64-
return res;
69+
byte val = source[sourceOffset++];
70+
sourceCount--;
71+
return GetEngine(val).DecryptInto(source, sourceOffset, sourceCount, output, outputOffset);
6572
}
6673

6774
public byte[] Encrypt(byte[] bytes) => Encrypt(bytes, 0, bytes.Length);
6875
public byte[] Encrypt(byte[] bytes, int offset, int count)
6976
{
70-
var cry = RentAlgorithm();
71-
byte[] res;
72-
try
73-
{
74-
res = cry.Encrypt(bytes, offset, count);
75-
}
76-
catch
77-
{
78-
cry.Dispose();
79-
throw;
80-
}
81-
ReturnAlgorithm(cry);
82-
return res;
83-
77+
return encryptionEngine.Encrypt(bytes, offset, count);
8478
}
79+
8580
public int EncryptInto(byte[] source, int sourceOffset, int sourceCount, byte[] output, int outputOffset)
8681
{
87-
var cry = RentAlgorithm();
88-
int res;
89-
try
90-
{
91-
res = cry.EncryptInto(source, sourceOffset, sourceCount, output, outputOffset);
92-
}
93-
catch
94-
{
95-
cry.Dispose();
96-
throw;
97-
}
98-
ReturnAlgorithm(cry);
99-
return res;
82+
return encryptionEngine.EncryptInto(source,sourceOffset,sourceCount,output,outputOffset);
10083
}
10184

102-
85+
public int EncryptInto(byte[] data1, int offset1, int count1, byte[] data2, int offset2, int count2, byte[] output, int outputOffset)
86+
{
87+
return encryptionEngine.EncryptInto(data1, offset1, count1, data2, offset2, count2, output, outputOffset);
88+
}
10389
}
10490
}
91+

0 commit comments

Comments
 (0)