@@ -38,7 +38,7 @@ internal static void HandleHailRequest(ulong clientId, Stream stream)
38
38
{
39
39
// The certificate is not valid :(
40
40
// Man in the middle.
41
- if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Invalid certificate. Disconnecting" ) ;
41
+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Invalid certificate. Disconnecting" ) ;
42
42
NetworkingManager . Singleton . StopClient ( ) ;
43
43
return ;
44
44
}
@@ -55,22 +55,62 @@ internal static void HandleHailRequest(ulong clientId, Stream stream)
55
55
// Verify the key exchange
56
56
if ( NetworkingManager . Singleton . NetworkConfig . SignKeyExchange )
57
57
{
58
+ int signatureType = reader . ReadByte ( ) ;
59
+
58
60
byte [ ] serverDiffieHellmanPublicPartSignature = reader . ReadByteArray ( ) ;
59
61
60
- RSACryptoServiceProvider rsa = certificate . PublicKey . Key as RSACryptoServiceProvider ;
62
+ if ( signatureType == 0 )
63
+ {
64
+ RSACryptoServiceProvider rsa = certificate . PublicKey . Key as RSACryptoServiceProvider ;
61
65
62
- if ( rsa != null )
66
+ if ( rsa != null )
67
+ {
68
+ using ( SHA256Managed sha = new SHA256Managed ( ) )
69
+ {
70
+ if ( ! rsa . VerifyData ( serverDiffieHellmanPublicPart , sha , serverDiffieHellmanPublicPartSignature ) )
71
+ {
72
+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Invalid RSA signature. Disconnecting" ) ;
73
+ NetworkingManager . Singleton . StopClient ( ) ;
74
+ return ;
75
+ }
76
+ }
77
+ }
78
+ else
79
+ {
80
+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "No RSA key found in certificate. Disconnecting" ) ;
81
+ NetworkingManager . Singleton . StopClient ( ) ;
82
+ return ;
83
+ }
84
+ }
85
+ else if ( signatureType == 1 )
63
86
{
64
- using ( SHA256Managed sha = new SHA256Managed ( ) )
87
+ DSACryptoServiceProvider dsa = certificate . PublicKey . Key as DSACryptoServiceProvider ;
88
+
89
+ if ( dsa != null )
65
90
{
66
- if ( ! rsa . VerifyData ( serverDiffieHellmanPublicPart , sha , serverDiffieHellmanPublicPartSignature ) )
91
+ using ( SHA256Managed sha = new SHA256Managed ( ) )
67
92
{
68
- if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Invalid signature. Disconnecting" ) ;
69
- NetworkingManager . Singleton . StopClient ( ) ;
70
- return ;
71
- }
93
+ if ( ! dsa . VerifyData ( sha . ComputeHash ( serverDiffieHellmanPublicPart ) , serverDiffieHellmanPublicPartSignature ) )
94
+ {
95
+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Invalid DSA signature. Disconnecting" ) ;
96
+ NetworkingManager . Singleton . StopClient ( ) ;
97
+ return ;
98
+ }
99
+ }
100
+ }
101
+ else
102
+ {
103
+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "No DSA key found in certificate. Disconnecting" ) ;
104
+ NetworkingManager . Singleton . StopClient ( ) ;
105
+ return ;
72
106
}
73
107
}
108
+ else
109
+ {
110
+ if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Invalid signature type. Disconnecting" ) ;
111
+ NetworkingManager . Singleton . StopClient ( ) ;
112
+ return ;
113
+ }
74
114
}
75
115
}
76
116
}
@@ -86,24 +126,9 @@ internal static void HandleHailRequest(ulong clientId, Stream stream)
86
126
NetworkingManager . Singleton . clientAesKey = diffieHellman . GetSharedSecret ( serverDiffieHellmanPublicPart ) ;
87
127
byte [ ] diffieHellmanPublicKey = diffieHellman . GetPublicKey ( ) ;
88
128
writer . WriteByteArray ( diffieHellmanPublicKey ) ;
89
- if ( NetworkingManager . Singleton . NetworkConfig . SignKeyExchange )
90
- {
91
- RSACryptoServiceProvider rsa = certificate . PublicKey . Key as RSACryptoServiceProvider ;
92
-
93
- if ( rsa != null )
94
- {
95
- using ( SHA256CryptoServiceProvider sha = new SHA256CryptoServiceProvider ( ) )
96
- {
97
- writer . WriteByteArray ( rsa . Encrypt ( sha . ComputeHash ( diffieHellmanPublicKey ) , false ) ) ;
98
- }
99
- }
100
- else
101
- {
102
- throw new CryptographicException ( "[MLAPI] Only RSA certificates are supported. No valid RSA key was found" ) ;
103
- }
104
- }
105
129
}
106
130
}
131
+
107
132
// Send HailResponse
108
133
InternalMessageSender . Send ( NetworkingManager . Singleton . ServerClientId , MLAPIConstants . MLAPI_CERTIFICATE_HAIL_RESPONSE , "MLAPI_INTERNAL" , outStream , SecuritySendFlags . None , null , true ) ;
109
134
}
@@ -121,33 +146,6 @@ internal static void HandleHailResponse(ulong clientId, Stream stream)
121
146
{
122
147
byte [ ] diffieHellmanPublic = reader . ReadByteArray ( ) ;
123
148
NetworkingManager . Singleton . PendingClients [ clientId ] . AesKey = NetworkingManager . Singleton . PendingClients [ clientId ] . KeyExchange . GetSharedSecret ( diffieHellmanPublic ) ;
124
- if ( NetworkingManager . Singleton . NetworkConfig . SignKeyExchange )
125
- {
126
- byte [ ] diffieHellmanPublicSignature = reader . ReadByteArray ( ) ;
127
- X509Certificate2 certificate = NetworkingManager . Singleton . NetworkConfig . ServerX509Certificate ;
128
- RSACryptoServiceProvider rsa = certificate . PrivateKey as RSACryptoServiceProvider ;
129
-
130
- if ( rsa != null )
131
- {
132
- using ( SHA256Managed sha = new SHA256Managed ( ) )
133
- {
134
- byte [ ] clientHash = rsa . Decrypt ( diffieHellmanPublicSignature , false ) ;
135
- byte [ ] serverHash = sha . ComputeHash ( diffieHellmanPublic ) ;
136
-
137
- if ( ! CryptographyHelper . ConstTimeArrayEqual ( clientHash , serverHash ) )
138
- {
139
- //Man in the middle.
140
- if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) if ( LogHelper . CurrentLogLevel <= LogLevel . Normal ) LogHelper . LogWarning ( "Signature doesnt match for the key exchange public part. Disconnecting" ) ;
141
- NetworkingManager . Singleton . DisconnectClient ( clientId ) ;
142
- return ;
143
- }
144
- }
145
- }
146
- else
147
- {
148
- throw new CryptographicException ( "[MLAPI] Only RSA certificates are supported. No valid RSA key was found" ) ;
149
- }
150
- }
151
149
}
152
150
}
153
151
@@ -161,6 +159,7 @@ internal static void HandleHailResponse(ulong clientId, Stream stream)
161
159
{
162
160
writer . WriteInt64Packed ( DateTime . Now . Ticks ) ; // This serves no purpose.
163
161
}
162
+
164
163
InternalMessageSender . Send ( clientId , MLAPIConstants . MLAPI_GREETINGS , "MLAPI_INTERNAL" , outStream , SecuritySendFlags . None , null , true ) ;
165
164
}
166
165
}
0 commit comments