Esempio n. 1
0
        private void ServerGreetingReceived(AsynchronousSocket socket)
        {
            if (socket.ReceiveBufferLength != 80)
            {
                OnDebug("Server did not send a proper greeting");
                socket.Disconnect();
                return;
            }
            string salt      = SRP6.BytesToHex(SRP6.SubArray(socket.ReceiveBuffer, 0, 32));
            string pubKey    = SRP6.BytesToHex(SRP6.SubArray(socket.ReceiveBuffer, 32, 32));
            string scrambler = SRP6.BytesToHex(SRP6.SubArray(socket.ReceiveBuffer, 64, 16));

            // Setup the SessionKey
            srpClient = new SRP6(IdentityHash, Modulus, 0x07, salt);
            srpClient.SetSessionKey(pubKey, scrambler);
            OnDebug("Salt = " + salt);
            OnDebug("Server's PublicKey = " + pubKey);
            OnDebug("Scrambler = " + scrambler);

            step++;

            // Send my public key to the server
            OnDebug("Client->PublicKey");
            OnDebug("PublicKey = " + srpClient.GetPublicKey());
            byte[] reply = srpClient.PublicKey.ToUnsignedByteArray();
            socket.Send(reply, 0, reply.Length);
            OnDebug("SessionKey = " + srpClient.GetSessionKey());
        }
Esempio n. 2
0
        protected bool OnAuthenticationRequest(AsynchronousSocket socket, byte[] identityHash)
        {
            bool allow = false;
            AuthenticationRequestEventHandler handler = AuthenticationRequest;

            if (handler != null)
            {
                AuthenticationRequestEventArgs args =
                    new AuthenticationRequestEventArgs(identityHash);
                foreach (AuthenticationRequestEventHandler tmp in
                         handler.GetInvocationList())
                {
                    tmp(this, args);
                    if (args.Allow)
                    {
                        allow = true;
                        break;
                    }
                }
            }

            if (!allow)
            {
                socket.Disconnect();
                return(false);
            }

            return(true);
        }
Esempio n. 3
0
 private void ProcessFileReceive(AsynchronousSocket socket, byte[] encryptedMessage)
 {
     socket.WriteFileReceive(encryptedMessage);
     BytesReceived += Socket.ReceiveBufferSize;
     if (ReceivedFileBlock != null)
     {
         ReceivedFileBlock.Invoke(this, new EventArgs());
     }
     if (socket.FileBytesReceived >= encryptedFileSize)
     {
         isReceivingUpdate = false;
         byte[]     encryptedData = receiveStream.ToArray();
         byte[]     decryptedData = srpClient.Decrypt(encryptedData);
         FileStream fileStream;
         if (!File.Exists(UpdateFileLocation))
         {
             fileStream = new FileStream(UpdateFileLocation, FileMode.CreateNew, FileAccess.Write);
         }
         else
         {
             fileStream = new FileStream(UpdateFileLocation, FileMode.Truncate, FileAccess.Write);
         }
         fileStream.Write(decryptedData, 0, decryptedData.Length);
         fileStream.Flush();
         fileStream.Close();
         socket.EndFileReceive();
         FileInfo fileInfo = new FileInfo(UpdateFileLocation);
         if (fileInfo.Length == UpdateFileSize)
         {
             wasUpdateCompleted = true;
         }
         socket.Disconnect();
     }
 }
Esempio n. 4
0
        private void ProcessDecryptedClientMessages(AsynchronousSocket socket, byte[] message)
        {
            string command = ASCIIEncoding.ASCII.GetString(message, 0, (message.Length > 128 ? 128 : message.Length));

            OnDebug("Client Message \"" + SRP6.ArrayToString(message, 0, message.Length) + "\"");

            if (command.StartsWith("SUBMIT_CRASH")) // Client wants to send us a crash report
            {
                OnDebug("Beginning submitting Crash Report");
                string   strMessage = SRP6.ArrayToString(message, 13, message.Length - 13);
                string[] strTokens  = strMessage.Split(' ');
                try
                {
                    crashReportSize = Convert.ToInt32(strTokens[0]);
                }
                catch { }
                try
                {
                    crashReportEncryptedSize = Convert.ToInt32(strTokens[1]);
                }
                catch { }

                if ((crashReportSize > 0) && (crashReportEncryptedSize >= crashReportSize))
                {
                    isReceivingCrashReport = true;
                    // We know what to expect now, send "PROCEED" message.
                    srpServer.EncryptAndSend(socket, "PROCEED");
                }
                else
                {
                    OnDebug(
                        "Failed to get valid transfer information from the client");
                }
            }
            else if (command.StartsWith("VERSION"))
            {
                srpServer.EncryptAndSend(socket, TemposVersionString);
            }
            else if (command.StartsWith("SEND"))
            {
                socket.SendStream          = new FileStream(UpdateFileLocation, FileMode.Open, FileAccess.Read);
                socket.EncryptedSendStream = srpServer.Encrypt(socket.SendStream);
                srpServer.EncryptAndSend(socket, socket.SendStream.Length.ToString() + " " +
                                         socket.EncryptedSendStream.Length.ToString());
            }
            else if (command.StartsWith("CONTINUE"))
            {
                if (socket.EncryptedSendStream != null)
                {
                    socket.SendFile(socket.EncryptedSendStream);
                }
            }
            else
            {
                socket.Disconnect();
                OnDebug("Unhandled: " + command);
            }
        }
