示例#1
0
        public static void UpdateCommonKey(KeyExchangeDto previous = null)
        {
            int myIndex   = CURRENT_CHAT.Members.FindIndex(member => member.Equals(ME));
            int nextIndex = (myIndex + 1) % CURRENT_CHAT.Members.Count;

            if (myIndex == nextIndex)
            {
                throw new ConflictException("sender loop");
            }

            MemberDto nextMember = CURRENT_CHAT.Members[nextIndex];

            KeyExchangeDto dto = dto = new KeyExchangeDto();

            if (previous == null)
            {
                dto.KeyTemp = USER_CHAT_KEYS[CURRENT_CHAT.Name].PublicKey;
            }
            else
            {
                dto.KeyTemp = DIFFIE.GetCommonPrivateKey(
                    previous.KeyTemp,
                    USER_CHAT_KEYS[CURRENT_CHAT.Name].PrivateKey,
                    CURRENT_CHAT.P
                    );
                dto.TTL = previous.TTL + 1;
            }

            MoveCursorToEnd();
            ConsoleWriteLine($"Key exchange with user on port {nextMember.Port}");

            KeyExchangeAction action = new KeyExchangeAction(dto);

            USER_NOTIFIERS[nextMember.Name].Send(action);
        }
示例#2
0
        private static void ServerListener_Recieved(object sender, Listener.RecieveEventArgs e)
        {
            string           json   = Encoding.UTF8.GetString(e.Data);
            SocketActionBase action = JsonConvert.DeserializeObject <SocketActionBase>(json);

            //ConsoleWriteLine($"Recieved {json} via sockets");

            switch (action.Action)
            {
            case SocketActions.JOIN:
                MemberDto member = JsonConvert.DeserializeObject <MemberDto>(JsonConvert.SerializeObject(action.Data));
                ConsoleWriteLine($"{member.Name} joined chat");

                if (!CURRENT_CHAT.Members.Contains(member))
                {
                    CURRENT_CHAT.Members.Add(member);
                }

                if (!member.Equals(ME))
                {
                    ConnectTo(member);
                }

                UpdateCommonKey();
                break;

            case SocketActions.KEY_UPDATE:
                KeyExchangeDto keyExchange = JsonConvert.DeserializeObject <KeyExchangeDto>(JsonConvert.SerializeObject(action.Data));

                if (keyExchange.TTL + 1 == CURRENT_CHAT.Members.Count)
                {
                    CURRENT_CHAT_COMMON_KEY = DIFFIE.GetCommonPrivateKey(
                        keyExchange.KeyTemp,
                        USER_CHAT_KEYS[CURRENT_CHAT.Name].PrivateKey,
                        CURRENT_CHAT.P
                        );

                    ConsoleWriteLine($"Got common key: {CURRENT_CHAT_COMMON_KEY}");
                }
                else
                {
                    UpdateCommonKey(keyExchange);
                }

                break;

            case SocketActions.MESSAGE:
                Message message = JsonConvert.DeserializeObject <Message>(JsonConvert.SerializeObject(action.Data));

                string textCode = NOTEPAD.Decode(message.MessageText, CURRENT_CHAT_COMMON_KEY);
                string text     = NOTEPAD.GetCodeText(textCode);

                ConsoleWriteLine($"{message.SenderName}: {text} ({message.TimeStamp.ToShortTimeString()})");
                break;
            }
        }
示例#3
0
 public KeyExchangeAction(KeyExchangeDto dto)
 {
     Action = SocketActions.KEY_UPDATE;
     Data   = dto;
 }