Example #1
0
        public static void Run()
        {
            Core.Initialize();
            RegisterOpcodes();
            loginSocket   = Core.StartUDPReceiver(IPAddress.Parse("127.0.0.1"), 0, OnReceive);
            loginEndpoint = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 11000);

            var random  = new RNGCryptoServiceProvider();
            var randoma = new byte[20];

            random.GetBytes(randoma);
            randoma[randoma.Length - 1] &= 0x7F;
            a       = new BigInteger(randoma);
            PublicA = BigInteger.ModPow(g, a, N);

            var PublicABytes = PublicA.ToByteArray();

            UDPTransmitter transmitter = UDPTransmitter.CreateObject();

            transmitter.WriteUint16((UInt16)CMSG_AUTH_LOGON_CHALLENGE);                   //opcode
            transmitter.WriteUint16((UInt16)(9 + USERNAME.Length + PublicABytes.Length)); //packet_length
            transmitter.WriteUint8(BUILD_MAJOR);
            transmitter.WriteUint8(BUILD_MINOR);
            transmitter.WriteUint8(BUILD_REVISION);
            transmitter.WriteInt16(CLIENT_BUILD);
            transmitter.WriteUint16((UInt16)USERNAME.Length);
            transmitter.WriteFixedString(USERNAME);
            transmitter.WriteUint16((UInt16)PublicABytes.Length);
            transmitter.WriteFixedBlob(PublicABytes);
            transmitter.SendTo(loginSocket, loginEndpoint);
        }
 public void Close()
 {
     if (udpTransmitter != null)
     {
         udpTransmitter.Close();
         udpTransmitter = null;
     }
 }
Example #3
0
 public void Connect()
 {
     if (udpTransmitter != null)
     {
         Close();
     }
     udpTransmitter = new UDPTransmitter(IPAddress, Port);
     udpTransmitter.Connect();
 }
Example #4
0
        public void Connect()
        {
            if (udpTransmitter != null)
            {
                Close();
            }
            udpTransmitter = new UDPTransmitter(ipAddress, port);
            udpTransmitter.Connect();

            fseq = 0;
        }
Example #5
0
        private static void OnRealmList(Session session, UDPReceiver data)
        {
            var sessionData = (ClientInfo)session.Data;

            Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] CMD_REALM_LIST", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port);

            int       packetLen = 0;
            DataTable result    = new DataTable();

            //Retrieve the Account ID
            MySqlCommand cmd       = new MySqlCommand(String.Format("SELECT id FROM account WHERE username = '******'", sessionData.Account), Program.db);
            int          accountId = (int)cmd.ExecuteScalar();

            Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Listing all realms", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port);
            Program.MySqlToDataTable(String.Format("SELECT * FROM realm"), Program.db, result);

            foreach (DataRow row in result.Rows)
            {
                packetLen = packetLen + ((string)row["address"]).Length + ((string)row["name"]).Length + 1 + ((int)row["port"]).ToString("0").Length + 14;
            }

            var ds = UDPTransmitter.CreateObject();

            ds.WriteUint16((byte)SMSG_REALMLIST_RESPONSE);

            using (Aes aes = new AesManaged()) {
                using (MemoryStream ms = new MemoryStream()) {
                    using (CryptoStream cs = new CryptoStream(ms, aes.CreateEncryptor(sessionData.SessionKey, sessionData.Salt.ToByteArray().Take(16).ToArray()), CryptoStreamMode.Write)) {
                        cs.WriteByte((byte)result.Rows.Count);

                        foreach (DataRow host in result.Rows)
                        {
                            cs.WriteByte((byte)((int)host["type"]));
                            cs.WriteByte((byte)((int)host["state"]));
                            cs.WriteByte((byte)((int)host["realmflags"]));
                            byte[] realmName = Encoding.UTF8.GetBytes((string)host["name"]);
                            cs.Write(realmName, 0, realmName.Length);
                            cs.WriteByte((byte)0);
                            byte[] realmAddress = Encoding.UTF8.GetBytes((string)host["address"] + ":" + host["port"].ToString());
                            cs.Write(realmAddress, 0, realmAddress.Length);
                            cs.WriteByte((byte)0);
                        }
                    }

                    var messageBody = ms.ToArray();
                    ds.WriteUint16((UInt16)messageBody.Length);
                    ds.WriteFixedBlob(messageBody);
                }
            }

            ds.SendTo(data.ReceiveSocket, session.RemoteEndPoint);
        }
