· 4 years ago · Apr 07, 2021, 07:38 PM
1using System;
2using System.ComponentModel;
3using System.Globalization;
4using System.Threading.Tasks;
5using Legimi.Core.Utils.Encryption;
6using Legimi.Reader.Db.Documents;
7using SQLite;
8
9namespace Legimi.Reader.Db.Linq.Documents
10{
11 // Token: 0x02000072 RID: 114
12 internal class LinqDocumentKey : DocumentKey, INotifyPropertyChanged
13 {
14 // Token: 0x1700022A RID: 554
15 // (get) Token: 0x06000630 RID: 1584 RVA: 0x00016FB1 File Offset: 0x000151B1
16 // (set) Token: 0x06000631 RID: 1585 RVA: 0x00016FB9 File Offset: 0x000151B9
17 [PrimaryKey]
18 [AutoIncrement]
19 public int TableId { get; set; }
20
21 // Token: 0x1700022B RID: 555
22 // (get) Token: 0x06000632 RID: 1586 RVA: 0x00016FC2 File Offset: 0x000151C2
23 // (set) Token: 0x06000633 RID: 1587 RVA: 0x00016FCA File Offset: 0x000151CA
24 public int VersionId
25 {
26 get
27 {
28 return this.ver;
29 }
30 set
31 {
32 this.ver = value;
33 this.notify("VersionId");
34 }
35 }
36
37 // Token: 0x1700022C RID: 556
38 // (get) Token: 0x06000634 RID: 1588 RVA: 0x00016FDE File Offset: 0x000151DE
39 // (set) Token: 0x06000635 RID: 1589 RVA: 0x00016FE6 File Offset: 0x000151E6
40 internal byte[] Iv
41 {
42 get
43 {
44 return this.iv;
45 }
46 set
47 {
48 this.iv = value;
49 this.notify("Iv");
50 }
51 }
52
53 // Token: 0x1700022D RID: 557
54 // (get) Token: 0x06000636 RID: 1590 RVA: 0x00016FFA File Offset: 0x000151FA
55 // (set) Token: 0x06000637 RID: 1591 RVA: 0x00017008 File Offset: 0x00015208
56 public string IvStr
57 {
58 get
59 {
60 return this.ConvertHexToString(this.iv);
61 }
62 set
63 {
64 this.iv = this.ConvertStringToHex(value);
65 }
66 }
67
68 // Token: 0x06000638 RID: 1592 RVA: 0x00017018 File Offset: 0x00015218
69 private byte[] ConvertStringToHex(string text)
70 {
71 if (text != null)
72 {
73 int num = 0;
74 string[] array = text.Split(new char[]
75 {
76 '-'
77 });
78 byte[] array2 = new byte[array.Length];
79 foreach (string text2 in array)
80 {
81 array2[num] = byte.Parse(text2, 515, CultureInfo.InvariantCulture);
82 num++;
83 }
84 return array2;
85 }
86 return null;
87 }
88
89 // Token: 0x06000639 RID: 1593 RVA: 0x00017073 File Offset: 0x00015273
90 private string ConvertHexToString(byte[] bytes)
91 {
92 if (bytes == null)
93 {
94 return null;
95 }
96 return BitConverter.ToString(bytes);
97 }
98
99 // Token: 0x1700022E RID: 558
100 // (get) Token: 0x0600063A RID: 1594 RVA: 0x00017080 File Offset: 0x00015280
101 // (set) Token: 0x0600063B RID: 1595 RVA: 0x00017088 File Offset: 0x00015288
102 internal byte[] KeyColumn
103 {
104 get
105 {
106 return this.keyBytes;
107 }
108 set
109 {
110 this.keyBytes = value;
111 this.notify("KeyColumn");
112 }
113 }
114
115 // Token: 0x1700022F RID: 559
116 // (get) Token: 0x0600063C RID: 1596 RVA: 0x0001709C File Offset: 0x0001529C
117 // (set) Token: 0x0600063D RID: 1597 RVA: 0x000170AA File Offset: 0x000152AA
118 public string KeyColumnStr
119 {
120 get
121 {
122 return this.ConvertHexToString(this.keyBytes);
123 }
124 set
125 {
126 this.keyBytes = this.ConvertStringToHex(value);
127 }
128 }
129
130 // Token: 0x17000230 RID: 560
131 // (get) Token: 0x0600063E RID: 1598 RVA: 0x000170B9 File Offset: 0x000152B9
132 // (set) Token: 0x0600063F RID: 1599 RVA: 0x000170C1 File Offset: 0x000152C1
133 internal byte[] SecretIv
134 {
135 get
136 {
137 return this.secretIv;
138 }
139 set
140 {
141 this.secretIv = value;
142 this.notify("SecretIv");
143 }
144 }
145
146 // Token: 0x17000231 RID: 561
147 // (get) Token: 0x06000640 RID: 1600 RVA: 0x000170D5 File Offset: 0x000152D5
148 // (set) Token: 0x06000641 RID: 1601 RVA: 0x000170E3 File Offset: 0x000152E3
149 public string SecretIvStr
150 {
151 get
152 {
153 return this.ConvertHexToString(this.secretIv);
154 }
155 set
156 {
157 this.secretIv = this.ConvertStringToHex(value);
158 }
159 }
160
161 // Token: 0x17000232 RID: 562
162 // (get) Token: 0x06000642 RID: 1602 RVA: 0x000170F2 File Offset: 0x000152F2
163 // (set) Token: 0x06000643 RID: 1603 RVA: 0x000170FA File Offset: 0x000152FA
164 internal byte[] SecretKey
165 {
166 get
167 {
168 return this.secretKey;
169 }
170 set
171 {
172 this.secretKey = value;
173 this.notify("SecretKey");
174 }
175 }
176
177 // Token: 0x17000233 RID: 563
178 // (get) Token: 0x06000644 RID: 1604 RVA: 0x0001710E File Offset: 0x0001530E
179 // (set) Token: 0x06000645 RID: 1605 RVA: 0x0001711C File Offset: 0x0001531C
180 public string SecretKeyStr
181 {
182 get
183 {
184 return this.ConvertHexToString(this.secretKey);
185 }
186 set
187 {
188 this.secretKey = this.ConvertStringToHex(value);
189 }
190 }
191
192 // Token: 0x17000234 RID: 564
193 // (get) Token: 0x06000646 RID: 1606 RVA: 0x0001712B File Offset: 0x0001532B
194 // (set) Token: 0x06000647 RID: 1607 RVA: 0x00017133 File Offset: 0x00015333
195 internal byte[] DrmData1
196 {
197 get
198 {
199 return this.drm1;
200 }
201 set
202 {
203 this.drm1 = value;
204 this.notify("DrmData1");
205 }
206 }
207
208 // Token: 0x17000235 RID: 565
209 // (get) Token: 0x06000648 RID: 1608 RVA: 0x00017147 File Offset: 0x00015347
210 // (set) Token: 0x06000649 RID: 1609 RVA: 0x0001714F File Offset: 0x0001534F
211 internal byte[] DrmData2
212 {
213 get
214 {
215 return this.drm2;
216 }
217 set
218 {
219 this.drm2 = value;
220 this.notify("DrmData2");
221 }
222 }
223
224 // Token: 0x17000236 RID: 566
225 // (get) Token: 0x0600064A RID: 1610 RVA: 0x00017163 File Offset: 0x00015363
226 // (set) Token: 0x0600064B RID: 1611 RVA: 0x00017194 File Offset: 0x00015394
227 [Ignore]
228 public override EncryptionKey Key
229 {
230 get
231 {
232 this.disposeKey();
233 return new EncryptionKey
234 {
235 iv = this.decryptIv(this.iv),
236 key = this.decryptKey(this.keyBytes)
237 };
238 }
239 set
240 {
241 this.disposeKey();
242 this.Iv = this.encryptIv(value.iv);
243 this.KeyColumn = this.encryptKey(value.key);
244 byte[] array = new byte[16];
245 byte[] array2 = new byte[16];
246 Random random = new Random();
247 random.NextBytes(array);
248 random.NextBytes(array2);
249 this.DrmData1 = array;
250 this.DrmData2 = array2;
251 }
252 }
253
254 // Token: 0x0600064C RID: 1612 RVA: 0x000171FC File Offset: 0x000153FC
255 public override void Dispose()
256 {
257 if (this.iv != null)
258 {
259 this.iv.Initialize();
260 }
261 if (this.keyBytes != null)
262 {
263 this.keyBytes.Initialize();
264 }
265 if (this.secretIv != null)
266 {
267 this.secretIv.Initialize();
268 }
269 if (this.secretKey != null)
270 {
271 this.secretKey.Initialize();
272 }
273 if (this.drm1 != null)
274 {
275 this.drm1.Initialize();
276 }
277 if (this.drm2 != null)
278 {
279 this.drm2.Initialize();
280 }
281 }
282
283 // Token: 0x0600064D RID: 1613 RVA: 0x0001727C File Offset: 0x0001547C
284 private void disposeKey()
285 {
286 if (this.key != null)
287 {
288 if (this.key.iv != null)
289 {
290 this.key.iv.Initialize();
291 }
292 if (this.key.key != null)
293 {
294 this.key.key.Initialize();
295 }
296 }
297 this.key = null;
298 }
299
300 // Token: 0x0600064E RID: 1614 RVA: 0x000172D4 File Offset: 0x000154D4
301 public override void save()
302 {
303 using (new DocDbLock())
304 {
305 LinqDocDb.Instance.dbStore.Update();
306 }
307 }
308
309 // Token: 0x1400000A RID: 10
310 // (add) Token: 0x0600064F RID: 1615 RVA: 0x00017314 File Offset: 0x00015514
311 // (remove) Token: 0x06000650 RID: 1616 RVA: 0x0001734C File Offset: 0x0001554C
312 public event PropertyChangedEventHandler PropertyChanged;
313
314 // Token: 0x06000651 RID: 1617 RVA: 0x00017381 File Offset: 0x00015581
315 private void notify(string name)
316 {
317 if (this.PropertyChanged != null)
318 {
319 this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs(name));
320 }
321 }
322
323 // Token: 0x17000237 RID: 567
324 // (get) Token: 0x06000652 RID: 1618 RVA: 0x000173A0 File Offset: 0x000155A0
325 private static byte[] ID
326 {
327 get
328 {
329 object obj = LinqDocumentKey.idLock;
330 lock (obj)
331 {
332 if (LinqDocumentKey.hardwareId == null)
333 {
334 LinqDocumentKey.hardwareId = Task.Run<byte[]>(() => LinqConfig.GetHardwareId()).Result;
335 }
336 }
337 return LinqDocumentKey.hardwareId;
338 }
339 }
340
341 // Token: 0x06000653 RID: 1619 RVA: 0x00017414 File Offset: 0x00015614
342 private byte[] encryptIv(byte[] buf)
343 {
344 EncryptionKey encryptionKey = new EncryptionKey();
345 Random random;
346 try
347 {
348 random = new Random((int)LinqDocumentKey.ID[7] << (int)(16 + LinqDocumentKey.ID[8]) << (int)(8 + LinqDocumentKey.ID[3]));
349 }
350 catch (OverflowException)
351 {
352 random = new Random(((int)LinqDocumentKey.ID[7] << 16) + ((int)LinqDocumentKey.ID[8] << 8) + (int)LinqDocumentKey.ID[3]);
353 }
354 byte[] array = new byte[8];
355 random.NextBytes(array);
356 byte[] array2 = new byte[8];
357 Array.Copy(LinqDocumentKey.ID, 4, array2, 0, 8);
358 encryptionKey.key = new byte[16];
359 Array.Copy(array, encryptionKey.key, array.Length);
360 Array.Copy(array2, 0, encryptionKey.key, array.Length, array2.Length);
361 random = new Random(DateTime.Now.Millisecond);
362 byte[] array3 = new byte[8];
363 random.NextBytes(array3);
364 byte[] array4 = new byte[16];
365 Array.Copy(array, array4, array.Length);
366 Array.Copy(array3, 0, array4, array.Length, array3.Length);
367 this.SecretIv = array4;
368 encryptionKey.iv = new byte[16];
369 Array.Copy(encryptionKey.key, encryptionKey.iv, 16);
370 Array.Reverse(encryptionKey.iv);
371 encryptionKey.iv = MD5Core.GetHash(encryptionKey.iv);
372 return W8Crypt.Encrypt(buf, encryptionKey.key, encryptionKey.iv, false);
373 }
374
375 // Token: 0x06000654 RID: 1620 RVA: 0x00017578 File Offset: 0x00015778
376 private byte[] decryptIv(byte[] buf)
377 {
378 EncryptionKey encryptionKey = new EncryptionKey();
379 encryptionKey.key = new byte[16];
380 Array.Copy(this.SecretIv, encryptionKey.key, 8);
381 Array.Copy(LinqDocumentKey.ID, 4, encryptionKey.key, 8, 8);
382 encryptionKey.iv = new byte[16];
383 Array.Copy(encryptionKey.key, encryptionKey.iv, 16);
384 Array.Reverse(encryptionKey.iv);
385 encryptionKey.iv = MD5Core.GetHash(encryptionKey.iv);
386 return W8Crypt.Decrypt(buf, encryptionKey.key, encryptionKey.iv, false);
387 }
388
389 // Token: 0x06000655 RID: 1621 RVA: 0x0001760C File Offset: 0x0001580C
390 private byte[] encryptKey(byte[] buf)
391 {
392 EncryptionKey encryptionKey = new EncryptionKey();
393 Random random;
394 try
395 {
396 random = new Random((int)LinqDocumentKey.ID[6] << (int)(16 + LinqDocumentKey.ID[7]) << (int)(8 + LinqDocumentKey.ID[13]));
397 }
398 catch (OverflowException)
399 {
400 random = new Random(((int)LinqDocumentKey.ID[6] << 16) + ((int)LinqDocumentKey.ID[7] << 8) + (int)LinqDocumentKey.ID[13]);
401 }
402 byte[] array = new byte[8];
403 random.NextBytes(array);
404 byte[] array2 = new byte[8];
405 Array.Copy(LinqDocumentKey.ID, 11, array2, 0, 8);
406 encryptionKey.key = new byte[16];
407 Array.Copy(array, encryptionKey.key, array.Length);
408 Array.Copy(array2, 0, encryptionKey.key, array.Length, array2.Length);
409 random = new Random(DateTime.Now.Millisecond);
410 byte[] array3 = new byte[8];
411 random.NextBytes(array3);
412 byte[] array4 = new byte[16];
413 Array.Copy(array, array4, array.Length);
414 Array.Copy(array3, 0, array4, array.Length, array3.Length);
415 this.SecretKey = array4;
416 encryptionKey.iv = new byte[16];
417 Array.Copy(encryptionKey.key, encryptionKey.iv, 16);
418 Array.Reverse(encryptionKey.iv);
419 encryptionKey.iv = MD5Core.GetHash(encryptionKey.iv);
420 return W8Crypt.Encrypt(buf, encryptionKey.key, encryptionKey.iv, false);
421 }
422
423 // Token: 0x06000656 RID: 1622 RVA: 0x00017774 File Offset: 0x00015974
424 private byte[] decryptKey(byte[] buf)
425 {
426 EncryptionKey encryptionKey = new EncryptionKey();
427 encryptionKey.key = new byte[16];
428 Array.Copy(this.SecretKey, encryptionKey.key, 8);
429 Array.Copy(LinqDocumentKey.ID, 11, encryptionKey.key, 8, 8);
430 encryptionKey.iv = new byte[16];
431 Array.Copy(encryptionKey.key, encryptionKey.iv, 16);
432 Array.Reverse(encryptionKey.iv);
433 encryptionKey.iv = MD5Core.GetHash(encryptionKey.iv);
434 return W8Crypt.Decrypt(buf, encryptionKey.key, encryptionKey.iv, false);
435 }
436
437 // Token: 0x04000224 RID: 548
438 private int ver;
439
440 // Token: 0x04000225 RID: 549
441 private byte[] iv;
442
443 // Token: 0x04000226 RID: 550
444 private byte[] keyBytes;
445
446 // Token: 0x04000227 RID: 551
447 private byte[] secretIv;
448
449 // Token: 0x04000228 RID: 552
450 private byte[] secretKey;
451
452 // Token: 0x04000229 RID: 553
453 private byte[] drm1;
454
455 // Token: 0x0400022A RID: 554
456 private byte[] drm2;
457
458 // Token: 0x0400022C RID: 556
459 private static readonly object idLock = new object();
460
461 // Token: 0x0400022D RID: 557
462 private static byte[] hardwareId;
463 }
464}
465