diff --git a/client/lib/md5.js b/client/lib/md5.js deleted file mode 100644 index 3a968e8..0000000 --- a/client/lib/md5.js +++ /dev/null @@ -1 +0,0 @@ -!function(n){"use strict";function t(n,t){var r=(65535&n)+(65535&t),e=(n>>16)+(t>>16)+(r>>16);return e<<16|65535&r}function r(n,t){return n<>>32-t}function e(n,e,o,u,c,f){return t(r(t(t(e,n),t(u,f)),c),o)}function o(n,t,r,o,u,c,f){return e(t&r|~t&o,n,t,u,c,f)}function u(n,t,r,o,u,c,f){return e(t&o|r&~o,n,t,u,c,f)}function c(n,t,r,o,u,c,f){return e(t^r^o,n,t,u,c,f)}function f(n,t,r,o,u,c,f){return e(r^(t|~o),n,t,u,c,f)}function i(n,r){n[r>>5]|=128<>>9<<4)+14]=r;var e,i,a,h,d,l=1732584193,g=-271733879,v=-1732584194,m=271733878;for(e=0;e>5]>>>t%32&255);return r}function h(n){var t,r=[];for(r[(n.length>>2)-1]=void 0,t=0;t>5]|=(255&n.charCodeAt(t/8))<16&&(o=i(o,8*n.length)),r=0;r<16;r+=1)u[r]=909522486^o[r],c[r]=1549556828^o[r];return e=i(u.concat(h(t)),512+8*t.length),a(i(c.concat(e),640))}function g(n){var t,r,e="0123456789abcdef",o="";for(r=0;r>>4&15)+e.charAt(15&t);return o}function v(n){return unescape(encodeURIComponent(n))}function m(n){return d(v(n))}function p(n){return g(m(n))}function s(n,t){return l(v(n),v(t))}function C(n,t){return g(s(n,t))}function A(n,t,r){return t?r?s(t,n):C(t,n):r?m(n):p(n)}"function"==typeof define&&define.amd?define(function(){return A}):"object"==typeof module&&module.exports?module.exports=A:n.md5=A}(this); diff --git a/server/CircleScape.csproj b/server/CircleScape.csproj index d5d8c08..6d88d5d 100644 --- a/server/CircleScape.csproj +++ b/server/CircleScape.csproj @@ -65,6 +65,7 @@ packages\System.Data.SQLite.Linq.1.0.105.0\lib\net46\System.Data.SQLite.Linq.dll True + @@ -96,6 +97,8 @@ ScapeDb.tt + + diff --git a/server/Encryption/Cipher.cs b/server/Encryption/Cipher.cs new file mode 100644 index 0000000..38c26d1 --- /dev/null +++ b/server/Encryption/Cipher.cs @@ -0,0 +1,38 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace CircleScape.Encryption { + class Cipher { + + static void ksa(byte[] state, byte[] key) { + int i, j = 0, t; + for(i = 0; i < 256; ++i) + state[i] = (byte)i; + + for(i = 0; i < 256; ++i) { + j = (j + state[i] + key[i % key.Length]) % 256; + t = state[i]; + state[i] = state[j]; + state[j] = (byte)t; + } + } + + static void prga(byte[] state, byte[] cipher) { + int i = 0, j = 0, x, t; + + for(x = 0; x < cipher.Length; ++x) { + i = (i + 1) % 256; + j = (j + state[i]) % 256; + t = state[i]; + state[i] = state[j]; + state[j] = (byte)t; + cipher[x] = state[(state[i] + state[j]) % 256]; + } + } + + // http://bradconte.com/rc4_c + } +} diff --git a/server/Encryption/KeyExchange.cs b/server/Encryption/KeyExchange.cs new file mode 100644 index 0000000..a116eab --- /dev/null +++ b/server/Encryption/KeyExchange.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Numerics; + +namespace CircleScape.Encryption { + class KeyExchange { + private BigInteger Secret; + public BigInteger Generator { get; private set; } + public BigInteger Modulus { get; private set; } + public BigInteger PrivateKey { get; private set; } + + // https://security.stackexchange.com/questions/45963/diffie-hellman-key-exchange-in-plain-english/45971#45971 + } +} diff --git a/server/Entrypoint.cs b/server/Entrypoint.cs index f4eda3c..e5d3f71 100644 --- a/server/Entrypoint.cs +++ b/server/Entrypoint.cs @@ -6,10 +6,14 @@ using System.Text; using System.Threading.Tasks; using CircleScape.DAL; using System.Numerics; +using Square; namespace CircleScape { class Entrypoint { static void Main(string[] args) { + var a = Square.Random.NextPrime(512 / 8); + Console.WriteLine(a.ToString("X")); + var server = new Kneesocks.Server(6770, PoolManager.Pending); server.Start(); diff --git a/server/Libraries/Kneesocks/Connection.cs b/server/Libraries/Kneesocks/Connection.cs index 92c3e3c..a9d9be5 100644 --- a/server/Libraries/Kneesocks/Connection.cs +++ b/server/Libraries/Kneesocks/Connection.cs @@ -41,8 +41,6 @@ namespace Kneesocks { private List SendFrameBuffer = new List(); private const int MaximumSendFrameSize = 0xFFFFF; - private Random Random = new Random(); - protected const int PingInterval = 30; protected const int TimeoutInterval = 120; private byte[] PingData = Encoding.ASCII.GetBytes("woomy!"); diff --git a/server/Libraries/Square/NumericExtensions.cs b/server/Libraries/Square/NumericExtensions.cs index 9b18f73..4a25822 100644 --- a/server/Libraries/Square/NumericExtensions.cs +++ b/server/Libraries/Square/NumericExtensions.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.Numerics; +using System.Globalization; namespace Square { public static class NumericExtensions { @@ -29,7 +31,7 @@ namespace Square { public static byte[] Pack(this UInt32 value) { return BitConverter.GetBytes(value).HostToNetworkOrder(); } - + public static byte[] Pack(this Int64 value) { return BitConverter.GetBytes(value).HostToNetworkOrder(); } @@ -37,5 +39,36 @@ namespace Square { public static byte[] Pack(this UInt64 value) { return BitConverter.GetBytes(value).HostToNetworkOrder(); } + + public static bool IsDivisibleBy(this BigInteger value, BigInteger dividend) { + if(value.IsZero) return false; + if(value.IsOne) return true; + if(value == 2) return value.IsEven; + return (value % dividend).IsZero; + } + + public static bool IsProbablePrime(this BigInteger value, int iterations = 5) { + var absValue = BigInteger.Abs(value); + + if(absValue == 1) return false; + if(absValue == 2 || absValue == 3 || absValue == 5) return true; + if(absValue.IsEven || absValue.IsDivisibleBy(3) || absValue.IsDivisibleBy(5)) return false; + if(absValue < 25) return true; + + for(var i = 0; i < iterations; ++i) { + var rand = Random.NextBigInt(2, absValue - 2); + if(!BigInteger.ModPow(rand, absValue - 1, absValue).IsOne) return false; + } + + return true; + } + + public static string ToHexString(this BigInteger value) { + return value.ToString("X").ToLower(); + } + + public static BigInteger HexStringToBigInt(this string value) { + return BigInteger.Parse(value, NumberStyles.HexNumber); + } } } diff --git a/server/Libraries/Square/RandomContext.cs b/server/Libraries/Square/RandomContext.cs new file mode 100644 index 0000000..e2a0bc2 --- /dev/null +++ b/server/Libraries/Square/RandomContext.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Numerics; + +namespace Square { + public static class Random { + private static System.Random RandCtx = new System.Random(); + + public static int Next() { + lock(RandCtx) { + return RandCtx.Next(); + } + } + + public static int Next(int maxValue) { + lock(RandCtx) { + return RandCtx.Next(maxValue); + } + } + + public static int Next(int minValue, int maxValue) { + lock(RandCtx) { + return RandCtx.Next(minValue, maxValue); + } + } + + public static double NextDouble() { + lock(RandCtx) { + return RandCtx.NextDouble(); + } + } + + public static void NextBytes(byte[] buffer) { + lock(RandCtx) { + RandCtx.NextBytes(buffer); + } + } + + public static byte[] NextBytes(int length) { + lock(RandCtx) { + var buffer = new byte[length]; + RandCtx.NextBytes(buffer); + return buffer; + } + } + + public static BigInteger NextPrime(int byteCount) { + var bytes = new byte[byteCount]; + BigInteger prime; + + do { + NextBytes(bytes); + prime = BigInteger.Abs(new BigInteger(bytes)) | 1; + } while(!prime.IsProbablePrime()); + + return prime; + } + + public static BigInteger NextBigInt(BigInteger minValue, BigInteger maxValue) { + var byteCount = maxValue.ToByteArray().Length; + var randomNumber = BigInteger.Abs(new BigInteger(NextBytes(byteCount))); + + var delta = maxValue - minValue + 1; + return minValue + (randomNumber % delta); + } + + public static BigInteger NextBigInt(int byteCount) { + return BigInteger.Abs(new BigInteger(NextBytes(byteCount))); + } + } +} diff --git a/server/Libraries/Square/Square.csproj b/server/Libraries/Square/Square.csproj index a8c16a9..47a502e 100644 --- a/server/Libraries/Square/Square.csproj +++ b/server/Libraries/Square/Square.csproj @@ -32,6 +32,7 @@ + @@ -43,6 +44,7 @@ + diff --git a/server/Socks/PendingConnection.cs b/server/Socks/PendingConnection.cs index fa929da..83ca828 100644 --- a/server/Socks/PendingConnection.cs +++ b/server/Socks/PendingConnection.cs @@ -11,6 +11,8 @@ namespace CircleScape { class PendingConnection : Connection { private DateTime ConnectionOpened; + + protected override void OnOpen() { ConnectionOpened = DateTime.UtcNow; }