From b7f44b52156cc3e908dc5beaad1aba4c161ecc97 Mon Sep 17 00:00:00 2001 From: Thomas Woischnig Date: Mon, 4 Dec 2023 21:48:36 +0100 Subject: [PATCH] Reduced iteration count on encryption Moved long running code to task --- .../Runtime/LobbyClient.dll | Bin 36864 -> 36864 bytes LobbyClient/LobbyClient.cs | 93 +++++++++--------- LobbyClient/PasswordHash.cs | 2 +- 3 files changed, 49 insertions(+), 46 deletions(-) diff --git a/Assets/NetworkLobbyClient/Runtime/LobbyClient.dll b/Assets/NetworkLobbyClient/Runtime/LobbyClient.dll index 0e02e81b185ec73f59744916c823914e10b2c10e..9e0bbe60793e1de7e895a3588b122115fc644ea0 100644 GIT binary patch literal 36864 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 literal 36864 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 diff --git a/LobbyClient/LobbyClient.cs b/LobbyClient/LobbyClient.cs index b172cff..83ec8a3 100644 --- a/LobbyClient/LobbyClient.cs +++ b/LobbyClient/LobbyClient.cs @@ -78,49 +78,52 @@ namespace Lobbies public void HostLobby(Guid gameId, string name, int gameMode, int maxPlayerCount, string? password, int port) { - udpEchoServer.Start(0); + udpEchoServer.Start(0); + _ = Task.Run(async () => { + byte[]? hash = null, salt = null; - byte[]? hash = null, salt = null; + if (!string.IsNullOrEmpty(password)) + { + (hash, salt) = PasswordHash.Hash(password); + } - if(!string.IsNullOrEmpty(password)) - { - (hash, salt) = PasswordHash.Hash(password); - } + var lobbyCreate = new LobbyCreate() + { + GameId = gameId, + Name = name, + GameMode = gameMode, + MaxPlayerCount = maxPlayerCount, + PlayerCount = 0, + PasswordHash = hash, + PasswordSalt = salt, + HostIps = GatherLocalIpAddresses().ToArray(), + HostPort = port, + HostTryPort = udpEchoServer.Port + }; - var lobbyCreate = new LobbyCreate() - { - GameId = gameId, - Name = name, - GameMode = gameMode, - MaxPlayerCount = maxPlayerCount, - PlayerCount = 0, - PasswordHash = hash, - PasswordSalt = salt, - HostIps = GatherLocalIpAddresses().ToArray(), - HostPort = port, - HostTryPort = udpEchoServer.Port - }; - - byte[] messageData = bufferRental.Rent(); - var len = lobbyCreate.Serialize(messageData); - _ = Task.Run(async () => { await tcpClient.Send(messageData, 0, len); bufferRental.Return(messageData); }); + byte[] messageData = bufferRental.Rent(); + var len = lobbyCreate.Serialize(messageData); + await tcpClient.Send(messageData, 0, len); bufferRental.Return(messageData); + }); } public void RequestLobbyHostInfo(Guid lobbyId, string? password) - { - byte[]? passwordHash = null; - if(!string.IsNullOrEmpty(password) && lobbyInformation.ContainsKey(lobbyId) && lobbyInformation[lobbyId].PasswordSalt != null) - passwordHash = PasswordHash.Hash(password, lobbyInformation[lobbyId].PasswordSalt!); + { + _ = Task.Run(async () => { + byte[]? passwordHash = null; + if (!string.IsNullOrEmpty(password) && lobbyInformation.ContainsKey(lobbyId) && lobbyInformation[lobbyId].PasswordSalt != null) + passwordHash = PasswordHash.Hash(password, lobbyInformation[lobbyId].PasswordSalt!); - var lobbyCreate = new LobbyRequestHostInfo() - { - LobbyId = lobbyId, - PasswordHash = passwordHash, - }; + var lobbyCreate = new LobbyRequestHostInfo() + { + LobbyId = lobbyId, + PasswordHash = passwordHash, + }; - byte[] messageData = bufferRental.Rent(); - var len = lobbyCreate.Serialize(messageData); - _ = Task.Run(async () => { await tcpClient.Send(messageData, 0, len); bufferRental.Return(messageData); }); + byte[] messageData = bufferRental.Rent(); + var len = lobbyCreate.Serialize(messageData); + await tcpClient.Send(messageData, 0, len); bufferRental.Return(messageData); + }); } /// @@ -142,13 +145,13 @@ namespace Lobbies /// Optional password of lobby /// A callback to send udp data if you have a udp game client ready and bound public void RequestLobbyNatPunch(Guid lobbyId, string? password, SendUdpMessageCallback sendUdpToGetExternalPortMappingCallback) - { - byte[]? passwordHash = null; - if (!string.IsNullOrEmpty(password) && lobbyInformation.ContainsKey(lobbyId) && lobbyInformation[lobbyId].PasswordSalt != null) - passwordHash = PasswordHash.Hash(password, lobbyInformation[lobbyId].PasswordSalt!); - + { Task.Run(() => { + byte[]? passwordHash = null; + if (!string.IsNullOrEmpty(password) && lobbyInformation.ContainsKey(lobbyId) && lobbyInformation[lobbyId].PasswordSalt != null) + passwordHash = PasswordHash.Hash(password, lobbyInformation[lobbyId].PasswordSalt!); + QueryExternalIpAndPort(sendUdpToGetExternalPortMappingCallback); var lobbyRequestNatPunch = new LobbyRequestNatPunch() { @@ -179,15 +182,15 @@ namespace Lobbies if(port < 0 && port > 65535) throw new ArgumentOutOfRangeException(nameof(port)); - byte[]? passwordHash = null; - if (!string.IsNullOrEmpty(password) && lobbyInformation.ContainsKey(lobbyId) && lobbyInformation[lobbyId].PasswordSalt != null) - passwordHash = PasswordHash.Hash(password, lobbyInformation[lobbyId].PasswordSalt!); - var udpEchoServer = new UdpEchoServer(); udpEchoServer.Start(port); Task.Run(() => - { + { + byte[]? passwordHash = null; + if (!string.IsNullOrEmpty(password) && lobbyInformation.ContainsKey(lobbyId) && lobbyInformation[lobbyId].PasswordSalt != null) + passwordHash = PasswordHash.Hash(password, lobbyInformation[lobbyId].PasswordSalt!); + QueryExternalIpAndPort(udpEchoServer.Send); udpEchoServer.Dispose(); var lobbyRequestNatPunch = new LobbyRequestNatPunch() diff --git a/LobbyClient/PasswordHash.cs b/LobbyClient/PasswordHash.cs index 675bc5d..c0dc5ac 100644 --- a/LobbyClient/PasswordHash.cs +++ b/LobbyClient/PasswordHash.cs @@ -7,7 +7,7 @@ namespace Lobbies { const int keySize = 64; const int saltSize = 16; - const int iterations = 350000; + const int iterations = 100000; static HashAlgorithmName hashAlgorithm = HashAlgorithmName.SHA512; static internal (byte[] hash, byte[] salt) Hash(string text)