Skip to content

Commit ec0ba47

Browse files
committed
Added RSA signing to Diffie Hellman
1 parent a9d5e6e commit ec0ba47

File tree

2 files changed

+50
-10
lines changed

2 files changed

+50
-10
lines changed

MLAPI/Data/NetworkingConfiguration.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ public class NetworkingConfiguration
3131
public bool HandleObjectSpawning = true;
3232

3333
public bool EnableEncryption = true;
34+
public bool SignKeyExchange = true;
35+
public string RSAPrivateKey = "<RSAKeyValue><Modulus>vBEvOQki/EftWOgwh4G8/nFRvcDJLylc8P7Dhz5m/hpkkNtAMzizNKYUrGbs7sYWlEuMYBOWrzkIDGOMoOsYc9uCi+8EcmNoHDlIhK5yNfZUexYBF551VbvZ625LSBR7kmBxkyo4IPuA09fYCHeUFm3prt4h6aTD0Hjc7ZsJHUU=</Modulus><Exponent>EQ==</Exponent><P>ydgcrq5qLJOdDQibD3m9+o3/dkKoFeCC110dnMgdpEteCruyBdL0zjGKKvjjgy3XTSSp43EN591NiXaBp0JtDw==</P><Q>7obHrUnUCsSHUsIJ7+JOrupcGrQ0XaYcQ+Uwb2v7d2YUzwZ46U4gI9snfD2J0tc3DGEh3v3G0Q8q7bxEe3H4aw==</Q><DP>L34k3c6vkgSdbHp+1nb/hj+HZx6+I0PijQbZyolwYuSOmR0a1DGjA1bzVWe9D86NAxevgM9OkOjG8yrxVIgZqQ==</DP><DQ>OB+2gyBuIKa2bdNNodrlVlVC2RtXnZB/HwjAGjeGdnJfP8VJoE6eJo3rLEq3BG7fxq1xYaUfuLhGVg4uOyngGQ==</DQ><InverseQ>o97PimYu58qH5eFmySRCIsyhBr/tK2GM17Zd9QQPJZRSorrhIJn1m6gwQ/G5aJLIM/3Yl04CoyqmQGsPXMzW2w==</InverseQ><D>CxAR1i22w4vCquB7U0Pd8Nl9R2Wxez6rHTwpnoszPB+rkAzlqKj7e5FMgpykhoQfciKPyWqQZKkAeTMIRbN56JinvpAt5POId/28HDd5xjGymHE81k3RzoHqzQXFIOF1TSYKUWzjPPF/TU4nn7auD4i6lOODATsMqtLr5DRBN/0=</D></RSAKeyValue>"; //CHANGE THESE FOR PRODUCTION!
36+
public string RSAPublicKey = "<RSAKeyValue><Modulus>vBEvOQki/EftWOgwh4G8/nFRvcDJLylc8P7Dhz5m/hpkkNtAMzizNKYUrGbs7sYWlEuMYBOWrzkIDGOMoOsYc9uCi+8EcmNoHDlIhK5yNfZUexYBF551VbvZ625LSBR7kmBxkyo4IPuA09fYCHeUFm3prt4h6aTD0Hjc7ZsJHUU=</Modulus><Exponent>EQ==</Exponent></RSAKeyValue>"; //CHANGE THESE FOR PRODUCTION!
37+
3438
public bool AllowPassthroughMessages = true;
3539
public bool EnableSceneSwitching = false;
3640

MLAPI/MonoBehaviours/Core/NetworkingManager.cs

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
using UnityEngine;
88
using UnityEngine.Networking;
99
using System.Linq;
10+
using System.Security.Cryptography;
1011

