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); }
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; } }
public KeyExchangeAction(KeyExchangeDto dto) { Action = SocketActions.KEY_UPDATE; Data = dto; }