Esempio n. 5
0
        private void ServerReadyReceived(AsynchronousSocket socket)
        {
            byte[] message = SRP6.SubArray(
                socket.ReceiveBuffer, 0,
                socket.ReceiveBufferLength);
            string strMessage = SRP6.ArrayToString(message, 0, message.Length);

            // Server and client are now both ready for encrypted communications
            if (strMessage.Equals("READY"))
            {
                OnDebug("Received \"READY\" from server");
                step++;
                if (Authenticated != null)
                {
                    Authenticated.Invoke(this, new EventArgs());
                }

                if (crashReportOnly)
                {
                    // Request to send a crash report to the server
                    OnDebug("Telling server we want to upload a crash report");
                    try
                    {
                        byte[] serializedObject = CrashException.SerializeObject();
                        socket.SendStream          = new MemoryStream(serializedObject);
                        socket.EncryptedSendStream = srpClient.Encrypt(socket.SendStream);
                        srpClient.EncryptAndSend(socket, "SUBMIT_CRASH " +
                                                 socket.SendStream.Length + " " +
                                                 socket.EncryptedSendStream.Length);
                    }
                    catch (Exception ex)
                    {
                        OnDebug("Exception: " + ex.Message);
                    }
                }
                else
                {
                    // Request the current version
                    OnDebug("Sending version-check request to server");
                    isCheckingVersion = true;
                    srpClient.EncryptAndSend(socket, "VERSION");
                }
            }
            else
            {
                OnDebug("Authentication Failed");
                socket.Disconnect();
            }
        }
Esempio n. 6
0
        private void DisconnectTimeoutStart(object obj)
        {
            AsynchronousSocket socket    = obj as AsynchronousSocket;
            DateTime           startTime = DateTime.Now;
            DateTime           endTime   = startTime + new TimeSpan(0, 0, 15);

            while (DateTime.Now < endTime)
            {
                Thread.Sleep(1000);
            }
            if (socket.Step < 2) // Not authenticated
            {
                socket.Disconnect();
                socket.Close();
            }
        }
Esempio n. 7
0
        void listenerSocket_ClientConnected(object sender, EventArgs e)
        {
            AsynchronousSocket socket   = sender as AsynchronousSocket;
            IPEndPoint         endPoint = socket.TcpSocket.RemoteEndPoint as IPEndPoint;

            OnDebug("Client Connected: (" + endPoint.Address + ")");
            if (!IsClientPermitted(socket))
            {
                socket.Disconnect();
                socket.Close();
                return;
            }
            StartAuthenicationTimeOut(socket);
            clients.Add(socket);
            socket.Disconnected     += new EventHandler(clientSocket_Disconnected);
            socket.ReceiveCompleted += new EventHandler(clientSocket_ReceiveCompleted);
        }
Esempio n. 8
0
        public void Stop()
        {
            // Give 30 seconds for clients to finish downloading
            int retriesRemaining = 60;

            while ((clients.Count > 0) && (retriesRemaining > 0))
            {
                Thread.Sleep(500);
                retriesRemaining--;
            }
            foreach (object sock in clients)
            {
                AsynchronousSocket socket = sock as AsynchronousSocket;
                socket.Disconnect();
            }
            clients.Clear();
            listenerSocket.StopListening();
        }
Esempio n. 9
0
        private void ProcessFileReceive(AsynchronousSocket socket, byte[] encryptedMessage)
        {
            socket.WriteFileReceive(encryptedMessage);
            bytesReceived += socket.ReceiveBufferSize;
            //if (ReceivedFileBlock != null)
            //    ReceivedFileBlock.Invoke(this, new EventArgs());
            if (socket.FileBytesReceived >= crashReportEncryptedSize)
            {
                isReceivingCrashReport = false;
                byte[] encryptedData = receiveStream.ToArray();
                byte[] decryptedData = srpServer.Decrypt(encryptedData);

                Exception ex = (Exception)decryptedData.DeserializeObject();
                if (ReceivedCrashException != null)
                {
                    ReceivedCrashException.Invoke(this, new ExceptionEventArgs(ex));
                }

                socket.EndFileReceive();
                socket.Disconnect();
            }
        }
Esempio n. 10
0
        private void ProcessDecryptedServerMessages(AsynchronousSocket socket, byte[] message)
        {
            // Server is going to tell us the size of the update
            if (isRequestingSend)
            {
                isRequestingSend = false;
                string   strMessage = SRP6.ArrayToString(message, 0, message.Length);
                string[] strTokens  = strMessage.Split(' ');
                try
                {
                    UpdateFileSize = Convert.ToInt32(strTokens[0]);
                }
                catch { }
                try
                {
                    encryptedFileSize = Convert.ToInt32(strTokens[1]);
                }
                catch { }

                if ((UpdateFileSize > 0) && (encryptedFileSize >= UpdateFileSize))
                {
                    isReceivingUpdate = true;
                    srpClient.EncryptAndSend(socket, "CONTINUE");
                }
                else
                {
                    OnDebug("Bad transfer information sent from the server");
                }
                return;
            }

            {
                string strMessage = SRP6.ArrayToString(message, 0, message.Length);
                OnDebug("Server Message \"" + strMessage + "\"");

                if (strMessage.Equals("PROCEED")) // CrashException != null
                {
                    // Send the CrashException to the server (serialized)
                    OnDebug("Sending crash report to server");
                    srpClient.EncryptAndSend(socket, CrashException.SerializeObject());
                }
            }
            if (isCheckingVersion)
            {
                isCheckingVersion = false;
                string text = SRP6.ArrayToString(message, 0, message.Length);
                OnDebug("Server reports that version is \"" + text + "\"");
                Srp6ClientSocket.NewestUpdateVersion = text;
                if (ReceivedVersion != null)
                {
                    ReceivedVersion.Invoke(this, new EventArgs());
                }
                if (checkVersionOnly)
                {
                    isCheckingVersion = false;
                    socket.Disconnect();
                }
                else
                {
                    isRequestingSend = true;
                    srpClient.EncryptAndSend(socket, "SEND");
                }
            }
        }