1112
namespace MLAPI
1213
{
@@ -588,10 +589,6 @@ private void HandleIncomingData(int clientId, byte[] data, int channelId)
588589
ushort diffiePublicSize = messageReader.ReadUInt16();
589590
byte[] diffiePublic = messageReader.ReadBytes(diffiePublicSize);
590591
diffieHellmanPublicKeys.Add(clientId, diffiePublic);
591-
/*
592-
EllipticDiffieHellman diffieHellman = new EllipticDiffieHellman(EllipticDiffieHellman.DEFAULT_CURVE, EllipticDiffieHellman.DEFAULT_GENERATOR, EllipticDiffieHellman.DEFAULT_ORDER);
593-
aesKey = diffieHellman.GetSharedSecret(diffiePublic);
594-
*/
595592

596593
}
597594
if (NetworkConfig.ConnectionApproval)
@@ -625,7 +622,25 @@ private void HandleIncomingData(int clientId, byte[] data, int channelId)
625622
if (NetworkConfig.EnableEncryption)
626623
{
627624
ushort keyLength = messageReader.ReadUInt16();
628-
clientAesKey = clientDiffieHellman.GetSharedSecret(messageReader.ReadBytes(keyLength));
625+
byte[] serverPublicKey = messageReader.ReadBytes(keyLength);
626+
clientAesKey = clientDiffieHellman.GetSharedSecret(serverPublicKey);
627+
if (NetworkConfig.SignKeyExchange)
628+
{
629+
ushort signatureLength = messageReader.ReadUInt16();
630+
byte[] publicKeySignature = messageReader.ReadBytes(signatureLength);
631+
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
632+
{
633+
rsa.PersistKeyInCsp = false;
634+
rsa.FromXmlString(NetworkConfig.RSAPublicKey);
635+
if(!rsa.VerifyData(serverPublicKey, new SHA512CryptoServiceProvider(), publicKeySignature))
636+
{
637+
//Man in the middle.
638+
Debug.LogWarning("MLAPI: Signature doesnt match for the key exchange public part. Disconnecting");
639+
StopClient();
640+
return;
641+
}
642+
}
643+
}
629644
}
630645

631646
float netTime = messageReader.ReadSingle();
@@ -1292,6 +1307,7 @@ private void HandleApproval(int clientId, bool approved)
12921307

12931308
byte[] aesKey = new byte[0];
12941309
byte[] publicKey = new byte[0];
1310+
byte[] publicKeySignature = new byte[0];
12951311
if (NetworkConfig.EnableEncryption)
12961312
{
12971313
EllipticDiffieHellman diffieHellman = new EllipticDiffieHellman(EllipticDiffieHellman.DEFAULT_CURVE, EllipticDiffieHellman.DEFAULT_GENERATOR, EllipticDiffieHellman.DEFAULT_ORDER);
@@ -1300,6 +1316,16 @@ private void HandleApproval(int clientId, bool approved)
13001316

13011317
if (diffieHellmanPublicKeys.ContainsKey(clientId))
13021318
diffieHellmanPublicKeys.Remove(clientId);
1319+
1320+
if (NetworkConfig.SignKeyExchange)
1321+
{
1322+
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
1323+
{
1324+
rsa.PersistKeyInCsp = false;
1325+
rsa.FromXmlString(NetworkConfig.RSAPrivateKey);
1326+
publicKeySignature = rsa.SignData(publicKeySignature, new SHA512CryptoServiceProvider());
1327+
}
1328+
}
13031329
}
13041330

13051331
NetworkedClient client = new NetworkedClient()
@@ -1315,21 +1341,26 @@ private void HandleApproval(int clientId, bool approved)
13151341
GameObject go = SpawnManager.SpawnPlayerObject(clientId, networkId);
13161342
connectedClients[clientId].PlayerObject = go;
13171343
}
1318-
13191344
int sizeOfStream = 16 + ((connectedClients.Count - 1) * 4);
13201345

13211346
int amountOfObjectsToSend = SpawnManager.spawnedObjects.Values.Count(x => x.ServerOnly == false);
13221347

1323-
if(NetworkConfig.HandleObjectSpawning)
1348+
if (NetworkConfig.HandleObjectSpawning)
13241349
{
13251350
sizeOfStream += 4;
13261351
sizeOfStream += 14 * amountOfObjectsToSend;
13271352
}
1328-
if(NetworkConfig.EnableEncryption)
1353+
1354+
if (NetworkConfig.EnableEncryption)
13291355
{
13301356
sizeOfStream += 2 + publicKey.Length;
1357+
if (NetworkConfig.SignKeyExchange)
1358+
{
1359+
sizeOfStream += 2 + publicKeySignature.Length;
1360+
}
13311361
}
1332-
if(NetworkConfig.EnableSceneSwitching)
1362+
1363+
if (NetworkConfig.EnableSceneSwitching)
13331364
{
13341365
sizeOfStream += 4;
13351366
}
@@ -1344,10 +1375,15 @@ private void HandleApproval(int clientId, bool approved)
13441375
writer.Write(NetworkSceneManager.CurrentSceneIndex);
13451376
}
13461377

1347-
if(NetworkConfig.EnableEncryption)
1378+
if (NetworkConfig.EnableEncryption)
13481379
{
13491380
writer.Write((ushort)publicKey.Length);
13501381
writer.Write(publicKey);
1382+
if (NetworkConfig.SignKeyExchange)
1383+
{
1384+
writer.Write((ushort)publicKeySignature.Length);
1385+
writer.Write(publicKeySignature);
1386+
}
13511387
}
13521388

13531389
writer.Write(NetworkTime);

0 commit comments

Comments
 (0)