Exemple #1
0
        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);
        }
Exemple #2
0
        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();*/
        }