private static void signUp(AdvanceStream stream, MainWindow mainWindow) { string digCer = stream.ReadString(); DigitalCertificate dc = DigitalCertificate.newClientObject(digCer); MainWindow.instance.Log("Get client certificate....."); string publicKey = ""; MainWindow.instance.Log("connect to CA....."); MainWindow.clientForCertificate.connect((e) => { e.Write("2"); }); publicKey = getCApublicKey(MainWindow.clientForCertificate.stream); KeysManager.RSAPcublicKeyOfCA = publicKey; MainWindow.instance.Log("CA public key", publicKey); if (dc.verviy()) { stream.Write("1"); byte[] encrSingUpdata = stream.ReadBytes(); RSA rsa = new RSA("Server"); byte[] decrypSingUpData = rsa.decrypt(encrSingUpdata, KeysManager.RSAPrivateKey); MainWindow.instance.Log("Encrypted SignUp Data", Encoding.UTF8.GetString(encrSingUpdata)); MainWindow.instance.Log("Decrypted SignUp Data", Encoding.UTF8.GetString(decrypSingUpData)); SignUpObject signUpObject = SignUpObject.newLoginObject(Encoding.UTF8.GetString(decrypSingUpData)); var user = DBContext.getInstace().Clients.SingleOrDefault(item => item.Username == signUpObject.username); if (user != null) { if (user.Username.Equals(signUpObject.username)) { stream.Write("0"); MainWindow.instance.Log("Error username already taken ", signUpObject.username); } else { stream.Write("1"); MainWindow.instance.Log("Error password already taken"); } } else { DBContext.getInstace().Clients.Add(new Models.Client(signUpObject.name, signUpObject.username, signUpObject.password)); DBContext.getInstace().SaveChanges(); stream.Write("2"); user = DBContext.getInstace().Clients.SingleOrDefault(item => item.Username == signUpObject.username); stream.Write(user.toJsonObject() + '\t' + ""); byte[] encryptKey = rsa.encrypte(KeysManager.AESkey, dc.SubjectPublicKey); stream.Write(encryptKey); MainWindow.instance.Log("Sign Up Successfully", user.Name); } } else { stream.Write("0"); } MainWindow.instance.Log(); }
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); }