mirror of
https://github.com/D1GQ/BetterAmongUs.git
synced 2026-10-20 01:46:19 +00:00
Add xml back to HandshakeHandler
This commit is contained in:
1 file changed
+57
-3
@@ -1,4 +1,4 @@
|
|||||||
using BepInEx.Unity.IL2CPP.Utils;
|
using BepInEx.Unity.IL2CPP.Utils;
|
||||||
using BetterAmongUs.Data;
|
using BetterAmongUs.Data;
|
||||||
using BetterAmongUs.Data.Config;
|
using BetterAmongUs.Data.Config;
|
||||||
using BetterAmongUs.Enums;
|
using BetterAmongUs.Enums;
|
||||||
@@ -12,6 +12,9 @@ using UnityEngine;
|
|||||||
|
|
||||||
namespace BetterAmongUs.Modules;
|
namespace BetterAmongUs.Modules;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles the secure handshake process between BetterAmongUs clients using Diffie-Hellman key exchange.
|
||||||
|
/// </summary>
|
||||||
internal sealed class HandshakeHandler
|
internal sealed class HandshakeHandler
|
||||||
{
|
{
|
||||||
[HideFromIl2Cpp]
|
[HideFromIl2Cpp]
|
||||||
@@ -23,11 +26,17 @@ internal sealed class HandshakeHandler
|
|||||||
[HideFromIl2Cpp]
|
[HideFromIl2Cpp]
|
||||||
private ExtendedPlayerInfo extendedData { get; }
|
private ExtendedPlayerInfo extendedData { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Initiates the wait period before sending the secret to another player.
|
||||||
|
/// </summary>
|
||||||
internal void WaitSendSecretToPlayer()
|
internal void WaitSendSecretToPlayer()
|
||||||
{
|
{
|
||||||
extendedData.StartCoroutine(CoWaitSendSecretToPlayer());
|
extendedData.StartCoroutine(CoWaitSendSecretToPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Coroutine that waits for player initialization before sending the secret.
|
||||||
|
/// </summary>
|
||||||
private IEnumerator CoWaitSendSecretToPlayer()
|
private IEnumerator CoWaitSendSecretToPlayer()
|
||||||
{
|
{
|
||||||
if (!BAUConfigs.SendBetterRpc.Value) yield break;
|
if (!BAUConfigs.SendBetterRpc.Value) yield break;
|
||||||
@@ -42,6 +51,9 @@ internal sealed class HandshakeHandler
|
|||||||
SendSecretToPlayer();
|
SendSecretToPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Resends the secret to the player if not already verified.
|
||||||
|
/// </summary>
|
||||||
internal void ResendSecretToPlayer()
|
internal void ResendSecretToPlayer()
|
||||||
{
|
{
|
||||||
if (!BAUConfigs.SendBetterRpc.Value) return;
|
if (!BAUConfigs.SendBetterRpc.Value) return;
|
||||||
@@ -51,6 +63,10 @@ internal sealed class HandshakeHandler
|
|||||||
SendSecretToPlayer();
|
SendSecretToPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sends the local client's public key and temporary key to another player.
|
||||||
|
/// </summary>
|
||||||
|
// Local client sends to client
|
||||||
private void SendSecretToPlayer()
|
private void SendSecretToPlayer()
|
||||||
{
|
{
|
||||||
if (extendedData._Data.Object.IsLocalPlayer()) return;
|
if (extendedData._Data.Object.IsLocalPlayer()) return;
|
||||||
@@ -66,6 +82,11 @@ internal sealed class HandshakeHandler
|
|||||||
}, extendedData._Data.ClientId);
|
}, extendedData._Data.ClientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles receiving a secret from another player and generates a shared secret.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="reader">MessageReader containing the sender's public key and temporary key.</param>
|
||||||
|
// Client receives from local client
|
||||||
internal void HandleSecretFromSender(MessageReader reader)
|
internal void HandleSecretFromSender(MessageReader reader)
|
||||||
{
|
{
|
||||||
if (extendedData._Data?.Object?.IsLocalPlayer() == true) return;
|
if (extendedData._Data?.Object?.IsLocalPlayer() == true) return;
|
||||||
@@ -74,11 +95,17 @@ internal sealed class HandshakeHandler
|
|||||||
byte[] sendersPublicKey = reader.ReadBytes();
|
byte[] sendersPublicKey = reader.ReadBytes();
|
||||||
int tempKey = reader.ReadInt32();
|
int tempKey = reader.ReadInt32();
|
||||||
|
|
||||||
|
// Logger.Log($"Received public key ({sendersPublicKey.Length} bytes) from {_Data.PlayerName}");
|
||||||
|
|
||||||
SharedSecret.UseFallback = !senderSupportsCrypto;
|
SharedSecret.UseFallback = !senderSupportsCrypto;
|
||||||
SharedSecret.SetRemoteTempKey(tempKey);
|
SharedSecret.SetRemoteTempKey(tempKey);
|
||||||
|
|
||||||
byte[] secret = SharedSecret.GenerateSharedSecret(sendersPublicKey);
|
byte[] secret = SharedSecret.GenerateSharedSecret(sendersPublicKey);
|
||||||
if (secret.Length == 0) return;
|
if (secret.Length == 0)
|
||||||
|
{
|
||||||
|
// Logger.Error("Failed to generate shared secret!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
extendedData.IsBetterUser = true;
|
extendedData.IsBetterUser = true;
|
||||||
|
|
||||||
@@ -87,11 +114,18 @@ internal sealed class HandshakeHandler
|
|||||||
ResendSecretToPlayer();
|
ResendSecretToPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sends the hash of the generated shared secret back to the original sender for verification.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="tempKey">The temporary key received from the sender.</param>
|
||||||
|
/// <param name="senderClientId">The client ID of the sender.</param>
|
||||||
|
// Client sends back to local client
|
||||||
private void SendSecretHashToSender(int tempKey, int senderClientId)
|
private void SendSecretHashToSender(int tempKey, int senderClientId)
|
||||||
{
|
{
|
||||||
if (!BAUConfigs.SendBetterRpc.Value) return;
|
if (!BAUConfigs.SendBetterRpc.Value) return;
|
||||||
|
|
||||||
int hash = SharedSecret.GetSharedSecretHash();
|
int hash = SharedSecret.GetSharedSecretHash();
|
||||||
|
// Logger.Log($"Sending secret hash: {hash} (tempKey: {tempKey})");
|
||||||
|
|
||||||
RPC.SendCustomRpcPacked(CustomRPC.CheckSecretHashFromPlayer, writer =>
|
RPC.SendCustomRpcPacked(CustomRPC.CheckSecretHashFromPlayer, writer =>
|
||||||
{
|
{
|
||||||
@@ -100,6 +134,10 @@ internal sealed class HandshakeHandler
|
|||||||
}, senderClientId);
|
}, senderClientId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Handles receiving a secret hash from another player for verification.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="reader">MessageReader containing the temporary key and hash.</param>
|
||||||
internal void HandleSecretHashFromPlayer(MessageReader reader)
|
internal void HandleSecretHashFromPlayer(MessageReader reader)
|
||||||
{
|
{
|
||||||
int tempKey = reader.ReadInt32();
|
int tempKey = reader.ReadInt32();
|
||||||
@@ -109,6 +147,9 @@ internal sealed class HandshakeHandler
|
|||||||
TryHandlePendingVerificationData();
|
TryHandlePendingVerificationData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Attempts to verify pending handshake data if all required information is available.
|
||||||
|
/// </summary>
|
||||||
internal void TryHandlePendingVerificationData()
|
internal void TryHandlePendingVerificationData()
|
||||||
{
|
{
|
||||||
if (!_pendingVerificationData.HasValue) return;
|
if (!_pendingVerificationData.HasValue) return;
|
||||||
@@ -116,14 +157,24 @@ internal sealed class HandshakeHandler
|
|||||||
|
|
||||||
var data = _pendingVerificationData.Value;
|
var data = _pendingVerificationData.Value;
|
||||||
|
|
||||||
|
// Logger.Log($"Received hash check: TempKey={data.tempKey} (ours={SharedSecret.GetTempKey()}), Hash={data.receivedHash} (ours={SharedSecret.GetSharedSecretHash()})");
|
||||||
|
|
||||||
if (data.tempKey != SharedSecret.GetTempKey())
|
if (data.tempKey != SharedSecret.GetTempKey())
|
||||||
|
{
|
||||||
|
// Logger.Warning($"Invalid tempKey from {extendedData._Data?.PlayerName}");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
extendedData.IsBetterUser = true;
|
extendedData.IsBetterUser = true;
|
||||||
|
|
||||||
if (data.receivedHash == SharedSecret.GetSharedSecretHash())
|
if (data.receivedHash == SharedSecret.GetSharedSecretHash())
|
||||||
{
|
{
|
||||||
extendedData.IsVerifiedBetterUser = true;
|
extendedData.IsVerifiedBetterUser = true;
|
||||||
|
// Logger.Log($"Verified player: {extendedData._Data?.PlayerName}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Logger.Warning($"Hash mismatch from {extendedData._Data?.PlayerName}");
|
||||||
}
|
}
|
||||||
|
|
||||||
_pendingVerificationData = null;
|
_pendingVerificationData = null;
|
||||||
@@ -132,5 +183,8 @@ internal sealed class HandshakeHandler
|
|||||||
private (int tempKey, int receivedHash)? _pendingVerificationData = null;
|
private (int tempKey, int receivedHash)? _pendingVerificationData = null;
|
||||||
private bool HasSendSharedSecret { get; set; }
|
private bool HasSendSharedSecret { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets the SharedSecretExchange instance for secure key exchange.
|
||||||
|
/// </summary>
|
||||||
internal SharedSecretExchange SharedSecret { get; set; } = new();
|
internal SharedSecretExchange SharedSecret { get; set; } = new();
|
||||||
}
|
}
|
||||||
Reference in new issue
Block a user