diff --git a/Lidgren.Network/Encryption/NetAESEncryption.cs b/Lidgren.Network/Encryption/NetAESEncryption.cs
index bb6eb4d..5ed5582 100644
--- a/Lidgren.Network/Encryption/NetAESEncryption.cs
+++ b/Lidgren.Network/Encryption/NetAESEncryption.cs
@@ -7,30 +7,18 @@ namespace Lidgren.Network
public class NetAESEncryption : NetCryptoProviderBase
{
public NetAESEncryption(NetPeer peer)
-#if UNITY_WEBPLAYER
- : base(peer, new RijndaelManaged())
-#else
: base(peer, new AesCryptoServiceProvider())
-#endif
{
}
public NetAESEncryption(NetPeer peer, string key)
-#if UNITY_WEBPLAYER
- : base(peer, new RijndaelManaged())
-#else
: base(peer, new AesCryptoServiceProvider())
-#endif
{
SetKey(key);
}
public NetAESEncryption(NetPeer peer, byte[] data, int offset, int count)
-#if UNITY_WEBPLAYER
- : base(peer, new RijndaelManaged())
-#else
: base(peer, new AesCryptoServiceProvider())
-#endif
{
SetKey(data, offset, count);
}
diff --git a/Lidgren.Network/Encryption/NetCryptoProviderEncryption.cs b/Lidgren.Network/Encryption/NetCryptoProviderEncryption.cs
new file mode 100644
index 0000000..d112046
--- /dev/null
+++ b/Lidgren.Network/Encryption/NetCryptoProviderEncryption.cs
@@ -0,0 +1,59 @@
+using System;
+using System.IO;
+using System.Security.Cryptography;
+
+namespace Lidgren.Network
+{
+ public abstract class NetCryptoProviderEncryption : NetEncryption
+ {
+ public NetCryptoProviderEncryption(NetPeer peer)
+ : base(peer)
+ {
+ }
+
+ protected abstract CryptoStream GetEncryptStream(MemoryStream ms);
+
+ protected abstract CryptoStream GetDecryptStream(MemoryStream ms);
+
+ public override bool Encrypt(NetOutgoingMessage msg)
+ {
+ int unEncLenBits = msg.LengthBits;
+
+ var ms = new MemoryStream();
+ var cs = GetEncryptStream(ms);
+ cs.Write(msg.m_data, 0, msg.LengthBytes);
+ cs.Close();
+
+ // get results
+ var arr = ms.ToArray();
+ ms.Close();
+
+ msg.EnsureBufferSize((arr.Length + 4) * 8);
+ msg.LengthBits = 0; // reset write pointer
+ msg.Write((uint)unEncLenBits);
+ msg.Write(arr);
+ msg.LengthBits = (arr.Length + 4) * 8;
+
+ return true;
+ }
+
+ public override bool Decrypt(NetIncomingMessage msg)
+ {
+ int unEncLenBits = (int)msg.ReadUInt32();
+
+ var ms = new MemoryStream(msg.m_data, 4, msg.LengthBytes - 4);
+ var cs = GetDecryptStream(ms);
+
+ var result = m_peer.GetStorage(unEncLenBits);
+ cs.Read(result, 0, NetUtility.BytesToHoldBits(unEncLenBits));
+ cs.Close();
+
+ // TODO: recycle existing msg
+
+ msg.m_data = result;
+ msg.m_bitLength = unEncLenBits;
+
+ return true;
+ }
+ }
+}
diff --git a/Lidgren.Network/Encryption/NetXteaEncryption.cs b/Lidgren.Network/Encryption/NetXteaEncryption.cs
index ed1d0ee..9e6ce4b 100644
--- a/Lidgren.Network/Encryption/NetXteaEncryption.cs
+++ b/Lidgren.Network/Encryption/NetXteaEncryption.cs
@@ -83,14 +83,14 @@ namespace Lidgren.Network
/// String to hash for key
///
public NetXtea(NetPeer peer, string key)
- : this(peer, NetUtility.CreateSHA1Hash(key), 32)
+ : this(peer, NetUtility.ComputeSHAHash(Encoding.UTF8.GetBytes(key)), 32)
{
}
public override void SetKey(byte[] data, int offset, int length)
{
- var key = NetUtility.CreateSHA1Hash(data, offset, length);
- NetException.Assert(key.Length == 16);
+ var key = NetUtility.ComputeSHAHash(data, offset, length);
+ NetException.Assert(key.Length >= 16);
SetKey(key, 0, 16);
}
diff --git a/Lidgren.Network/Lidgren.Network.csproj b/Lidgren.Network/Lidgren.Network.csproj
index 4ee2910..608b942 100644
--- a/Lidgren.Network/Lidgren.Network.csproj
+++ b/Lidgren.Network/Lidgren.Network.csproj
@@ -136,6 +136,10 @@
+
+
+
+
diff --git a/Lidgren.Network/NetBigInteger.cs b/Lidgren.Network/NetBigInteger.cs
index 8f57fd7..f9d307b 100644
--- a/Lidgren.Network/NetBigInteger.cs
+++ b/Lidgren.Network/NetBigInteger.cs
@@ -2334,4 +2334,19 @@ namespace Lidgren.Network
return ((word >> (n % 32)) & 1) > 0;
}
}
+
+#if WINDOWS_RUNTIME
+ internal sealed class Stack
+ {
+ private System.Collections.Generic.List