Skip to content

Commit dd2f48b

Browse files
committed
Finalized MLAPI hail-message exchange
1 parent d95e228 commit dd2f48b

File tree

4 files changed

+53
-34
lines changed

4 files changed

+53
-34
lines changed

MLAPI/Data/MLAPIConstants.cs

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -9,29 +9,30 @@ public static class MLAPIConstants
99
public const string MLAPI_PROTOCOL_VERSION = "2.1.0";
1010

1111

12-
public const byte MLAPI_CERTIFICATE_HAIL = 23;
13-
public const byte MLAPI_CERTIFICATE_HAIL_RESPONSE = 25;
14-
15-
public const byte MLAPI_CONNECTION_REQUEST = 0;
16-
public const byte MLAPI_CONNECTION_APPROVED = 1;
17-
18-
19-
public const byte MLAPI_ADD_OBJECT = 2;
20-
public const byte MLAPI_CLIENT_DISCONNECT = 3;
21-
public const byte MLAPI_DESTROY_OBJECT = 4;
22-
public const byte MLAPI_SWITCH_SCENE = 5;
23-
public const byte MLAPI_SPAWN_POOL_OBJECT = 6;
24-
public const byte MLAPI_DESTROY_POOL_OBJECT = 7;
25-
public const byte MLAPI_CHANGE_OWNER = 8;
26-
public const byte MLAPI_ADD_OBJECTS = 9;
27-
public const byte MLAPI_TIME_SYNC = 10;
28-
public const byte MLAPI_NETWORKED_VAR_DELTA = 11;
29-
public const byte MLAPI_NETWORKED_VAR_UPDATE = 12;
30-
public const byte MLAPI_SERVER_RPC = 13;
31-
public const byte MLAPI_CLIENT_RPC = 14;
32-
public const byte MLAPI_CUSTOM_MESSAGE = 15;
12+
public const byte MLAPI_CERTIFICATE_HAIL = 0;
13+
public const byte MLAPI_CERTIFICATE_HAIL_RESPONSE = 1;
14+
public const byte MLAPI_GREETINGS = 2;
15+
public const byte MLAPI_CONNECTION_REQUEST = 3;
16+
public const byte MLAPI_CONNECTION_APPROVED = 4;
17+
public const byte MLAPI_ADD_OBJECT = 5;
18+
public const byte MLAPI_CLIENT_DISCONNECT = 6;
19+
public const byte MLAPI_DESTROY_OBJECT = 7;
20+
public const byte MLAPI_SWITCH_SCENE = 8;
21+
public const byte MLAPI_SPAWN_POOL_OBJECT = 9;
22+
public const byte MLAPI_DESTROY_POOL_OBJECT = 10;
23+
public const byte MLAPI_CHANGE_OWNER = 11;
24+
public const byte MLAPI_ADD_OBJECTS = 12;
25+
public const byte MLAPI_TIME_SYNC = 13;
26+
public const byte MLAPI_NETWORKED_VAR_DELTA = 14;
27+
public const byte MLAPI_NETWORKED_VAR_UPDATE = 15;
28+
public const byte MLAPI_SERVER_RPC = 16;
29+
public const byte MLAPI_CLIENT_RPC = 17;
30+
public const byte MLAPI_CUSTOM_MESSAGE = 18;
3331

