private void InitAnnounceTimer() { _userIdAnnounceTimer = new Timer(delegate(object state) { BinaryNumber maskedUserId = _maskedUserId; //separate variable to mitigate possible rare race condition if (maskedUserId == null) { maskedUserId = MeshNetwork.GetMaskedUserId(_userId); _maskedUserId = maskedUserId; } _connectionManager.DhtManager.AnnounceAsync(maskedUserId, _allowOnlyLocalInboundInvitations, null); if (!_allowOnlyLocalInboundInvitations) { _connectionManager.TcpRelayClientRegisterHostedNetwork(_maskedUserId); } }, null, Timeout.Infinite, Timeout.Infinite); if (_allowInboundInvitations) { _userIdAnnounceTimer.Change(5000, USER_ID_ANNOUNCE_INTERVAL); } }
public ChatListItem(MeshNetwork network) { InitializeComponent(); _network = network; RefreshTitle(); RefreshIcon(); OnSelected(); labLastMessage.Text = ""; SetLastMessageDate(); ResetUnreadMessageCount(); _network.MessageReceived += network_MessageReceived; _network.PeerTyping += network_PeerTyping; if (_network.Type == MeshNetworkType.Private) { _network.OtherPeer.StateChanged += otherPeer_StateChanged; _network.OtherPeer.ProfileChanged += otherPeer_ProfileChanged; } else { _network.GroupImageChanged += network_GroupImageChanged; } _chatPanel = new MeshNetworkPanel(_network, this); _chatPanel.Dock = DockStyle.Fill; }
private void RaiseEventInvitationReceived(MeshNetwork network) { _syncCxt.Send(delegate(object state) { InvitationReceived?.Invoke(network); }, null); }
public ChatMessageView(MeshNetwork network, ChatListItem chatItem) { InitializeComponent(); _network = network; _chatItem = chatItem; this.Title = _network.NetworkName; _network.MessageReceived += network_MessageReceived; _network.MessageDeliveryNotification += network_MessageDeliveryNotification; _network.PeerTyping += network_PeerTyping; if (_network.Type == MeshNetworkType.Private) { _network.OtherPeer.ProfileChanged += otherPeer_ProfileChanged; } //load stored messages int totalMessageCount = _network.GetMessageCount(); if (totalMessageCount > 0) { try { customListView1.ReplaceItems(ConvertToListViewItems(_network.GetLatestMessages(totalMessageCount, MESSAGE_COUNT_PER_SCROLL), true)); customListView1.ScrollToBottom(); } catch { } } }
public MeshNetworkPanel(MeshNetwork network, ChatListItem chatItem) { InitializeComponent(); _network = network; _network.PeerAdded += network_PeerAdded; //create view _view = new ChatMessageView(_network, chatItem); _view.Dock = DockStyle.Fill; _view.AllowDrop = true; _view.SettingsModified += view_SettingsModified; _view.ForwardTo += view_ForwardTo; _view.DragEnter += lstFiles_DragEnter; _view.DragDrop += lstFiles_DragDrop; //load all peers foreach (MeshNetwork.Peer peer in _network.GetPeers()) { lstUsers.AddItem(new UserListItem(peer)); peer.StateChanged += peer_StateChanged; } //add view to panel meshPanelSplitContainer.Panel1.Controls.Add(_view); }
internal void RemoveMeshNetwork(MeshNetwork network) { lock (_networks) { _networks.Remove(network.NetworkId); } }
internal void MeshNetworkChanged(MeshNetwork network, BinaryNumber newNetworkId) { lock (_networks) { _networks.Add(newNetworkId, network); _networks.Remove(network.NetworkId); } }
public MeshNetwork[] GetNetworks() { lock (_networks) { MeshNetwork[] networks = new MeshNetwork[_networks.Values.Count]; _networks.Values.CopyTo(networks, 0); return(networks); } }
public frmViewGroup(MeshNetwork network) { InitializeComponent(); _network = network; //name string name = _network.NetworkName; //name icon if (name.Length > 0) { labIcon.Text = name.Substring(0, 1).ToUpper(); int x = name.LastIndexOf(" ", StringComparison.CurrentCultureIgnoreCase); if (x > 0) { labIcon.Text += name.Substring(x + 1, 1).ToUpper(); } else if (name.Length > 1) { labIcon.Text += name.Substring(1, 1).ToLower(); } } else { labIcon.Text = ""; } if (_network.Status == MeshNetworkStatus.Online) { labIcon.BackColor = Color.FromArgb(102, 153, 255); } else { labIcon.BackColor = Color.Gray; } labName.Text = name; //image icon if ((_network.GroupDisplayImage != null) && (_network.GroupDisplayImage.Length > 0)) { using (MemoryStream mS = new MemoryStream(_network.GroupDisplayImage)) { _groupImage = Image.FromStream(mS); picIcon.Image = _groupImage; } picIcon.Visible = true; labIcon.Visible = false; } }
private void MeshNode_InvitationReceived(MeshNetwork network) { AddChatView(network); if (lstChats.Controls.Count == 1) { lstChats.SelectItem(lstChats.GetFirstItem()); ShowSelectedChatView(); } SaveProfile(); }
public MeshNetwork CreatePrivateChat(BinaryNumber peerUserId, string peerName, bool localNetworkOnly, string invitationMessage) { //use random userId for each independent chat network for privacy reasons BinaryNumber randomUserId = SecureChannelStream.GenerateUserId(SecureChannelStream.GetPublicKeyFromPrivateKey(_privateKey)); MeshNetwork network = new MeshNetwork(_connectionManager, randomUserId, peerUserId, peerName, localNetworkOnly, invitationMessage); lock (_networks) { _networks.Add(network.NetworkId, network); } return(network); }
private ChatListItem AddChatView(MeshNetwork network) { ChatListItem itm = new ChatListItem(network); itm.ChatPanel.SettingsModified += chatPanel_SettingsModified; itm.ChatPanel.ForwardTo += chatPanel_ForwardTo; network.MessageReceived += network_MessageReceived; mainContainer.Panel2.Controls.Add(itm.ChatPanel); lstChats.AddItem(itm); return(itm); }
internal void MeshNetworkRequest(Connection connection, BinaryNumber networkId, Stream channel) { MeshNetwork network = null; lock (_networks) { if (_networks.ContainsKey(networkId)) { network = _networks[networkId]; } } if (network == null) { if (!networkId.Equals(_maskedUserId)) { //no network found channel.Dispose(); return; } //private network connection invitation attempt if (!_allowInboundInvitations || (_allowOnlyLocalInboundInvitations && ((connection.RemotePeerEP.AddressFamily == AddressFamily.Unspecified) || !NetUtilities.IsPrivateIP((connection.RemotePeerEP as IPEndPoint).Address)))) { //not allowed channel.Dispose(); return; } //accept invitation network = MeshNetwork.AcceptPrivateNetworkInvitation(_connectionManager, connection, channel); //add network lock (_networks) { _networks.Add(network.NetworkId, network); } //notify UI RaiseEventInvitationReceived(network); } else { network.AcceptConnectionAndJoinNetwork(connection, channel); } }
public MeshNode(Stream s, string password, string profileFolder, TorController torController) { _password = password; _profileFolder = profileFolder; switch (s.ReadByte()) //version { case 1: //read headers and init decryptor Aes decryptionAlgo = Aes.Create(); decryptionAlgo.Key = MeshNetwork.GetKdfValue32(Encoding.UTF8.GetBytes(password), s.ReadBytes(32), 1, 1 * 1024 * 1024); //salt decryptionAlgo.IV = s.ReadBytes(16); //IV decryptionAlgo.Padding = PaddingMode.ISO10126; decryptionAlgo.Mode = CipherMode.CBC; byte[] hmac = s.ReadBytes(32); //hmac long cipherTextStartPosition = s.Position; //authenticate data in Encrypt-then-MAC (EtM) mode using (HMAC aeHmac = new HMACSHA256(decryptionAlgo.Key)) { byte[] computedHmac = aeHmac.ComputeHash(s); if (!BinaryNumber.Equals(hmac, computedHmac)) { throw new CryptographicException("Invalid password or data tampered."); } } //decrypt data and init node s.Position = cipherTextStartPosition; CryptoStream cS = new CryptoStream(s, decryptionAlgo.CreateDecryptor(), CryptoStreamMode.Read); InitMeshNode(new BinaryReader(cS), torController); break; case -1: throw new EndOfStreamException(); default: throw new InvalidDataException("MeshNode format version not supported."); } }
public MeshNetwork CreateGroupChat(string networkName, string sharedSecret, bool localNetworkOnly) { //use random userId for each independent chat network for privacy reasons BinaryNumber randomUserId = SecureChannelStream.GenerateUserId(SecureChannelStream.GetPublicKeyFromPrivateKey(_privateKey)); MeshNetwork network = new MeshNetwork(_connectionManager, randomUserId, networkName, sharedSecret, localNetworkOnly); lock (_networks) { if (_networks.ContainsKey(network.NetworkId)) { network.Dispose(); throw new MeshException("Mesh network for group chat '" + network.NetworkName + "' already exists."); } _networks.Add(network.NetworkId, network); } return(network); }
public void SaveTo(Stream s) { //generate salt for KDF byte[] salt = new byte[32]; _rng.GetBytes(salt); //create encryptor Aes encryptionAlgo = Aes.Create(); encryptionAlgo.Key = MeshNetwork.GetKdfValue32(Encoding.UTF8.GetBytes(_password), salt, 1, 1 * 1024 * 1024); encryptionAlgo.GenerateIV(); encryptionAlgo.Padding = PaddingMode.ISO10126; encryptionAlgo.Mode = CipherMode.CBC; //write headers s.WriteByte((byte)1); //version s.Write(salt); //salt s.Write(encryptionAlgo.IV); //IV s.Write(new byte[32]); //placeholder for HMAC long cipherTextStartPosition = s.Position; //write encrypted data { CryptoStream cS = new CryptoStream(s, encryptionAlgo.CreateEncryptor(), CryptoStreamMode.Write); BufferedStream bS = new BufferedStream(cS); WriteTo(new BinaryWriter(bS)); bS.Flush(); cS.FlushFinalBlock(); } //write hmac for authenticated encryption Encrypt-then-MAC (EtM) mode using (HMAC aeHmac = new HMACSHA256(encryptionAlgo.Key)) { s.Position = cipherTextStartPosition; byte[] hmac = aeHmac.ComputeHash(s); //write hmac s.Position = cipherTextStartPosition - 32; s.Write(hmac); } }
public void Start() { DontDestroyOnLoad(gameObject); meshnet = gameObject.GetComponent <MeshNetwork>(); GameObject[] prefabs = Resources.LoadAll <GameObject>("NetworkPrefabs"); foreach (GameObject prefab in prefabs) { if (prefab.GetComponent <IdentityContainer>() == null) { Debug.LogError("A NetworkPrefab is missing an IdentityContainer."); } else { string prefabID = prefab.name.Substring(prefab.name.LastIndexOf('_') + 1); networkPrefabs.Add(ushort.Parse(prefabID), prefab); } } Debug.Log("GameCoordinator tried to register " + prefabs.Length + " network prefabs, succeeded with " + networkPrefabs.Count + "."); }
internal void ReceivedMeshNetworkPeersViaTcpRelay(Connection viaConnection, BinaryNumber channelId, List <EndPoint> peerEPs) { MeshNetwork foundNetwork = null; lock (_networks) { foreach (KeyValuePair <BinaryNumber, MeshNetwork> network in _networks) { if (network.Key.Equals(channelId) || ((network.Value.Type == MeshNetworkType.Private) && network.Value.OtherPeer.MaskedPeerUserId.Equals(channelId))) { foundNetwork = network.Value; break; } } } if (foundNetwork != null) { foundNetwork.TcpRelayClientReceivedPeers(viaConnection, peerEPs); } }
private void mnuAddGroupChat_Click(object sender, EventArgs e) { using (frmAddGroupChat frm = new frmAddGroupChat()) { if (frm.ShowDialog(this) == DialogResult.OK) { try { MeshNetwork network = _node.CreateGroupChat(frm.NetworkName, frm.SharedSecret, frm.LocalNetworkOnly); lstChats.SelectItem(AddChatView(network)); ShowSelectedChatView(); SaveProfile(); } catch (Exception ex) { MessageBox.Show(ex.Message, "Error!", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } } } }
public void SetMeshnetReference(MeshNetwork net) { meshnetReference = net; }
private void InitMeshNode(BinaryReader bR, TorController torController) { switch (bR.ReadByte()) //version { case 1: _type = (MeshNodeType)bR.ReadByte(); _privateKey = bR.ReadBuffer(); _supportedCiphers = (SecureChannelCipherSuite)bR.ReadByte(); // _userId = new BinaryNumber(bR.BaseStream); // _localServicePort = bR.ReadUInt16(); _downloadFolder = bR.ReadShortString(); // _profileDateModified = bR.ReadDate(); _profileDisplayName = bR.ReadShortString(); _profileStatus = (MeshProfileStatus)bR.ReadByte(); _profileStatusMessage = bR.ReadShortString(); // _profileImageDateModified = bR.ReadDate(); _profileDisplayImage = bR.ReadBuffer(); // _ipv4BootstrapDhtNodes = new EndPoint[bR.ReadInt32()]; for (int i = 0; i < _ipv4BootstrapDhtNodes.Length; i++) { _ipv4BootstrapDhtNodes[i] = EndPointExtension.Parse(bR); } _ipv6BootstrapDhtNodes = new EndPoint[bR.ReadInt32()]; for (int i = 0; i < _ipv6BootstrapDhtNodes.Length; i++) { _ipv6BootstrapDhtNodes[i] = EndPointExtension.Parse(bR); } _torBootstrapDhtNodes = new EndPoint[bR.ReadInt32()]; for (int i = 0; i < _torBootstrapDhtNodes.Length; i++) { _torBootstrapDhtNodes[i] = EndPointExtension.Parse(bR); } // _enableUPnP = bR.ReadBoolean(); _allowInboundInvitations = bR.ReadBoolean(); _allowOnlyLocalInboundInvitations = bR.ReadBoolean(); // if (bR.ReadBoolean()) { _proxy = new NetProxy((NetProxyType)bR.ReadByte(), bR.ReadShortString(), bR.ReadUInt16(), (bR.ReadBoolean() ? new NetworkCredential(bR.ReadShortString(), bR.ReadShortString()) : null)); } // _appData = bR.ReadBuffer(); //start connection manager _connectionManager = new ConnectionManager(this, torController); // int networkCount = bR.ReadInt32(); for (int i = 0; i < networkCount; i++) { MeshNetwork network = new MeshNetwork(_connectionManager, bR); _networks.Add(network.NetworkId, network); } InitAnnounceTimer(); break; default: throw new InvalidDataException("MeshNode format version not supported."); } }
public frmChatProperties(MeshNetwork network) { InitializeComponent(); _network = network; this.Text = _network.NetworkName + " - Properties"; chkLocalNetworkOnly.Checked = _network.LocalNetworkOnly; txtNetworkId.Text = _network.NetworkId.ToString(); txtPassword.Text = _network.SharedSecret; if (_network.Type == MeshNetworkType.Private) { labNetworkName.Text = "Peer's User Id"; txtNetworkName.Text = _network.OtherPeer.PeerUserId.ToString(); } else { labNetworkName.Text = "Group Name"; txtNetworkName.Text = _network.NetworkName; } { ListViewItem dhtItem = lstPeerInfo.Items.Add("IPv4 DHT"); dhtItem.SubItems.Add(""); dhtItem.SubItems.Add(""); } { ListViewItem dhtItem = lstPeerInfo.Items.Add("IPv6 DHT"); dhtItem.SubItems.Add(""); dhtItem.SubItems.Add(""); } { ListViewItem dhtItem = lstPeerInfo.Items.Add("LAN DHT"); dhtItem.SubItems.Add(""); dhtItem.SubItems.Add(""); } { ListViewItem dhtItem = lstPeerInfo.Items.Add("Tor DHT"); dhtItem.SubItems.Add(""); dhtItem.SubItems.Add(""); } { ListViewItem dhtItem = lstPeerInfo.Items.Add("IPv4 Tcp Relay"); dhtItem.SubItems.Add(""); dhtItem.SubItems.Add(""); } { ListViewItem dhtItem = lstPeerInfo.Items.Add("IPv6 Tcp Relay"); dhtItem.SubItems.Add(""); dhtItem.SubItems.Add(""); } _timer = new Timer(); _timer.Interval = 1000; _timer.Tick += timer_Tick; _timer.Start(); }