public CSessionKeyResponse GetSessionKeyForChatConnection(CSessionParams sessionParams) { // get users from the data base User retUser1FromDB = m_DBservice.getUserByName(sessionParams.client1UserName); User retUser2FromDB = m_DBservice.getUserByName(sessionParams.client2UserName); UserServiceData localUser = users_list[sessionParams.client1UserName]; UserServiceData partnerUser = users_list[sessionParams.client2UserName]; // check validity if (retUser1FromDB == null || retUser2FromDB == null || localUser == null || partnerUser == null) { if (retUser1FromDB == null) { Console.Write(sessionParams.client1UserName + "not exist in DB"); } if (retUser2FromDB == null) { Console.Write(sessionParams.client2UserName + "not exist in DB"); } if (localUser == null) { Console.Write(sessionParams.client1UserName + "not logged in"); } if (partnerUser == null) { Console.Write(sessionParams.client2UserName + "not logged in"); } return(null); } // genrate new session key byte[] sessionKey = CAes.NewKey(); //encrypt Eka [ Ks || || Kb[Ks] ] byte[] encryptedDataForClientB = CAes.SimpleEncrypt(sessionKey, partnerUser.SessionKey, partnerUser.SessionKey); //Kb[Ks] byte[] keyA = CAes.SimpleEncrypt(sessionKey, localUser.SessionKey, localUser.SessionKey); //Ka[Ks] byte[] keyAB = CAes.SimpleEncrypt(encryptedDataForClientB, localUser.SessionKey, localUser.SessionKey); //Ka[clientB data] // set return value CSessionKeyResponse retVal = new CSessionKeyResponse(); retVal.m_sessionKeyA = keyA; retVal.m_sessionKeyB = keyAB; users_list[sessionParams.client1UserName].clientKdcCallBack.startChatSession(retUser2FromDB.ID + 1100, retUser2FromDB.Name, true); users_list[sessionParams.client2UserName].clientKdcCallBack.startChatSession(retUser1FromDB.ID + 1100, retUser1FromDB.Name, false); return(retVal); }
private void getSessionKeyWorker_DoWork(object sender, DoWorkEventArgs e) { string partnerUsernameInvoked = string.Empty; Dispatcher.BeginInvoke(new Action(delegate { partnerUsernameInvoked = connectedUserComboBox.Text; })); Thread.Sleep(100); clientPrivateData user = ClientAllData.Instance.getMyClient(); CSessionParams sessionPrm = new CSessionParams(); sessionPrm.client1UserName = user.username; sessionPrm.client2UserName = partnerUsernameInvoked; CSessionKeyResponse sessionRespons = kdcProxy.GetSessionKeyForChatConnection(sessionPrm); // blocking if (sessionRespons == null) { //report error return; } Thread.Sleep(200); setChatSessionKeyEvnt?.Invoke(this, sessionRespons); /*byte[] sessionKey = CAes.SimpleDecrypt(sessionRespons.m_sessionKeyA, user.m_kdcAsSessionKey, user.m_kdcAsSessionKey); * byte[] sessionPartnerData = CAes.SimpleDecrypt(sessionRespons.m_sessionKeyB, user.m_kdcAsSessionKey, user.m_kdcAsSessionKey); * session sessionData = ClientAllData.Instance.getSession(partnerUsernameInvoked); * sessionData.setSessionKey(sessionKey, sessionPartnerData); * sessionData.startSending();*/ }