Exemplo n.º 1
0
    private void frmBase_FormClosing(object sender, FormClosingEventArgs e)
    {

        try
        {
            if (serverSocket != null)
            //if (serverSocket.Connected)
            {
                Packet sendData = new Packet();
                sendData.ChatMessage = "LogOut";
                sendData.ChatDataIdentifier = DataIdentifier.Message;
                byte[] data = sendData.GetDataStream();
                for (int i = 0; i < CLientsList.Count; i++)
                    serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
            }
        }
        catch { }
    }
Exemplo n.º 2
0
    void NewSession()
    {
      Packet sendData = new Packet();
      sendData.ChatMessage = "LogOut";
      sendData.ChatDataIdentifier = DataIdentifier.Message;
      byte[] data = sendData.GetDataStream();
      for (int i = 0; i < CLientsList.Count; i++)
        serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
      if (serverSocket != null)
      {
        //serverSocket.Disconnect(true);
        serverSocket.Dispose();
        //serverSocket.Close();
      }
      Hide();
      frmAutorization frmA = new frmAutorization();
      frmA.ShowDialog();

      connection = frmA.connection;
      db = new DB_CEGSA(connection);
      var_G = new BigInteger(0);
      var_Q = new BigInteger(0);
      var_Y = new BigInteger(0);
      var_E = new BigInteger(0);
      var_S = new BigInteger(0);
      var_R = new BigInteger(0);
      var_NewE = new BigInteger(0);
      var_NewR = new BigInteger(0);
      var_Si = new BigInteger[1];
      var_Hi = new BigInteger[1];
      var_Ri = new BigInteger[1];
      var_Yi = new BigInteger[1];
      int var_Ri_Count = 0;
      int var_Yi_Count = 0;
      int var_Si_Count = 0;
      int var_Hi_Count = 0;
      this.AcceptButton = btnStart;

      kol_clients = 0;
      AllowAutorize = true;
      try
      {
        clientList.Clear();
      }
      catch { }
      try
      {

        listClients.Clear();
      }
      catch { }
      try
      {
        lstClients.Items.Clear();
      }
      catch { }
      try
      {
        CLientsList.Clear();
      }
      catch { }

      lstCurrentClients.Items.Clear();
      progressBar1.Value = 0;
      toolStrip1.Enabled = true;
      tbtnAdd.Enabled = true;
      tbtnDel.Enabled = true;
      tbtnEdit.Enabled = true;
      tbtnChangeAdminPass.Enabled = true;
      btnStart.Enabled = true;
      lstClients.Enabled = true;
      lstCurrentClients.Enabled = true;




      lstCurrentClients.Visible = true;
      btnAddClient.Visible = true;
      btnAddAllClients.Visible = true;
      btnDelAllClients.Visible = true;
      btnDelClient.Visible = true;
      label1.Visible = true;
      lstCurrentClients.Enabled = true;
      btnAddClient.Enabled = true;
      btnAddAllClients.Enabled = true;
      btnDelAllClients.Enabled = true;
      btnDelClient.Enabled = true;
      label1.Enabled = true;
      cmbServerAddress.Enabled = true;


      ReadListClients();

      Show();

    }
