diff --git a/Lidgren.Network/NetSRP.cs b/Lidgren.Network/NetSRP.cs
index b1332cc..01ba853 100644
--- a/Lidgren.Network/NetSRP.cs
+++ b/Lidgren.Network/NetSRP.cs
@@ -43,11 +43,21 @@ namespace Lidgren.Network
}
///
- /// Get random bits
+ /// Create 16 bytes of random salt
///
- public static byte[] CreateRandomKey(int bits)
+ public static byte[] CreateRandomSalt()
{
- byte[] retval = new byte[bits / 8];
+ byte[] retval = new byte[16];
+ NetRandom.Instance.NextBytes(retval);
+ return retval;
+ }
+
+ ///
+ /// Create 32 bytes of random ephemeral value
+ ///
+ public static byte[] CreateRandomEphemeral()
+ {
+ byte[] retval = new byte[32];
NetRandom.Instance.NextBytes(retval);
return retval;
}
diff --git a/Lidgren.Network/NetServer.cs b/Lidgren.Network/NetServer.cs
index 347b548..f5d18af 100644
--- a/Lidgren.Network/NetServer.cs
+++ b/Lidgren.Network/NetServer.cs
@@ -1,4 +1,5 @@
using System;
+using System.Collections.Generic;
namespace Lidgren.Network
{
@@ -13,6 +14,38 @@ namespace Lidgren.Network
config.AcceptIncomingConnections = true;
}
+ ///
+ /// Send a message to all connections
+ ///
+ /// The message to send
+ /// How to deliver the message
+ public void SendToAll(NetOutgoingMessage msg, NetDeliveryMethod method)
+ {
+ SendMessage(msg, this.Connections, method, 0);
+ }
+
+ ///
+ /// Send a message to all connections except one
+ ///
+ /// The message to send
+ /// How to deliver the message
+
+
+ public void SendToAll(NetOutgoingMessage msg, NetConnection except, NetDeliveryMethod method)
+ {
+ var all = this.Connections;
+ if (all.Count <= 0)
+ return;
+
+ List recipients = new List(all.Count - 1);
+ foreach (var conn in all)
+ if (conn != except)
+ recipients.Add(conn);
+
+ if (recipients.Count > 0)
+ SendMessage(msg, recipients, method, 0);
+ }
+
///
/// Returns a string that represents this object
///
diff --git a/UnitTests/EncryptionTests.cs b/UnitTests/EncryptionTests.cs
index 3a29485..b497a8d 100644
--- a/UnitTests/EncryptionTests.cs
+++ b/UnitTests/EncryptionTests.cs
@@ -56,39 +56,42 @@ namespace UnitTests
if (im.ReadString() != "kokos")
throw new NetException("fail");
- byte[] salt = NetSRP.CreateRandomKey(16);
- byte[] x = NetSRP.ComputePrivateKey("user", "password", salt);
-
- byte[] v = NetSRP.ComputeServerVerifier(x);
- //Console.WriteLine("v = " + NetUtility.ToHexString(v));
-
- byte[] a = NetSRP.CreateRandomKey(32); // NetUtility.ToByteArray("393ed364924a71ba7258633cc4854d655ca4ec4e8ba833eceaad2511e80db2b5");
- byte[] A = NetSRP.ComputeClientEphemeral(a);
- //Console.WriteLine("A = " + NetUtility.ToHexString(A));
-
- byte[] b = NetSRP.CreateRandomKey(32); // NetUtility.ToByteArray("cc4d87a90db91067d52e2778b802ca6f7d362490c4be294b21b4a57c71cf55a9");
- byte[] B = NetSRP.ComputeServerEphemeral(b, v);
- //Console.WriteLine("B = " + NetUtility.ToHexString(B));
-
- byte[] u = NetSRP.ComputeU(A, B);
- //Console.WriteLine("u = " + NetUtility.ToHexString(u));
-
- byte[] Ss = NetSRP.ComputeServerSessionValue(A, v, u, b);
- //Console.WriteLine("Ss = " + NetUtility.ToHexString(Ss));
-
- byte[] Sc = NetSRP.ComputeClientSessionValue(B, x, u, a);
- //Console.WriteLine("Sc = " + NetUtility.ToHexString(Sc));
-
- if (Ss.Length != Sc.Length)
- throw new NetException("SRP non matching lengths!");
-
- for (int j = 0; j < Ss.Length; j++)
+ for (int i = 0; i < 100; i++)
{
- if (Ss[j] != Sc[j])
- throw new NetException("SRP non matching session values!");
- }
+ byte[] salt = NetSRP.CreateRandomSalt();
+ byte[] x = NetSRP.ComputePrivateKey("user", "password", salt);
- var test = NetSRP.CreateEncryption(Ss);
+ byte[] v = NetSRP.ComputeServerVerifier(x);
+ //Console.WriteLine("v = " + NetUtility.ToHexString(v));
+
+ byte[] a = NetSRP.CreateRandomEphemeral(); // NetUtility.ToByteArray("393ed364924a71ba7258633cc4854d655ca4ec4e8ba833eceaad2511e80db2b5");
+ byte[] A = NetSRP.ComputeClientEphemeral(a);
+ //Console.WriteLine("A = " + NetUtility.ToHexString(A));
+
+ byte[] b = NetSRP.CreateRandomEphemeral(); // NetUtility.ToByteArray("cc4d87a90db91067d52e2778b802ca6f7d362490c4be294b21b4a57c71cf55a9");
+ byte[] B = NetSRP.ComputeServerEphemeral(b, v);
+ //Console.WriteLine("B = " + NetUtility.ToHexString(B));
+
+ byte[] u = NetSRP.ComputeU(A, B);
+ //Console.WriteLine("u = " + NetUtility.ToHexString(u));
+
+ byte[] Ss = NetSRP.ComputeServerSessionValue(A, v, u, b);
+ //Console.WriteLine("Ss = " + NetUtility.ToHexString(Ss));
+
+ byte[] Sc = NetSRP.ComputeClientSessionValue(B, x, u, a);
+ //Console.WriteLine("Sc = " + NetUtility.ToHexString(Sc));
+
+ if (Ss.Length != Sc.Length)
+ throw new NetException("SRP non matching lengths!");
+
+ for (int j = 0; j < Ss.Length; j++)
+ {
+ if (Ss[j] != Sc[j])
+ throw new NetException("SRP non matching session values!");
+ }
+
+ var test = NetSRP.CreateEncryption(Ss);
+ }
Console.WriteLine("Message encryption OK");
}