Example #6
0
        private static void OnLogonChallengeOK(Session session, UDPReceiver data)
        {
            Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] CMD_LOGON_CHALLENGE", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port);
            UInt16 packet_size    = data.ReadUint16();
            UInt16 B_bytes_length = data.ReadUint16();

            byte[] B_bytes = new byte[B_bytes_length];
            PublicB = new BigInteger(data.ReadFixedBlob(ref B_bytes, B_bytes_length));
            UInt16 S_bytes_length = data.ReadUint16();

            byte[] S_bytes = new byte[S_bytes_length];
            Salt = new BigInteger(data.ReadFixedBlob(ref S_bytes, S_bytes_length));

            SHA256Managed sha = new SHA256Managed();
            var           u   = new BigInteger(sha.ComputeHash(PublicA.ToByteArray().Concat(PublicB.ToByteArray()).ToArray()).Concat(new byte[] { 0 }).ToArray());

            byte[] passwordHash = sha.ComputeHash(Encoding.ASCII.GetBytes(string.Format("{0}:{1}", USERNAME, PASSWORD.ToUpper())));
            var    x            = new BigInteger(sha.ComputeHash(passwordHash.Concat(Salt.ToByteArray()).ToArray()).Concat(new byte[] { 0 }).ToArray());
            var    S            = BigInteger.ModPow(PublicB - k * BigInteger.ModPow(g, x, N), (a + u * x), N);

            if (S < 0)
            {
                S = S + N;                     //C# incorrectly calculates the mod of negative numbers
            }
            var sessionkey = sha.ComputeHash(S.ToByteArray());

            var M1 = sha.ComputeHash(PublicA.ToByteArray().Concat(PublicB.ToByteArray()).Concat(sessionkey).ToArray());

            using (MemoryStream ms = new MemoryStream()) {
                using (BinaryWriter bw = new BinaryWriter(ms)) {
                    bw.Write(M1, 0, M1.Length);
                }

                byte[] messageBody;
                messageBody = ms.ToArray();

                using (MemoryStream ms1 = new MemoryStream()) {
                    UDPTransmitter transmitter = UDPTransmitter.CreateObject();
                    transmitter.WriteUint16(CMSG_AUTH_LOGON_PROOF);
                    transmitter.WriteUint16((UInt16)messageBody.Length);
                    transmitter.WriteFixedBlob(messageBody);
                    transmitter.SendTo(loginSocket, loginEndpoint);
                }
            }
        }
 public bool Connect()
 {
     if (udpTransmitter != null)
     {
         Close();
     }
     //udpTransmitter = new UDPTransmitter(IPAddress,Port);
     udpTransmitter = new UDPTransmitter(IPAddress, Port, transmissionType);
     try
     {
         udpTransmitter.Connect();
     }
     catch (Exception e)
     {
         Debug.LogWarning("Could not create a valid UDP Transmitter: " + e.Message);
         udpTransmitter = null;
         return(false);
     }
     return(true);
 }
        // Construct a transmitter to send hololens input.
        private Transmitter(int port)
        {
            // Create and start the transorm
#if UNITY_EDITOR
            _transmitter = new UDPTransmitter("127.0.0.1", port);
#else
            _transmitter = new UDPTransmitter(Cluster.masterNode.address, port);
#endif

            _transmitter.Connect();
            if (_transmitterX == null)
            {
#if UNITY_EDITOR
                _transmitterX = new UDPTransmitter("127.0.0.1", 6667);                // TODO: only have one transmitter
#else
                _transmitterX = new UDPTransmitter(Cluster.masterNode.address, 6667); // TODO: only have one transmitter
#endif
                _transmitterX.Connect();
            }
        }
    void Start()
    {
        Debug.Log("Starting up");

        // Initialize OSC clients (transmitters)
        if (oscMode == OscMode.SEND || oscMode == OscMode.SEND_RECEIVE)
        {
            udpTransmitter = new UDPTransmitter(outIP, outPort);
            udpTransmitter.Connect();
        }

        if (oscMode == OscMode.RECEIVE || oscMode == OscMode.SEND_RECEIVE)
        {
            Debug.Log("Setup receiving");
            udpReceiver = new UDPReceiver(inPort, false);
            udpReceiver.MessageReceived += receivedOSC;
            udpReceiver.Start();

            Debug.Log("Finished setting up receiving");
        }
    }
