public static bool getCertificate(AdvanceStream stream, string userName, string publicKey, out Models.DigitalCertificate dc)
        {
            stream.Write("0");
            stream.Write(userName + '\t');
            stream.Write(publicKey);
            string result = stream.ReadString();

            if (result == "1")
            {
                string certificateString = stream.ReadString();
                Models.DigitalCertificate certificate = Models.DigitalCertificate.newClientObject(certificateString);
                dc = certificate;
                MainWindow.instance.Log(certificate.ToString());
                MessageBox.Show(certificate.ToString());
                return(true);
            }
            else
            {
                dc = null;
                return(false);
            }
        }
        public static bool SignUp(AdvanceStream stream, string signUpData)
        {
            bool         result       = false;
            bool         signUpResult = false;
            SignUpObject signUp       = SignUpObject.newLoginObject(signUpData);

            MainWindow.clientForCertificate.connectUntilSuss((e) =>
            {
                RequestsManager.connectToCA(e);
            });
            RSA rsa = new RSA(signUp.name);

            KeyManager.generateRSAPublicKey(rsa.rsaSP);
            KeyManager.generateRSAPrivateKey(rsa.rsaSP);
            Models.DigitalCertificate dc = new Models.DigitalCertificate();
            result = getCertificate(MainWindow.clientForCertificate.stream, signUp.name, KeyManager.RSAPublicKey, out dc);

            stream.Write("5");
            if (result)

            {
                stream.Write(dc.toJsonObject());
                string checkResult = stream.ReadString();
                if (checkResult == "1")
                {
                    MainWindow.instance.Log("Certificate has been checked\nreciving Server Public Key");
                    byte[] signUpByte             = Encoding.UTF8.GetBytes(signUpData);
                    byte[] EncreptedLoginDataByte = rsa.encrypte(signUpByte, KeyManager.serverRSAPublicKey);

                    MainWindow.instance.Log("Sign Up Data", signUpData);
                    MainWindow.instance.Log("Encrypted Sign Up Data", Encoding.UTF8.GetString(EncreptedLoginDataByte));

                    stream.Write(EncreptedLoginDataByte);
                    string response = stream.ReadString();
                    if (response.Equals("0"))
                    {
                        //no user
                        MainWindow.instance.Log("User name is taken");
                        signUpResult = false;
                    }
                    else if (response.Equals("1"))
                    {
                        //wrong password
                        MainWindow.instance.Log("Password is takten");
                        signUpResult = false;
                    }
                    else
                    {
                        //ok
                        response = stream.ReadString();
                        string[] words = response.Split('\t');
                        MainWindow.user = Server.Models.Client.newClientObject(words[0]);
                        MainWindow.instance.Log(words[0]);
                        byte[] inStream  = stream.ReadBytes();
                        byte[] decrypKey = rsa.decrypt(inStream, KeyManager.RSAPrivateKey);
                        MainWindow.instance.Log("Encrypted AES Key", Convert.ToBase64String(inStream, 0, inStream.Length));
                        KeyManager.serverAESPublicKey = Convert.ToBase64String(decrypKey, 0, decrypKey.Length);
                        MainWindow.instance.Log("AES Key", KeyManager.serverAESPublicKey);
                        signUpResult = true;
                    }
                }
                else
                {
                    MessageBox.Show("Not a vailed certificate");
                }
                MainWindow.instance.Log();
            }
            else
            {
                MessageBox.Show("Can't get a certificate");
            }
            return(signUpResult);
        }