Exemplo n.º 3
0
    private void ReceiveData(IAsyncResult asyncResult)
    {
      try
      {
        byte[] data;

        // Initialise a packet object to store the received data
        Packet receivedData = new Packet(this.dataStream);

        // Initialise a packet object to store the data to be sent
        Packet sendData = new Packet();

        // Initialise the IPEndPoint for the clients
        IPEndPoint clients = new IPEndPoint(IPAddress.Any, 8080);

        // Initialise the EndPoint for the clients
        EndPoint epSender = (EndPoint)clients;
        IPEndPoint broadcast = new IPEndPoint(IPAddress.Broadcast, 0);
        EndPoint epBroadcast = (EndPoint)broadcast;
        // Receive all data
        serverSocket.EndReceiveFrom(asyncResult, ref epSender);

        // Start populating the packet to be sent
        sendData.ChatDataIdentifier = receivedData.ChatDataIdentifier;

        switch (receivedData.ChatDataIdentifier)
        {
          case DataIdentifier.Message:
            {
              if (receivedData.ChatMessage[0] == '~')
              {
                bool find = false;
                bool OutSession = true;
                if (AllowAutorize)
                {
                  string[] temp = receivedData.ChatMessage.Split('|');
                  var query = from U in db.User
                              where U.Login == temp[1] && U.Password == temp[2]
                              select U;

                  foreach (User U in query)
                  {
                    for (int i = 0; i < listClients.Count; i++)
                    {
                      if (U.Login == listClients[i].Login)
                      {

                        CLIENT NewClient = new CLIENT();
                        NewClient.ep = epSender;
                        NewClient.user = U;
                        bool exist = false;
                        for (int j = 0; j < CLientsList.Count; j++)
                          if (CLientsList[j].user.Login == U.Login)
                          {
                            exist = true;
                            break;
                          }
                        if (!exist)
                        {
                          CLientsList.Add(NewClient);
                          find = true;
                          kol_clients++;
                          OutSession = false;

                        }

                      }

                      if (lstCurrentClients.Items[i].ToString() == U.Login)
                        if (lstCurrentClients.InvokeRequired)
                          lstCurrentClients.Invoke(new SetChecked(Checked), i);

                    }

                  }
                }


                sendData.ChatMessage = "!";
                if (find)
                  sendData.ChatMessage += "|True";
                else
                  sendData.ChatMessage += "|False";
                //sendData.ChatMessage = "True";
                if (OutSession)
                  sendData.ChatMessage += "|Out";
                data = sendData.GetDataStream();
                serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, epSender, new AsyncCallback(this.SendData), epSender);
                //  serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, epSender, new AsyncCallback(this.SendData), epSender);
                if (kol_clients == listClients.Count)
                {
                  if (lstClients.InvokeRequired)
                  {
                    lstClients.Invoke(new Progress(RaiseProgress), null);
                    lstClients.Invoke(new SetText(SetlblStatusText), "Идет генерация ключей");
                  }

                  serverSocket.EnableBroadcast = true;
                  sendData.ChatMessage = "AllClOK";
                  data = sendData.GetDataStream();
                  AllowAutorize = false;

                  var_Ri = new BigInteger[kol_clients];
                  var_Si = new BigInteger[kol_clients];
                  var_Hi = new BigInteger[kol_clients];
                  var_Yi = new BigInteger[kol_clients];
                  var_Ri_Count = 0;
                  var_Si_Count = 0;
                  var_Hi_Count = 0;
                  var_Yi_Count = 0;
                  ////serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.Broadcast, epBroadcast, new AsyncCallback(this.SendData), broadcast);
                  for (int i = 0; i < CLientsList.Count; i++)
                    serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
                  ///P
                  var_P = Sign.BI_Generate_P();
                  if (lstClients.InvokeRequired)
                    lstClients.Invoke(new Progress(RaiseProgress), null);
                  sendData.ChatMessage = "P|" + var_P.ToString();

                  //if (textBox1.InvokeRequired)
                  //    textBox1.Invoke(new SetText(PrintText), sendData.ChatMessage);

                  data = sendData.GetDataStream();
                  for (int i = 0; i < CLientsList.Count; i++)
                    serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
                  //MessageBox.Show(sendData.ChatMessage);
                  /////Q
                  var_Q = Sign.BI_Generate_Q(var_P);
                  if (lstClients.InvokeRequired)
                    lstClients.Invoke(new Progress(RaiseProgress), null);
                  sendData.ChatMessage = "Q|" + var_Q.ToString();
                  data = sendData.GetDataStream();
                  for (int i = 0; i < CLientsList.Count; i++)
                    serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
                  //MessageBox.Show(sendData.ChatMessage);

                  /////G
                  var_G = Sign.BI_Generate_G(var_P, var_Q);
                  if (lstClients.InvokeRequired)
                    lstClients.Invoke(new Progress(RaiseProgress), null);
                  sendData.ChatMessage = "G|" + var_Q.ToString();
                  data = sendData.GetDataStream();
                  for (int i = 0; i < CLientsList.Count; i++)
                    serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
                  //MessageBox.Show(sendData.ChatMessage);


                }

              }
              else
                if (receivedData.ChatMessage[0] == 'R')
                {
                  if (var_Ri_Count < kol_clients)
                  {
                    string[] temp = receivedData.ChatMessage.Split('|');
                    var_Ri[var_Ri_Count] = new BigInteger(temp[1], 10);
                    //MessageBox.Show("Ri[" + var_Ri_Count.ToString() + "]= "+ var_Ri[var_Ri_Count].ToString());
                    var_Ri_Count++;
                    if (var_Ri_Count == kol_clients)
                    {
                      var_R = Sign.Calculate_R(var_Ri, var_P);
                      if (lstClients.InvokeRequired)
                        lstClients.Invoke(new Progress(RaiseProgress), null);
                      //MessageBox.Show(var_R.ToString());
                      var_E = Sign.Calculate_E(var_R, var_Q);
                      if (lstClients.InvokeRequired)
                        lstClients.Invoke(new Progress(RaiseProgress), null);
                      sendData.ChatMessage = "E|" + var_E.ToString();
                      data = sendData.GetDataStream();
                      for (int i = 0; i < CLientsList.Count; i++)
                        serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
                      if (lstClients.InvokeRequired)
                        lstClients.Invoke(new SetText(SetlblStatusText), "Ожидание ответа от клиентов...");
                    }

                  }

                }
                else
                  if (receivedData.ChatMessage[0] == 'S')
                  {
                    if (var_Si_Count < kol_clients)
                    {
                      if (lstClients.InvokeRequired)
                        lstClients.Invoke(new SetText(SetlblStatusText), "Идет генерация ЭЦП...");
                      string[] temp = receivedData.ChatMessage.Split('|');
                      var_Si[var_Si_Count] = new BigInteger(temp[1], 10);
                      //MessageBox.Show("Si[" + var_Si_Count.ToString() + "]= " + var_Si[var_Si_Count].ToString());
                      var_Si_Count++;
                      if (var_Si_Count == kol_clients)
                      {
                        var_S = Sign.Calculate_S(var_Si, var_Q);
                        if (lstClients.InvokeRequired)
                          lstClients.Invoke(new Progress(RaiseProgress), null);
                        // MessageBox.Show(var_S.ToString());

                        sendData.ChatMessage = "S|" + var_S.ToString();
                        data = sendData.GetDataStream();
                        for (int i = 0; i < CLientsList.Count; i++)
                          serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
                      }

                    }

                  }
                  else
                    if (receivedData.ChatMessage[0] == 'Y')
                    {
                      if (var_Yi_Count < kol_clients)
                      {
                        string[] temp = receivedData.ChatMessage.Split('|');
                        var_Yi[var_Yi_Count] = new BigInteger(temp[1], 10);
                        //MessageBox.Show("Yi[" + var_Yi_Count.ToString() + "]= " + var_Yi[var_Yi_Count].ToString());
                        var_Yi_Count++;
                        if (var_Yi_Count == kol_clients)
                        {
                          sendData.ChatMessage = "Need_Hi";
                          data = sendData.GetDataStream();
                          for (int i = 0; i < CLientsList.Count; i++)
                            serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
                        }

                      }

                    }
                    else
                      if (receivedData.ChatMessage[0] == 'H')
                      {
                        if (var_Hi_Count < kol_clients)
                        {
                          string[] temp = receivedData.ChatMessage.Split('|');
                          var_Hi[var_Hi_Count] = new BigInteger(temp[1], 10);
                          //MessageBox.Show("Hi[" + var_Hi_Count.ToString() + "]= " + var_Hi[var_Hi_Count].ToString());
                          var_Hi_Count++;
                          if (var_Hi_Count == kol_clients)
                          {
                            var_Y = Sign.Calculate_Y(var_Yi, var_Hi, var_P);
                            if (lstClients.InvokeRequired)
                              lstClients.Invoke(new Progress(RaiseProgress), null);
                            //MessageBox.Show("Y= " + var_Y.ToString());
                            Session session = new Session();
                            session.E = var_E.ToString();
                            session.G = var_G.ToString();
                            session.P = var_P.ToString();
                            session.S = var_S.ToString();
                            session.Y = var_Y.ToString();
                            session.Q = var_Q.ToString();
                            try
                            {
                              db.Session.InsertOnSubmit(session);
                              db.SubmitChanges();
                            }
                            catch (Exception ex)
                            {
                              MessageBox.Show("Не удалось добавить данные в базу по причине:\n" + ex.ToString());
                            }

                            sendData.ChatMessage = "OK";
                            if (lstClients.InvokeRequired)
                            {
                              lstClients.Invoke(new Progress(MaxProgress), null);
                              lstClients.Invoke(new SetText(SetlblStatusText), "Документ подписан");
                            }
                            bool VerifyResult = Sign.Verify_Sign(var_Y, var_E, var_S, var_P, var_Q, var_G);                           
                           
                            data = sendData.GetDataStream();
                            for (int i = 0; i < CLientsList.Count; i++)
                              serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
                            DateTime CurrDate = DateTime.Now;
                            SignFileName = "Sign_" + CurrDate.Day.ToString() + "." + CurrDate.Month.ToString() + "." + CurrDate.Year.ToString() + "_" + CurrDate.Hour.ToString() + "." + CurrDate.Minute.ToString() + "." + CurrDate.Second.ToString() + ".CEGSA";
                            FileStream FS = new FileStream(SignFileName, FileMode.Create);
                            StreamWriter sw = new StreamWriter(FS);
                            sw.WriteLine(var_S.ToString());
                            sw.WriteLine(var_E.ToString());
                            sw.Close();
                            /*
                            if (VerifyResult)
                              MessageBox.Show("Подпись верна", "Сервер");
                            else
                              MessageBox.Show("Подпись НЕ верна", "Сервер");
                             * */
                            frmFinalMsg frmFinMsg = new frmFinalMsg();
                            frmFinMsg.ChangePrompt("Композиционная ЭЦП успешно сформирована и сохранена\nв " + SignFileName);
                            frmFinMsg.ShowDialog();
                            if (frmFinMsg.flagNewSession)
                                if (lstClients.InvokeRequired)
                                {
                                    lstClients.Invoke(new BeginNewSes(BeginNewSession), null);
                                    while (true) ;
                                }
                          }

                        }

                      }
                      else
                        if (receivedData.ChatMessage[0] == 'V')
                        {
                          string[] temp = receivedData.ChatMessage.Split('|');
                          var_S = new BigInteger(temp[1], 10);
                        }
                        else
                          if (receivedData.ChatMessage[0] == 'B')
                          {
                            string[] temp = receivedData.ChatMessage.Split('|');
                            var_E = new BigInteger(temp[1], 10);
                            bool VerifyResult = false;
                            if (var_S != 0)
                            {
                              if (lstClients.InvokeRequired)
                                lstClients.Invoke(new Progress(MaxProgress), null);
                              var sessions = from S in db.Session
                                             where S.S == var_S.ToString() && S.E == var_E.ToString()
                                             select S;
                              foreach (Session session in sessions)
                              {
                                var_Y = new BigInteger(session.Y, 10);
                                var_G = new BigInteger(session.G, 10);
                                var_P = new BigInteger(session.P, 10);
                                var_Q = new BigInteger(session.Q, 10);
                                VerifyResult = Sign.Verify_Sign(var_Y, var_E, var_S, var_P, var_Q, var_G);
                              }


                            }

                            if (VerifyResult)
                              sendData.ChatMessage = "VerifyTrue";
                            else
                              sendData.ChatMessage = "VerifyFalse";

                            data = sendData.GetDataStream();

                            serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, epSender, new AsyncCallback(this.SendData), epSender);
                          }
              //else
              //if (receivedData.ChatMessage == "LogOut")
              //{
              //    if (!AllowAutorize)
              //    {
              //        sendData.ChatMessage = "LogOut";
              //        sendData.ChatDataIdentifier = DataIdentifier.Message;
              //        data = sendData.GetDataStream();
              //        for (int i = 0; i < CLientsList.Count; i++)
              //            serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, CLientsList[i].ep, new AsyncCallback(this.SendData), CLientsList[i].ep);
              //        MessageBox.Show("Сессия завершена одним из клиентов");

              //        if (lstClients.InvokeRequired)
              //            lstClients.Invoke(new Progress(NewSession), null);
              //        listClients.Clear();
              //        CLientsList.Clear();
              //    }

              //}
            }
            break;

          case DataIdentifier.LogIn:
            // Разрешаем авторизацию пользователей  
            sendData.ChatMessage = "#";
            data = sendData.GetDataStream();
            serverSocket.BeginSendTo(data, 0, data.Length, SocketFlags.None, epSender, new AsyncCallback(this.SendData), epSender);
            break;

        }


        // Get packet as byte array
        data = sendData.GetDataStream();

        // Listen for more connections again...
        serverSocket.BeginReceiveFrom(this.dataStream, 0, this.dataStream.Length, SocketFlags.None, ref epSender, new AsyncCallback(this.ReceiveData), epSender);


      }

      catch (ObjectDisposedException) { }
      catch (ArgumentException) { }
      catch (Exception ex)
      {

        if (ex.Message != "Удаленный хост принудительно разорвал существующее подключение") ;
        MessageBox.Show("ReceiveData Error: " + ex.Message, "Server", MessageBoxButtons.OK, MessageBoxIcon.Error);
      }
    }