3432
public static readonly string[] MESSAGE_NAMES = {
33+
"MLAPI_CERTIFICATE_HAIL",
34+
"MLAPI_CERTIFICATE_HAIL_RESPONSE",
35+
"MLAPI_GREETINGS",
3536
"MLAPI_CONNECTION_REQUEST",
3637
"MLAPI_CONNECTION_APPROVED",
3738
"MLAPI_ADD_OBJECT",

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,14 @@ private object Init(bool server)
299299
NetworkSceneManager.sceneIndexToString.Clear();
300300
NetworkSceneManager.sceneNameToIndex.Clear();
301301

302-
if (server) NetworkConfig.ServerX509Certificate = new X509Certificate2(NetworkConfig.ServerCertificatePfx);
302+
try
303+
{
304+
if (server && !string.IsNullOrEmpty(NetworkConfig.ServerCertificatePfx)) NetworkConfig.ServerX509Certificate = new X509Certificate2(Convert.FromBase64String(NetworkConfig.ServerCertificatePfx));
305+
}
306+
catch (CryptographicException ex)
307+
{
308+
if (LogHelper.CurrentLogLevel <= LogLevel.Error) LogHelper.LogError("Importing of certificate failed: " + ex.ToString());
309+
}
303310

304311
if (NetworkConfig.Transport == DefaultTransport.UNET)
305312
NetworkConfig.NetworkTransport = new UnetTransport();
@@ -718,13 +725,13 @@ private void Update()
718725
{
719726
connectionPendingClients.Add(clientId);
720727
}
721-
722728
StartCoroutine(ApprovalTimeout(clientId));
723729
}
724730
else
725731
{
726732
if (LogHelper.CurrentLogLevel <= LogLevel.Developer) LogHelper.LogInfo("Connected");
727-
SendConnectionRequest();
733+
if (!NetworkConfig.EnableEncryption) SendConnectionRequest();
734+
StartCoroutine(ApprovalTimeout(clientId));
728735
}
729736
NetworkProfiler.EndEvent();
730737
break;
@@ -839,7 +846,8 @@ private void HandleIncomingData(uint clientId, byte[] data, int channelId, int t
839846
headerReader.SkipPadBits();
840847
headerReader.ReadByteArray(IVBuffer, 16);
841848
rijndael = new RijndaelManaged();
842-
rijndael.Key = isServer ? ConnectedClients[clientId].AesKey : clientAesKey;
849+
rijndael.Padding = PaddingMode.PKCS7;
850+
rijndael.Key = isServer ? (ConnectedClients.ContainsKey(clientId) ? ConnectedClients[clientId].AesKey : pendingClientAesKeys[clientId]) : clientAesKey;
843851
rijndael.IV = IVBuffer;
844852
stream = new CryptoStream(bitStream, rijndael.CreateDecryptor(), CryptoStreamMode.Read);
845853
using (PooledBitReader reader = PooledBitReader.Get(stream))
@@ -940,6 +948,15 @@ private void HandleIncomingData(uint clientId, byte[] data, int channelId, int t
940948
case MLAPIConstants.MLAPI_CUSTOM_MESSAGE:
941949
InternalMessageHandler.HandleCustomMessage(clientId, stream, channelId);
942950
break;
951+
case MLAPIConstants.MLAPI_CERTIFICATE_HAIL:
952+
if (isClient) InternalMessageHandler.HandleHailRequest(clientId, stream, channelId);
953+
break;
954+
case MLAPIConstants.MLAPI_CERTIFICATE_HAIL_RESPONSE:
955+
if (isServer) InternalMessageHandler.HandleHailResponse(clientId, stream, channelId);
956+
break;
957+
case MLAPIConstants.MLAPI_GREETINGS:
958+
if (isClient) InternalMessageHandler.HandleGreetings(clientId, stream, channelId);
959+
break;
943960
}
944961

945962
#endregion
@@ -1095,12 +1112,12 @@ internal void HandleApproval(uint clientId, int prefabId, bool approved, Vector3
10951112

10961113
foreach (KeyValuePair<uint, NetworkedObject> pair in SpawnManager.SpawnedObjects)
10971114
{
1098-
writer.WriteBit(pair.Value.isPlayerObject);
1115+
writer.WriteBool(pair.Value.isPlayerObject);
10991116
writer.WriteUInt32Packed(pair.Value.NetworkId);
11001117
writer.WriteUInt32Packed(pair.Value.OwnerClientId);
11011118
writer.WriteInt32Packed(NetworkConfig.NetworkPrefabIds[pair.Value.NetworkedPrefabName]);
1102-
writer.WriteBit(pair.Value.gameObject.activeInHierarchy);
1103-
writer.WriteBit(pair.Value.sceneObject == null ? true : pair.Value.sceneObject.Value);
1119+
writer.WriteBool(pair.Value.gameObject.activeInHierarchy);
1120+
writer.WriteBool(pair.Value.sceneObject == null ? true : pair.Value.sceneObject.Value);
11041121

11051122
writer.WriteSinglePacked(pair.Value.transform.position.x);
11061123
writer.WriteSinglePacked(pair.Value.transform.position.y);
@@ -1134,11 +1151,11 @@ internal void HandleApproval(uint clientId, int prefabId, bool approved, Vector3
11341151
{
11351152
if (NetworkConfig.HandleObjectSpawning)
11361153
{
1137-
writer.WriteBit(true);
1154+
writer.WriteBool(true);
11381155
writer.WriteUInt32Packed(ConnectedClients[clientId].PlayerObject.GetComponent<NetworkedObject>().NetworkId);
11391156
writer.WriteUInt32Packed(clientId);
11401157
writer.WriteInt32Packed(prefabId);
1141-
writer.WriteBit(false);
1158+
writer.WriteBool(false);
11421159

11431160
writer.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.position.x);
11441161
writer.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.position.y);
@@ -1148,7 +1165,7 @@ internal void HandleApproval(uint clientId, int prefabId, bool approved, Vector3
11481165
writer.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.y);
11491166
writer.WriteSinglePacked(ConnectedClients[clientId].PlayerObject.transform.rotation.eulerAngles.z);
11501167

1151-
writer.WriteBit(false); //No payload data
1168+
writer.WriteBool(false); //No payload data
11521169

11531170
ConnectedClients[clientId].PlayerObject.GetComponent<NetworkedObject>().WriteNetworkedVarData(stream, clientPair.Key);
11541171
}

MLAPI/NetworkingManagerComponents/Core/InternalMessageHandler.Receive.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,7 @@ internal static void HandleHailResponse(uint clientId, Stream stream, int channe
176176
{
177177
writer.WriteInt64Packed(DateTime.Now.Ticks); // This serves no purpose.
178178
}
179-
InternalMessageHandler.Send(clientId, MLAPIConstants.MLAPI_CERTIFICATE_HAIL_RESPONSE, "MLAPI_INTERNAL", outStream, new InternalSecuritySendOptions(false, false), true);
179+
InternalMessageHandler.Send(clientId, MLAPIConstants.MLAPI_GREETINGS, "MLAPI_INTERNAL", outStream, new InternalSecuritySendOptions(false, false), true);
180180
}
181181
}
182182

MLAPI/NetworkingManagerComponents/Core/InternalMessageHandler.Send.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,16 @@ internal static void Send(uint clientId, byte messageType, string channelName, S
1515
{
1616
using (PooledBitWriter writer = PooledBitWriter.Get(stream))
1717
{
18-
writer.WriteBool(securityOptions.encrypted);
19-
writer.WriteBool(securityOptions.authenticated);
18+
writer.WriteBit(securityOptions.encrypted);
19+
writer.WriteBit(securityOptions.authenticated);
2020
if (securityOptions.encrypted && netManager.NetworkConfig.EnableEncryption)
2121
{
2222
writer.WritePadBits();
2323
using (RijndaelManaged rijndael = new RijndaelManaged())
2424
{
2525
rijndael.Key = netManager.isServer ? netManager.ConnectedClients[clientId].AesKey : netManager.clientAesKey;
2626
rijndael.GenerateIV();
27+
rijndael.Padding = PaddingMode.PKCS7;
2728
writer.WriteByteArray(rijndael.IV, 16);
2829
using (CryptoStream cryptoStream = new CryptoStream(stream, rijndael.CreateEncryptor(), CryptoStreamMode.Write))
2930
{

0 commit comments

Comments
 (0)