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"); }