This repository was archived by the owner on May 7, 2022. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathKeyAuth.vb
396 lines (332 loc) · 18.5 KB
/
KeyAuth.vb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
Imports System
Imports System.Security.Cryptography
Imports System.Security.Cryptography.X509Certificates
Imports System.Collections.Specialized
Imports System.Text
Imports System.Net
Imports System.IO
Imports System.Net.Security
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Json
Imports System.Security.Principal
Imports Dynamitey
Namespace KeyAuth
Public Class api
Public name, ownerid, secret, version As String
Public Sub New(ByVal name As String, ByVal ownerid As String, ByVal secret As String, ByVal version As String)
If String.IsNullOrWhiteSpace(name) OrElse String.IsNullOrWhiteSpace(ownerid) OrElse String.IsNullOrWhiteSpace(secret) OrElse String.IsNullOrWhiteSpace(version) Then
MessageBox.Show("Application not setup correctly. Please watch video link found in Login.cs")
Environment.Exit(0)
End If
Me.name = name
Me.ownerid = ownerid
Me.secret = secret
Me.version = version
End Sub
Public sessionid, enckey As String
#Region "structures"
<DataContract>
Private Class response_structure
<DataMember>
Public Property success As Boolean
<DataMember>
Public Property response As String
<DataMember>
Public Property message As String
<DataMember>
Public Property download As String
<DataMember>
Public Property sessionid As String
<DataMember(IsRequired:=False, EmitDefaultValue:=False)>
Public Property info As user_data_structure
End Class
<DataContract>
Private Class user_data_structure
<DataMember>
Public Property key As String
<DataMember>
Public Property expiry As String 'timestamp
<DataMember>
Public Property level As Integer
End Class
#End Region
Public Sub init()
enckey = sha256(iv_key())
Dim init_iv = sha256(iv_key())
Dim values_to_upload = New NameValueCollection From {
{"type", byte_arr_to_str(Encoding.Default.GetBytes("init"))},
{"ver", encrypt(version, secret, init_iv)},
{"hash", checksum(Process.GetCurrentProcess().MainModule.FileName)},
{"enckey", encrypt(enckey, secret, init_iv)},
{"name", byte_arr_to_str(Encoding.Default.GetBytes(name))},
{"ownerid", byte_arr_to_str(Encoding.Default.GetBytes(ownerid))},
{"init_iv", init_iv}
}
Dim response = req(values_to_upload)
response = decrypt(response, secret, init_iv)
Dim json = response_decoder.string_to_generic(Of response_structure)(response)
If json.message = "invalidver" Then
Process.Start(json.download)
Environment.Exit(0)
ElseIf Not json.success Then
MessageBox.Show(json.message)
Environment.Exit(0)
Else
sessionid = json.sessionid
End If
End Sub
Public Function login(ByVal username As String, ByVal pass As String) As Boolean
Dim hwid = WindowsIdentity.GetCurrent().User.Value
Dim init_iv = sha256(iv_key()) ' can be changed to whatever you want
Dim values_to_upload = New NameValueCollection From {
{"type", byte_arr_to_str(Encoding.Default.GetBytes("login"))},
{"username", encrypt(username, enckey, init_iv)},
{"pass", encrypt(pass, enckey, init_iv)},
{"hwid", encrypt(hwid, enckey, init_iv)},
{"sessionid", byte_arr_to_str(Encoding.Default.GetBytes(sessionid))},
{"name", byte_arr_to_str(Encoding.Default.GetBytes(name))},
{"ownerid", byte_arr_to_str(Encoding.Default.GetBytes(ownerid))},
{"init_iv", init_iv}
}
Dim response = req(values_to_upload)
response = decrypt(response, enckey, init_iv)
Dim json = response_decoder.string_to_generic(Of response_structure)(response)
If Not json.success Then
MessageBox.Show(json.message)
Return False
Else
load_user_data(json.info)
Return True
End If
End Function
Public Function register(ByVal username As String, ByVal pass As String, ByVal key As String) As Boolean
Dim hwid = WindowsIdentity.GetCurrent().User.Value
Dim init_iv = sha256(iv_key()) ' can be changed to whatever you want
Dim values_to_upload = New NameValueCollection From {
{"type", byte_arr_to_str(Encoding.Default.GetBytes("register"))},
{"username", encrypt(username, enckey, init_iv)},
{"pass", encrypt(pass, enckey, init_iv)},
{"key", encrypt(key, enckey, init_iv)},
{"hwid", encrypt(hwid, enckey, init_iv)},
{"sessionid", byte_arr_to_str(Encoding.Default.GetBytes(sessionid))},
{"name", byte_arr_to_str(Encoding.Default.GetBytes(name))},
{"ownerid", byte_arr_to_str(Encoding.Default.GetBytes(ownerid))},
{"init_iv", init_iv}
}
Dim response = req(values_to_upload)
response = decrypt(response, enckey, init_iv)
Dim json = response_decoder.string_to_generic(Of response_structure)(response)
If Not json.success Then
MessageBox.Show(json.message)
Return False
Else
load_user_data(json.info)
Return True
End If
End Function
Public Sub upgrade(ByVal username As String, ByVal key As String)
Dim hwid = WindowsIdentity.GetCurrent().User.Value
Dim init_iv = sha256(iv_key()) ' can be changed to whatever you want
Dim values_to_upload = New NameValueCollection From {
{"type", byte_arr_to_str(Encoding.Default.GetBytes("upgrade"))},
{"username", encrypt(username, enckey, init_iv)},
{"key", encrypt(key, enckey, init_iv)},
{"sessionid", byte_arr_to_str(Encoding.Default.GetBytes(sessionid))},
{"name", byte_arr_to_str(Encoding.Default.GetBytes(name))},
{"ownerid", byte_arr_to_str(Encoding.Default.GetBytes(ownerid))},
{"init_iv", init_iv}
}
Dim response = req(values_to_upload)
response = decrypt(response, enckey, init_iv)
Dim json = response_decoder.string_to_generic(Of response_structure)(response)
If Not json.success Then
MessageBox.Show(json.message)
Else
MessageBox.Show(json.message)
End If
End Sub
Public Function license(ByVal key As String) As Boolean
Dim hwid = WindowsIdentity.GetCurrent().User.Value
Dim init_iv = sha256(iv_key()) ' can be changed to whatever you want
Dim values_to_upload = New NameValueCollection From {
{"type", byte_arr_to_str(Encoding.Default.GetBytes("license"))},
{"key", encrypt(key, enckey, init_iv)},
{"hwid", encrypt(hwid, enckey, init_iv)},
{"sessionid", byte_arr_to_str(Encoding.Default.GetBytes(sessionid))},
{"name", byte_arr_to_str(Encoding.Default.GetBytes(name))},
{"ownerid", byte_arr_to_str(Encoding.Default.GetBytes(ownerid))},
{"init_iv", init_iv}
}
Dim response = req(values_to_upload)
response = decrypt(response, enckey, init_iv)
Dim json = response_decoder.string_to_generic(Of response_structure)(response)
If Not json.success Then
MessageBox.Show(json.message)
Return False
Else
load_user_data(json.info)
Return True
End If
End Function
Public Shared Function checksum(ByVal filename As String) As String
Dim result As String
Using md As MD5 = MD5.Create()
Using fileStream As FileStream = File.OpenRead(filename)
Dim value As Byte() = md.ComputeHash(fileStream)
result = BitConverter.ToString(value).Replace("-", "").ToLowerInvariant()
End Using
End Using
Return result
End Function
Private Shared Function req(ByVal post_data As NameValueCollection) As String
Try
Using client As WebClient = New WebClient()
client.Headers("User-Agent") = "KeyAuth"
' ServicePointManager.ServerCertificateValidationCallback = AddressOf others.pin_public_key
Dim raw_response = client.UploadValues("https://keyauth.win/api/1.0/", post_data)
' ServicePointManager.ServerCertificateValidationCallback = Function(send, certificate, chain, sslPolicyErrors) True
Return Encoding.Default.GetString(raw_response)
End Using
Catch
MessageBox.Show("Connection error")
Environment.Exit(0)
Return ""
End Try
End Function
#Region "user_data"
Public user_data As user_data_class = New user_data_class()
Public Class user_data_class
Public Property key As String
Public Property expiry As Date
Public Property level As Integer
End Class
Private Sub load_user_data(ByVal data As user_data_structure)
user_data.key = data.key
user_data.expiry = others.unix_to_date(Convert.ToDouble(data.expiry))
user_data.level = data.level
End Sub
#End Region
Private response_decoder As json_wrapper = New json_wrapper(New response_structure())
End Class
Public Module others
Public Function unix_to_date(ByVal unixTimeStamp As Double) As Date
Return New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(unixTimeStamp).ToLocalTime()
End Function
Public Function pin_public_key(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
Return Equals(certificate.GetPublicKeyString(), "3082010A028201010082BD4F6711C71AB8716DC67EB8C48B0535E910D49D6F5F125D37A68AE0907FA108FF4F975B9CB58036539C3BBD177912DCE101D871D60DD3A5B84176E89B45F991FE7952FA6DC39C8F0C38798F9312AC523093D1F93EFE16DC7212184AC516E983DCD998DAA543211206171C28795A85A079809F364CC991518B7A31F71B166B6763989D9B6A317B6E3C3F3D01BD516EF76B5FEA5978EFC422C9B870867800C16F204137C8A0A811D058CC657E37EA6DD84E68A9F73E2D52D08EFE4E743A85C27ACFAB2EBBD68797529B17B74C9033D019E1383E3CD34D1088342A67148295704A7192502A5299503510B6F07978D1D42A884DE2F830A6FC393136E9F0C245D50203010001")
End Function
End Module
Public Module encryption
Public Function byte_arr_to_str(ByVal ba As Byte()) As String
Dim hex As StringBuilder = New StringBuilder(ba.Length * 2)
For Each b As Byte In ba
hex.AppendFormat("{0:x2}", b)
Next
Return hex.ToString()
End Function
Public Function str_to_byte_arr(ByVal hex As String) As Byte()
Dim NumberChars As Integer = hex.Length
Dim bytes As Byte() = New Byte(NumberChars / 2 - 1) {}
For i As Integer = 0 To NumberChars - 1 Step 2
bytes(i / 2) = Convert.ToByte(hex.Substring(i, 2), 16)
Next
Return bytes
End Function
Public Function encrypt_string(ByVal plain_text As String, ByVal key As Byte(), ByVal iv As Byte()) As String
Dim encryptor As Aes = Aes.Create()
encryptor.Mode = CipherMode.CBC
encryptor.Key = key
encryptor.IV = iv
Using mem_stream As MemoryStream = New MemoryStream()
Using aes_encryptor As ICryptoTransform = encryptor.CreateEncryptor()
Using crypt_stream As CryptoStream = New CryptoStream(mem_stream, aes_encryptor, CryptoStreamMode.Write)
Dim p_bytes As Byte() = Encoding.Default.GetBytes(plain_text)
crypt_stream.Write(p_bytes, 0, p_bytes.Length)
crypt_stream.FlushFinalBlock()
Dim c_bytes As Byte() = mem_stream.ToArray()
Return byte_arr_to_str(c_bytes)
End Using
End Using
End Using
End Function
Public Function decrypt_string(ByVal cipher_text As String, ByVal key As Byte(), ByVal iv As Byte()) As String
Dim encryptor As Aes = Aes.Create()
encryptor.Mode = CipherMode.CBC
encryptor.Key = key
encryptor.IV = iv
Using mem_stream As MemoryStream = New MemoryStream()
Using aes_decryptor As ICryptoTransform = encryptor.CreateDecryptor()
Using crypt_stream As CryptoStream = New CryptoStream(mem_stream, aes_decryptor, CryptoStreamMode.Write)
Dim c_bytes As Byte() = str_to_byte_arr(cipher_text)
crypt_stream.Write(c_bytes, 0, c_bytes.Length)
crypt_stream.FlushFinalBlock()
Dim p_bytes As Byte() = mem_stream.ToArray()
Return Encoding.Default.GetString(p_bytes, 0, p_bytes.Length)
End Using
End Using
End Using
End Function
Public Function iv_key() As String
Return Guid.NewGuid().ToString().Substring(0, Guid.NewGuid().ToString().IndexOf("-", StringComparison.Ordinal))
End Function
Public Function sha256(ByVal r As String) As String
Return byte_arr_to_str(New SHA256Managed().ComputeHash(Encoding.Default.GetBytes(r)))
End Function
Public Function encrypt(ByVal message As String, ByVal enc_key As String, ByVal iv As String) As String
Dim _key As Byte() = Encoding.Default.GetBytes(sha256(enc_key).Substring(0, 32))
Dim _iv As Byte() = Encoding.Default.GetBytes(sha256(iv).Substring(0, 16))
Return encrypt_string(message, _key, _iv)
End Function
Public Function decrypt(ByVal message As String, ByVal enc_key As String, ByVal iv As String) As String
Dim _key As Byte() = Encoding.Default.GetBytes(sha256(enc_key).Substring(0, 32))
Dim _iv As Byte() = Encoding.Default.GetBytes(sha256(iv).Substring(0, 16))
Return decrypt_string(message, _key, _iv)
End Function
Public Function unix_to_date(ByVal unixTimeStamp As Double) As Date
Return New DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(unixTimeStamp).ToLocalTime()
End Function
Public Function pin_public_key(ByVal sender As Object, ByVal certificate As X509Certificate, ByVal chain As X509Chain, ByVal sslPolicyErrors As SslPolicyErrors) As Boolean
Return Equals(certificate.GetPublicKeyString(), "3082010A028201010082BD4F6711C71AB8716DC67EB8C48B0535E910D49D6F5F125D37A68AE0907FA108FF4F975B9CB58036539C3BBD177912DCE101D871D60DD3A5B84176E89B45F991FE7952FA6DC39C8F0C38798F9312AC523093D1F93EFE16DC7212184AC516E983DCD998DAA543211206171C28795A85A079809F364CC991518B7A31F71B166B6763989D9B6A317B6E3C3F3D01BD516EF76B5FEA5978EFC422C9B870867800C16F204137C8A0A811D058CC657E37EA6DD84E68A9F73E2D52D08EFE4E743A85C27ACFAB2EBBD68797529B17B74C9033D019E1383E3CD34D1088342A67148295704A7192502A5299503510B6F07978D1D42A884DE2F830A6FC393136E9F0C245D50203010001")
End Function
End Module
Public Class json_wrapper
Public Shared Function is_serializable(ByVal to_check As Type) As Boolean
Return to_check.IsSerializable OrElse to_check.IsDefined(GetType(DataContractAttribute), True)
End Function
Public Sub New(ByVal obj_to_work_with As Object)
current_object = obj_to_work_with
Dim object_type = current_object.GetType()
serializer = New DataContractJsonSerializer(object_type)
If Not is_serializable(object_type) Then Throw New Exception($"the object {current_object} isn't a serializable")
End Sub
Public Function to_json_string() As String
Using mem_stream = New MemoryStream()
serializer.WriteObject(mem_stream, current_object)
mem_stream.Position = 0
Using reader = New StreamReader(mem_stream)
Return reader.ReadToEnd()
End Using
End Using
End Function
Public Function string_to_object(ByVal json As String) As Object
Dim buffer = Encoding.Default.GetBytes(json)
'SerializationException = session expired
Using mem_stream = New MemoryStream(buffer)
Return serializer.ReadObject(mem_stream)
End Using
End Function
#Region "extras"
Public Function string_to_dynamic(ByVal json As String) As Dynamic
Return CType(string_to_object(json), Dynamic)
End Function
Public Function string_to_generic(Of T)(ByVal json As String) As T
Return string_to_object(json)
End Function
Public Function to_json_dynamic() As Dynamic
Return string_to_object(to_json_string())
End Function
#End Region
Private serializer As DataContractJsonSerializer
Private current_object As Object
End Class
End Namespace