Example #10
0
        private static void OnLogonProof(Session session, UDPReceiver data)
        {
            var sessionData = (ClientInfo)session.Data;

            Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] CMD_AUTH_LOGON_PROOF", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port);

            BigInteger ClientM1;

            var M1len  = data.ReadInt16();
            var M1data = new byte[M1len];

            using (MemoryStream ms = new MemoryStream(data.Buffer, data.CurrentReadPos, data.RemainingBytes)) {
                using (BinaryReader br = new BinaryReader(ms)) {
                    br.Read(M1data, 0, M1len);
                    ClientM1 = new BigInteger(M1data.Concat(new byte[] { 0 }).ToArray());
                }
            }

            if (ClientM1 == sessionData.M1)
            {
                var ds = UDPTransmitter.CreateObject();
                ds.WriteUint16((UInt16)SMSG_AUTH_LOGON_PROOF_OK);
                ds.SendTo(data.ReceiveSocket, session.RemoteEndPoint);

                MySqlCommand cmd = new MySqlCommand(String.Format("UPDATE account SET sessionkey = '{1}', last_ip='{2}', last_login='******' WHERE username = '******'", sessionData.Account, Convert.ToBase64String(sessionData.SessionKey), session.RemoteEndPoint.Address, DateTime.Now.ToString("yyyy-MM-dd")), Program.db);
                cmd.ExecuteNonQuery();

                Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Auth success for user {3}. [session key = {4}]", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account, Convert.ToBase64String(sessionData.SessionKey));
            }
            else
            {
                //Wrong pass
                Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Wrong password for user {3}.", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account);
                var ds = UDPTransmitter.CreateObject();
                ds.WriteUint16((UInt16)SMSG_AUTH_LOGON_PROOF_FAIL);
                ds.WriteUint8((byte)AccountState.LOGIN_UNKNOWN_ACCOUNT);
                ds.SendTo(data.ReceiveSocket, session.RemoteEndPoint);
            }
        }
Example #11
0
 public void Close()
 {
     udpTransmitter.Close();
     udpTransmitter = null;
 }
 public OSCScript(string ip, int port)
 {
     oscTransmitter = setOSCTarget(ip, port);
     oscTransmitter.Connect();
 }
Example #13
0
 // Create the transmitter object
 private static void CreateTransmitter()
 {
     // Create and start the transmitter
     _transmitter = new UDPTransmitter("10.160.98.129" /*ClusterConfig.current.master.address*/, 6668 /*SWAConfig.current.holoPort*/);
     _transmitter.Connect();
 }
Example #14
0
 // Create the transmitter object
 private void CreateTransmitter()
 {
     // Create and start the transmitter
     _transmitter = new UDPTransmitter("192.168.0.100"/*Cluster.masterNode.address*/, SWAConfig.current.holoPort);
     _transmitter.Connect();
 }
Example #15
0
 private void Awake()
 {
     _UdpReceiver = GetComponent <UDPReceiver>();
     _UdpReceiver.SetObserver(this);
     _Udpransmitter = GetComponent <UDPTransmitter>();
 }
Example #16
0
 // Use this for initialization
 public void Init()
 {
     address     = string.Format("/{0}", device);
     transmitter = new UDPTransmitter(ip, port);
     transmitter.Connect();
 }
Example #17
0
        private static void OnLogonChallenge(Session session, UDPReceiver data)
        {
            var sessionData = (ClientInfo)session.Data;

            Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] CMD_LOGON_CHALLENGE", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port);
            UInt16 packet_size = data.ReadUint16();
            int    bMajor      = data.ReadUint8();
            int    bMinor      = data.ReadUint8();
            int    bRevision   = data.ReadUint8();
            int    ClientBuild = data.ReadInt16();
            UInt16 usernameLen = data.ReadUint16();

            sessionData.Account = data.ReadFixedString(usernameLen);
            UInt16 publicALen = data.ReadUint16();

            byte[] publicABytes = new byte[publicALen];
            sessionData.PublicA = new BigInteger(data.ReadFixedBlob(ref publicABytes, publicALen));
            AccountState acc_state = AccountState.LOGIN_DBBUSY;

            string PassString = string.Empty;

            Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] CMD_AUTH_LOGON_CHALLENGE [{3}], Client Version [{4}.{5}.{6}.{7}].", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account, bMajor, bMinor, bRevision, ClientBuild);
            if ((ClientBuild >= REQUIRED_BUILD_LOW) && (ClientBuild <= REQUIRED_BUILD_HIGH))
            {
                try {
                    MySqlCommand cmd = new MySqlCommand(string.Format("SELECT * FROM account WHERE username = '******'", sessionData.Account), Program.db);
                    using (MySqlDataReader reader = cmd.ExecuteReader()) {
                        if (reader.Read())
                        {
                            if ((int)reader["banned"] == 1)
                            {
                                acc_state = AccountState.LOGIN_BANNED;
                            }
                            else
                            {
                                acc_state            = AccountState.LOGIN_OK;
                                PassString           = (string)reader["passwordHash"];
                                sessionData.Verifier = BigInteger.Parse((string)reader["verifier"]);
                                sessionData.Salt     = BigInteger.Parse((string)reader["salt"]);
                                sessionData.Access   = (AccessLevel)reader["accesslevel"];
                            }
                        }
                        else
                        {
                            acc_state = AccountState.LOGIN_UNKNOWN_ACCOUNT;
                        }
                    }
                }
                catch (Exception ex) {
                    Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Data Error [{3}]", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, ex.ToString());
                    acc_state = AccountState.LOGIN_DBBUSY;
                }

                switch (acc_state)
                {
                case AccountState.LOGIN_OK:
                    Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Account found [{3}]", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account);

                    byte[] account      = Encoding.UTF8.GetBytes(sessionData.Account);
                    byte[] passwordHash = Convert.FromBase64String(PassString);

                    var random  = new RNGCryptoServiceProvider();
                    var randomb = new byte[20];
                    random.GetBytes(randomb);
                    randomb[randomb.Length - 1] &= 0x7F;
                    var b = new BigInteger(randomb);
                    sessionData.PublicB = ((sessionData.k * sessionData.Verifier) + BigInteger.ModPow(sessionData.g, b, sessionData.N)) % sessionData.N;

                    SHA256Managed sha = new SHA256Managed();
                    var           u   = new BigInteger(sha.ComputeHash(sessionData.PublicA.ToByteArray().Concat(sessionData.PublicB.ToByteArray()).ToArray()).Concat(new byte[] { 0 }).ToArray());

                    var S = BigInteger.ModPow((sessionData.PublicA * BigInteger.ModPow(sessionData.Verifier, u, sessionData.N)), b, sessionData.N);
                    sessionData.SessionKey = sha.ComputeHash(S.ToByteArray());

                    sessionData.M1 = new BigInteger(sha.ComputeHash(sessionData.PublicA.ToByteArray().Concat(sessionData.PublicB.ToByteArray()).Concat(sessionData.SessionKey).ToArray()).Concat(new byte[] { 0 }).ToArray());

                    var dsOK = UDPTransmitter.CreateObject();
                    dsOK.WriteUint16((UInt16)SMSG_AUTH_LOGON_CHALLENGE_OK);
                    byte[] B_bytes = sessionData.PublicB.ToByteArray();
                    byte[] S_bytes = sessionData.Salt.ToByteArray();
                    dsOK.WriteUint16((UInt16)(4 + B_bytes.Length + S_bytes.Length));                                //packet_length
                    dsOK.WriteUint16((UInt16)B_bytes.Length);
                    dsOK.WriteFixedBlob(B_bytes);
                    dsOK.WriteUint16((UInt16)S_bytes.Length);
                    dsOK.WriteFixedBlob(S_bytes);
                    dsOK.SendTo(data.ReceiveSocket, session.RemoteEndPoint);
                    return;

                case AccountState.LOGIN_UNKNOWN_ACCOUNT:
                    Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Account not found [{3}]", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account);
                    break;

                case AccountState.LOGIN_BANNED:
                    Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Account banned [{3}]", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account);
                    break;

                case AccountState.LOGIN_NOTIME:
                    Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Account prepaid time used [{3}]", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account);
                    break;

                case AccountState.LOGIN_ALREADYONLINE:
                    Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Account already logged in the game [{3}]", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account);
                    break;

                default:
                    Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] Account error [{3}]", DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, sessionData.Account);
                    break;
                }
                var ds = UDPTransmitter.CreateObject();
                ds.WriteUint16((UInt16)SMSG_AUTH_LOGON_CHALLENGE_FAIL);
                ds.WriteUint8((byte)acc_state);
                ds.SendTo(data.ReceiveSocket, session.RemoteEndPoint);
            }
            else
            {
                Console.WriteLine("[{0:yyyy-MM-dd HH\\:mm\\:ss}] [{1}:{2}] WRONG_VERSION [{3}.{4}.{5}.{6}]",
                                  DateTime.Now, session.RemoteEndPoint.Address, session.RemoteEndPoint.Port, bMajor, bMinor, bRevision, ClientBuild);

                var ds = UDPTransmitter.CreateObject();
                ds.WriteUint16((UInt16)SMSG_AUTH_LOGON_CHALLENGE_FAIL);
                ds.WriteUint8((byte)AccountState.LOGIN_BADVERSION);
                ds.SendTo(data.ReceiveSocket, session.RemoteEndPoint);
            }
        }
 public OSCScript()
 {
     oscTransmitter = setOSCTarget("192.168.0.111", 6666);
     oscTransmitter.Connect();
 }