@rhyster/wow-casc-dbc 2.6.19 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/adb.d.ts +17 -0
  2. package/dist/adb.d.ts.map +1 -0
  3. package/dist/blte.d.ts +25 -0
  4. package/dist/blte.d.ts.map +1 -0
  5. package/dist/client.d.ts +84 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/dbd.d.ts +26 -0
  8. package/dist/dbd.d.ts.map +1 -0
  9. package/dist/fetcher.d.ts +21 -0
  10. package/dist/fetcher.d.ts.map +1 -0
  11. package/dist/index.cjs +1 -0
  12. package/dist/index.cjs.map +1 -0
  13. package/dist/index.d.ts +9 -261
  14. package/dist/index.d.ts.map +1 -0
  15. package/dist/index.mjs +1 -0
  16. package/dist/index.mjs.map +1 -0
  17. package/dist/jenkins96.d.ts +3 -0
  18. package/dist/jenkins96.d.ts.map +1 -0
  19. package/dist/parsers/archiveIndex.d.ts +9 -0
  20. package/dist/parsers/archiveIndex.d.ts.map +1 -0
  21. package/dist/parsers/config.d.ts +40 -0
  22. package/dist/parsers/config.d.ts.map +1 -0
  23. package/dist/parsers/encodingFile.d.ts +11 -0
  24. package/dist/parsers/encodingFile.d.ts.map +1 -0
  25. package/dist/parsers/productConfig.d.ts +21 -0
  26. package/dist/parsers/productConfig.d.ts.map +1 -0
  27. package/dist/parsers/rootFile.d.ts +45 -0
  28. package/dist/parsers/rootFile.d.ts.map +1 -0
  29. package/dist/salsa20.d.ts +14 -0
  30. package/dist/salsa20.d.ts.map +1 -0
  31. package/dist/store.d.ts +9 -0
  32. package/dist/store.d.ts.map +1 -0
  33. package/dist/test/salsa20.test.d.ts +2 -0
  34. package/dist/test/salsa20.test.d.ts.map +1 -0
  35. package/dist/utils.d.ts +3 -0
  36. package/dist/utils.d.ts.map +1 -0
  37. package/dist/wdc.d.ts +104 -0
  38. package/dist/wdc.d.ts.map +1 -0
  39. package/package.json +4 -3
  40. package/src/adb.ts +70 -0
  41. package/src/blte.ts +220 -0
  42. package/src/client.ts +411 -0
  43. package/src/dbd.ts +427 -0
  44. package/src/fetcher.ts +223 -0
  45. package/src/index.ts +44 -0
  46. package/src/jenkins96.ts +75 -0
  47. package/src/parsers/archiveIndex.ts +119 -0
  48. package/src/parsers/config.ts +75 -0
  49. package/src/parsers/encodingFile.ts +159 -0
  50. package/src/parsers/productConfig.ts +57 -0
  51. package/src/parsers/rootFile.ts +172 -0
  52. package/src/salsa20.ts +143 -0
  53. package/src/store.ts +37 -0
  54. package/src/test/salsa20.test.ts +522 -0
  55. package/src/utils.ts +77 -0
  56. package/src/wdc.ts +788 -0
@@ -0,0 +1,522 @@
1
+ /* eslint-disable no-bitwise */
2
+ /* eslint-disable import-x/no-unused-modules */
3
+ /* eslint-disable @typescript-eslint/no-floating-promises */
4
+
5
+ import { strictEqual } from 'node:assert';
6
+ import { suite, test } from 'node:test';
7
+
8
+ import Salsa20 from '../salsa20.ts';
9
+
10
+ const hexToBytes = (hex: string): Uint8Array => {
11
+ const bytes = new Uint8Array(hex.length / 2);
12
+ for (let i = 0; i < hex.length; i += 2) {
13
+ bytes[i / 2] = parseInt(hex.slice(i, i + 2), 16);
14
+ }
15
+ return bytes;
16
+ };
17
+
18
+ const bytesToHex = (bytes: Uint8Array): string => [...bytes]
19
+ .map((byte) => byte.toString(16).padStart(2, '0')).join('');
20
+
21
+ // https://github.com/das-labor/legacy/blob/master/microcontroller-2/arm-crypto-lib/testvectors/salsa20-full-verified.test-vectors
22
+ suite('Salsa20 128-bit', () => {
23
+ test('Set 1, Vector #0', () => {
24
+ const key = '80000000000000000000000000000000';
25
+ const iv = '0000000000000000';
26
+
27
+ const bk1 = '4DFA5E481DA23EA09A31022050859936'
28
+ + 'DA52FCEE218005164F267CB65F5CFD7F'
29
+ + '2B4F97E0FF16924A52DF269515110A07'
30
+ + 'F9E460BC65EF95DA58F740B7D1DBB0AA';
31
+ const bk2 = 'DA9C1581F429E0A00F7D67E23B730676'
32
+ + '783B262E8EB43A25F55FB90B3E753AEF'
33
+ + '8C6713EC66C51881111593CCB3E8CB8F'
34
+ + '8DE124080501EEEB389C4BCB6977CF95';
35
+ const bk3 = '7D5789631EB4554400E1E025935DFA7B'
36
+ + '3E9039D61BDC58A8697D36815BF1985C'
37
+ + 'EFDF7AE112E5BB81E37ECF0616CE7147'
38
+ + 'FC08A93A367E08631F23C03B00A8DA2F';
39
+ const bk4 = 'B375703739DACED4DD4059FD71C3C47F'
40
+ + 'C2F9939670FAD4A46066ADCC6A564578'
41
+ + '3308B90FFB72BE04A6B147CBE38CC0C3'
42
+ + 'B9267C296A92A7C69873F9F263BE9703';
43
+ const xor = 'F7A274D268316790A67EC058F45C0F2A'
44
+ + '067A99FCDE6236C0CEF8E056349FE54C'
45
+ + '5F13AC74D2539570FD34FEAB06C57205'
46
+ + '3949B59585742181A5A760223AFA22D4';
47
+
48
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
49
+ const result = handler.process(hexToBytes('00'.repeat(512)));
50
+
51
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
52
+ strictEqual(bytesToHex(result.slice(192, 256)), bk2.toLowerCase());
53
+ strictEqual(bytesToHex(result.slice(256, 320)), bk3.toLowerCase());
54
+ strictEqual(bytesToHex(result.slice(448, 512)), bk4.toLowerCase());
55
+
56
+ const xorResult = new Uint8Array(64);
57
+ for (let i = 0; i < 512; i += 1) {
58
+ xorResult[i % 64] ^= result[i];
59
+ }
60
+
61
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
62
+ });
63
+
64
+ test('Set 2, Vector #0', () => {
65
+ const key = '00000000000000000000000000000000';
66
+ const iv = '0000000000000000';
67
+
68
+ const bk1 = '6513ADAECFEB124C1CBE6BDAEF690B4F'
69
+ + 'FB00B0FCACE33CE806792BB414801998'
70
+ + '34BFB1CFDD095802C6E95E251002989A'
71
+ + 'C22AE588D32AE79320D9BD7732E00338';
72
+ const bk2 = '75E9D0493CA05D2820408719AFC75120'
73
+ + '692040118F76B8328AC279530D846670'
74
+ + '65E735C52ADD4BCFE07C9D93C0091790'
75
+ + '2B187D46A25924767F91A6B29C961859';
76
+ const bk3 = '0E47D68F845B3D31E8B47F3BEA660E2E'
77
+ + 'CA484C82F5E3AE00484D87410A1772D0'
78
+ + 'FA3B88F8024C170B21E50E0989E94A26'
79
+ + '69C91973B3AE5781D305D8122791DA4C';
80
+ const bk4 = 'CCBA51D3DB400E7EB780C0CCBD3D2B5B'
81
+ + 'B9AAD82A75A1F746824EE5B9DAF7B794'
82
+ + '7A4B808DF48CE94830F6C9146860611D'
83
+ + 'A649E735ED5ED6E3E3DFF7C218879D63';
84
+ const xor = '6D3937FFA13637648E477623277644AD'
85
+ + 'AD3854E6B2B3E4D68155356F68B30490'
86
+ + '842B2AEA2E32239BE84E613C6CE1B9BD'
87
+ + '026094962CB1A6757AF5A13DDAF8252C';
88
+
89
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
90
+ const result = handler.process(hexToBytes('00'.repeat(512)));
91
+
92
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
93
+ strictEqual(bytesToHex(result.slice(192, 256)), bk2.toLowerCase());
94
+ strictEqual(bytesToHex(result.slice(256, 320)), bk3.toLowerCase());
95
+ strictEqual(bytesToHex(result.slice(448, 512)), bk4.toLowerCase());
96
+
97
+ const xorResult = new Uint8Array(64);
98
+ for (let i = 0; i < 512; i += 1) {
99
+ xorResult[i % 64] ^= result[i];
100
+ }
101
+
102
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
103
+ });
104
+
105
+ test('Set 3, Vector #0', () => {
106
+ const key = '000102030405060708090A0B0C0D0E0F';
107
+ const iv = '0000000000000000';
108
+
109
+ const bk1 = '2DD5C3F7BA2B20F76802410C68868889'
110
+ + '5AD8C1BD4EA6C9B140FB9B90E21049BF'
111
+ + '583F527970EBC1A4C4C5AF117A5940D9'
112
+ + '2B98895B1902F02BF6E9BEF8D6B4CCBE';
113
+ const bk2 = 'AB56CC2C5BFFEF174BBE28C48A17039E'
114
+ + 'CB795F4C2541E2F4AE5C69CA7FC2DED4'
115
+ + 'D39B2C7B936ACD5C2ECD4719FD6A3188'
116
+ + '323A14490281CBE8DAC48E4664FF3D3B';
117
+ const bk3 = '9A18E827C33633E932FC431D697F0775'
118
+ + 'B4C5B0AD26D1ACD5A643E3A01A065821'
119
+ + '42A43F48E5D3D9A91858887310D39969'
120
+ + 'D65E7DB788AFE27D03CD985641967357';
121
+ const bk4 = '752357191E8041ABB8B5761FAF9CB9D7'
122
+ + '3072E10B4A3ED8C6ADA2B05CBBAC298F'
123
+ + '2ED6448360F63A51E073DE02338DBAF2'
124
+ + 'A8384157329BC31A1036BBB4CBFEE660';
125
+ const xor = 'F3BCF4D6381742839C5627050D4B227F'
126
+ + 'EB1ECCC527BF605C4CB9D6FB0618F419'
127
+ + 'B51846707550BBEEE381E44A50A406D0'
128
+ + '20C8433D08B19C98EFC867ED9897EDBB';
129
+
130
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
131
+ const result = handler.process(hexToBytes('00'.repeat(512)));
132
+
133
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
134
+ strictEqual(bytesToHex(result.slice(192, 256)), bk2.toLowerCase());
135
+ strictEqual(bytesToHex(result.slice(256, 320)), bk3.toLowerCase());
136
+ strictEqual(bytesToHex(result.slice(448, 512)), bk4.toLowerCase());
137
+
138
+ const xorResult = new Uint8Array(64);
139
+ for (let i = 0; i < 512; i += 1) {
140
+ xorResult[i % 64] ^= result[i];
141
+ }
142
+
143
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
144
+ });
145
+
146
+ test('Set 4, Vector #0', () => {
147
+ const key = '0053A6F94C9FF24598EB3E91E4378ADD';
148
+ const iv = '0000000000000000';
149
+
150
+ const bk1 = 'BE4EF3D2FAC6C4C3D822CE67436A407C'
151
+ + 'C237981D31A65190B51053D13A19C89F'
152
+ + 'C90ACB45C8684058733EDD259869C58E'
153
+ + 'EF760862BEFBBCA0F6E675FD1FA25C27';
154
+ const bk2 = 'F5666B7BD1F4BC8134E0E45CDB69876D'
155
+ + '1D0ADAE6E3C17BFBFE4BCE02461169C5'
156
+ + '4B787C6EF602AF92BEBBD66321E0CAF0'
157
+ + '44E1ADA8CCB9F9FACFC4C1031948352E';
158
+ const bk3 = '292EEB202F1E3A353D9DC6188C5DB434'
159
+ + '14C9EF3F479DF988125EC39B30C014A8'
160
+ + '09683084FBCDD5271165B1B1BF54DAB4'
161
+ + '40577D864CD186867876F7FDA5C79653';
162
+ const bk4 = 'C012E8E03878A6E7D236FEC001A9F895'
163
+ + 'B4F58B2AF2F3D237A944D93273F5F3B5'
164
+ + '45B1220A6A2C732FC85E7632921F2D36'
165
+ + '6B3290C7B0A73FB61D49BC7616FC02B8';
166
+ const xor = '196D1A0977F0585B23367497D449E11D'
167
+ + 'E328ECD944BC133F786348C9591B35B7'
168
+ + '189CDDD934757ED8F18FBC984DA377A8'
169
+ + '07147F1A6A9A8759FD2A062FD76D275E';
170
+
171
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
172
+ const result = handler.process(hexToBytes('00'.repeat(131072)));
173
+
174
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
175
+ strictEqual(bytesToHex(result.slice(65472, 65536)), bk2.toLowerCase());
176
+ strictEqual(bytesToHex(result.slice(65536, 65600)), bk3.toLowerCase());
177
+ strictEqual(bytesToHex(result.slice(131008, 131072)), bk4.toLowerCase());
178
+
179
+ const xorResult = new Uint8Array(64);
180
+ for (let i = 0; i < 131072; i += 1) {
181
+ xorResult[i % 64] ^= result[i];
182
+ }
183
+
184
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
185
+ });
186
+
187
+ test('Set 5, Vector #0', () => {
188
+ const key = '00000000000000000000000000000000';
189
+ const iv = '8000000000000000';
190
+
191
+ const bk1 = 'B66C1E4446DD9557E578E223B0B76801'
192
+ + '7B23B267BB0234AE4626BF443F219776'
193
+ + '436FB19FD0E8866FCD0DE9A9538F4A09'
194
+ + 'CA9AC0732E30BCF98E4F13E4B9E201D9';
195
+ const bk2 = '462920041C5543954D6230C531042B99'
196
+ + '9A289542FEB3C129C5286E1A4B4CF118'
197
+ + '7447959785434BEF0D05C6EC8950E469'
198
+ + 'BBA6647571DDD049C72D81AC8B75D027';
199
+ const bk3 = 'DD84E3F631ADDC4450B9813729BD8E7C'
200
+ + 'C8909A1E023EE539F12646CFEC03239A'
201
+ + '68F3008F171CDAE514D20BCD584DFD44'
202
+ + 'CBF25C05D028E51870729E4087AA025B';
203
+ const bk4 = '5AC8474899B9E28211CC7137BD0DF290'
204
+ + 'D3E926EB32D8F9C92D0FB1DE4DBE452D'
205
+ + 'E3800E554B348E8A3D1B9C59B9C77B09'
206
+ + '0B8E3A0BDAC520E97650195846198E9D';
207
+ const xor = '104639D9F65C879F7DFF8A82A94C130C'
208
+ + 'D6C727B3BC8127943ACDF0AB7AD6D28B'
209
+ + 'F2ADF50D81F50C53D0FDFE15803854C7'
210
+ + 'D67F6C9B4752275696E370A467A4C1F8';
211
+
212
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
213
+ const result = handler.process(hexToBytes('00'.repeat(512)));
214
+
215
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
216
+ strictEqual(bytesToHex(result.slice(192, 256)), bk2.toLowerCase());
217
+ strictEqual(bytesToHex(result.slice(256, 320)), bk3.toLowerCase());
218
+ strictEqual(bytesToHex(result.slice(448, 512)), bk4.toLowerCase());
219
+
220
+ const xorResult = new Uint8Array(64);
221
+ for (let i = 0; i < 512; i += 1) {
222
+ xorResult[i % 64] ^= result[i];
223
+ }
224
+
225
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
226
+ });
227
+
228
+ test('Set 6, Vector #0', () => {
229
+ const key = '0053A6F94C9FF24598EB3E91E4378ADD';
230
+ const iv = '0D74DB42A91077DE';
231
+
232
+ const bk1 = '05E1E7BEB697D999656BF37C1B978806'
233
+ + '735D0B903A6007BD329927EFBE1B0E2A'
234
+ + '8137C1AE291493AA83A821755BEE0B06'
235
+ + 'CD14855A67E46703EBF8F3114B584CBA';
236
+ const bk2 = '1A70A37B1C9CA11CD3BF988D3EE4612D'
237
+ + '15F1A08D683FCCC6558ECF2089388B8E'
238
+ + '555E7619BF82EE71348F4F8D0D2AE464'
239
+ + '339D66BFC3A003BF229C0FC0AB6AE1C6';
240
+ const bk3 = '4ED220425F7DDB0C843232FB03A7B1C7'
241
+ + '616A50076FB056D3580DB13D2C295973'
242
+ + 'D289CC335C8BC75DD87F121E85BB9981'
243
+ + '66C2EF415F3F7A297E9E1BEE767F84E2';
244
+ const bk4 = 'E121F8377E5146BFAE5AEC9F422F474F'
245
+ + 'D3E9C685D32744A76D8B307A682FCA1B'
246
+ + '6BF790B5B51073E114732D3786B985FD'
247
+ + '4F45162488FEEB04C8F26E27E0F6B5CD';
248
+ const xor = '620BB4C2ED20F4152F0F86053D3F5595'
249
+ + '8E1FBA48F5D86B25C8F31559F3158072'
250
+ + '6E7ED8525D0B9EA5264BF97750713476'
251
+ + '1EF65FE195274AFBF000938C03BA59A7';
252
+
253
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
254
+ const result = handler.process(hexToBytes('00'.repeat(131072)));
255
+
256
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
257
+ strictEqual(bytesToHex(result.slice(65472, 65536)), bk2.toLowerCase());
258
+ strictEqual(bytesToHex(result.slice(65536, 65600)), bk3.toLowerCase());
259
+ strictEqual(bytesToHex(result.slice(131008, 131072)), bk4.toLowerCase());
260
+
261
+ const xorResult = new Uint8Array(64);
262
+ for (let i = 0; i < 131072; i += 1) {
263
+ xorResult[i % 64] ^= result[i];
264
+ }
265
+
266
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
267
+ });
268
+ });
269
+
270
+ suite('Salsa20 256-bit', () => {
271
+ test('Set 1, Vector #0', () => {
272
+ const key = '80000000000000000000000000000000'
273
+ + '00000000000000000000000000000000';
274
+ const iv = '0000000000000000';
275
+
276
+ const bk1 = 'E3BE8FDD8BECA2E3EA8EF9475B29A6E7'
277
+ + '003951E1097A5C38D23B7A5FAD9F6844'
278
+ + 'B22C97559E2723C7CBBD3FE4FC8D9A07'
279
+ + '44652A83E72A9C461876AF4D7EF1A117';
280
+ const bk2 = '57BE81F47B17D9AE7C4FF15429A73E10'
281
+ + 'ACF250ED3A90A93C711308A74C6216A9'
282
+ + 'ED84CD126DA7F28E8ABF8BB63517E1CA'
283
+ + '98E712F4FB2E1A6AED9FDC73291FAA17';
284
+ const bk3 = '958211C4BA2EBD5838C635EDB81F513A'
285
+ + '91A294E194F1C039AEEC657DCE40AA7E'
286
+ + '7C0AF57CACEFA40C9F14B71A4B3456A6'
287
+ + '3E162EC7D8D10B8FFB1810D71001B618';
288
+ const bk4 = '696AFCFD0CDDCC83C7E77F11A649D79A'
289
+ + 'CDC3354E9635FF137E929933A0BD6F53'
290
+ + '77EFA105A3A4266B7C0D089D08F1E855'
291
+ + 'CC32B15B93784A36E56A76CC64BC8477';
292
+ const xor = '50EC2485637DB19C6E795E9C73938280'
293
+ + '6F6DB320FE3D0444D56707D7B456457F'
294
+ + '3DB3E8D7065AF375A225A70951C8AB74'
295
+ + '4EC4D595E85225F08E2BC03FE1C42567';
296
+
297
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
298
+ const result = handler.process(hexToBytes('00'.repeat(512)));
299
+
300
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
301
+ strictEqual(bytesToHex(result.slice(192, 256)), bk2.toLowerCase());
302
+ strictEqual(bytesToHex(result.slice(256, 320)), bk3.toLowerCase());
303
+ strictEqual(bytesToHex(result.slice(448, 512)), bk4.toLowerCase());
304
+
305
+ const xorResult = new Uint8Array(64);
306
+ for (let i = 0; i < 512; i += 1) {
307
+ xorResult[i % 64] ^= result[i];
308
+ }
309
+
310
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
311
+ });
312
+
313
+ test('Set 2, Vector #0', () => {
314
+ const key = '00000000000000000000000000000000'
315
+ + '00000000000000000000000000000000';
316
+ const iv = '0000000000000000';
317
+
318
+ const bk1 = '9A97F65B9B4C721B960A672145FCA8D4'
319
+ + 'E32E67F9111EA979CE9C4826806AEEE6'
320
+ + '3DE9C0DA2BD7F91EBCB2639BF989C625'
321
+ + '1B29BF38D39A9BDCE7C55F4B2AC12A39';
322
+ const bk2 = '2F3C3E10649160B44321B7F830D7D222'
323
+ + '699FAE0E834C76C3997985B5404808AB'
324
+ + '7E6E99AA1FEC2730749213E7F37A291A'
325
+ + 'A6B5AFD2E524C2D608F34D4959930436';
326
+ const bk3 = '8598D1FA94516B474B69DA83E3C1312C'
327
+ + '49A05B8283B880B31872CD1EA7D8F1B2'
328
+ + 'D60A86CBA8184F949EA7AE8502A582DB'
329
+ + '392E85C4D70D3D17B2E57D817A98ED6E';
330
+ const bk4 = 'F86C7489712FB77896706FC892D9A1C8'
331
+ + '4BB53D081F6EB4AE1C68B1190CBB0B41'
332
+ + '484E9E2B6FEA0A31BF124415921E5CF3'
333
+ + '7C26493A5BC08F7620A8C80503C4C76F';
334
+ const xor = '7C3A1499A63B507B0BC75824ABEEAA26'
335
+ + '109101C5B915F0F554DD9950045D02FA'
336
+ + 'FF815CA8B2C7CFF3625765697B80B026'
337
+ + '7EA87E25412564BD71DD05843A60465E';
338
+
339
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
340
+ const result = handler.process(hexToBytes('00'.repeat(512)));
341
+
342
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
343
+ strictEqual(bytesToHex(result.slice(192, 256)), bk2.toLowerCase());
344
+ strictEqual(bytesToHex(result.slice(256, 320)), bk3.toLowerCase());
345
+ strictEqual(bytesToHex(result.slice(448, 512)), bk4.toLowerCase());
346
+
347
+ const xorResult = new Uint8Array(64);
348
+ for (let i = 0; i < 512; i += 1) {
349
+ xorResult[i % 64] ^= result[i];
350
+ }
351
+
352
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
353
+ });
354
+
355
+ test('Set 3, Vector #0', () => {
356
+ const key = '000102030405060708090A0B0C0D0E0F'
357
+ + '101112131415161718191A1B1C1D1E1F';
358
+ const iv = '0000000000000000';
359
+
360
+ const bk1 = 'B580F7671C76E5F7441AF87C146D6B51'
361
+ + '3910DC8B4146EF1B3211CF12AF4A4B49'
362
+ + 'E5C874B3EF4F85E7D7ED539FFEBA73EB'
363
+ + '73E0CCA74FBD306D8AA716C7783E89AF';
364
+ const bk2 = '9B5B5406977968E7F472DE2924EFFD0E'
365
+ + '8EA74C954D23FCC21E4ED87BBA9E0F79'
366
+ + 'D1477D1810368F02259F7F53966F91CE'
367
+ + 'B50ECD3DA10363E7F08EEAB83A0EF71A';
368
+ const bk3 = '68E43AA40C5D5718E636D8E3B0AB3830'
369
+ + 'D61698A12EB15BD9C923FF40A23E80BE'
370
+ + '026B7E1349265AD9C20A6C8A60256F4A'
371
+ + 'CD1D7AD0DCBE1DFF3058ACD9E1B4C537';
372
+ const bk4 = '343ED5D011373AF376308D0B0DAB7806'
373
+ + 'A4B4D3BF9B898181D546EFCF83D7464C'
374
+ + 'FC56AE76F03F3711174DC67AC9363E69'
375
+ + '84F5A447BD25642A00754F1133BFD953';
376
+ const xor = '8C03E9237FEE95D5041C753C204D2B35'
377
+ + '764E4A53035A76F9EFBADD7E63E60B69'
378
+ + 'BF23F7C5FD39B2249B0C628FB654D521'
379
+ + '4EB588371E5D2F34BF51396AF3ACB666';
380
+
381
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
382
+ const result = handler.process(hexToBytes('00'.repeat(512)));
383
+
384
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
385
+ strictEqual(bytesToHex(result.slice(192, 256)), bk2.toLowerCase());
386
+ strictEqual(bytesToHex(result.slice(256, 320)), bk3.toLowerCase());
387
+ strictEqual(bytesToHex(result.slice(448, 512)), bk4.toLowerCase());
388
+
389
+ const xorResult = new Uint8Array(64);
390
+ for (let i = 0; i < 512; i += 1) {
391
+ xorResult[i % 64] ^= result[i];
392
+ }
393
+
394
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
395
+ });
396
+
397
+ test('Set 4, Vector #0', () => {
398
+ const key = '0053A6F94C9FF24598EB3E91E4378ADD'
399
+ + '3083D6297CCF2275C81B6EC11467BA0D';
400
+ const iv = '0000000000000000';
401
+
402
+ const bk1 = 'F9D2DC274BB55AEFC2A0D9F8A982830F'
403
+ + '6916122BC0A6870F991C6ED8D00D2F85'
404
+ + '94E3151DE4C5A19A9A06FBC191C87BF0'
405
+ + '39ADF971314BAF6D02337080F2DAE5CE';
406
+ const bk2 = '05BDA8EE240BA6DC53A42C14C17F620F'
407
+ + '6FA799A6BC88775E04EEF427B4B9DE5A'
408
+ + '5349327FCADA077F385BA321DB4B3939'
409
+ + 'C0F49EA99801790B0FD32986AFC41B85';
410
+ const bk3 = 'FED5279620FBCBDD3C3980B11FCE4787'
411
+ + 'E6F9F97772BEAAD0EF215FDCD0B3A16F'
412
+ + 'BB56D72AFD5FD52E6A584BF840914168'
413
+ + 'D04A594FFDDA959A63EB4CF42694F03F';
414
+ const bk4 = 'F161DCE8FA4CF80F8143DDB21FA1BFA3'
415
+ + '1CA4DC0A412233EDE80EF72DAA1B8039'
416
+ + '4BCE3875CA1E1E195D58BC3197F803A8'
417
+ + '9C433A59A0718C1A009BCB4DA2AC1778';
418
+ const xor = '2052F9A2853E989133D10938222AC76D'
419
+ + 'B8B4CBA135ACB59970DDF9C074C6271A'
420
+ + '5C4E2A7A00D2D697EDFC9B1FF9B365C8'
421
+ + '7347B23020663A30711A71E3A02AB00C';
422
+
423
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
424
+ const result = handler.process(hexToBytes('00'.repeat(131072)));
425
+
426
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
427
+ strictEqual(bytesToHex(result.slice(65472, 65536)), bk2.toLowerCase());
428
+ strictEqual(bytesToHex(result.slice(65536, 65600)), bk3.toLowerCase());
429
+ strictEqual(bytesToHex(result.slice(131008, 131072)), bk4.toLowerCase());
430
+
431
+ const xorResult = new Uint8Array(64);
432
+ for (let i = 0; i < 131072; i += 1) {
433
+ xorResult[i % 64] ^= result[i];
434
+ }
435
+
436
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
437
+ });
438
+
439
+ test('Set 5, Vector #0', () => {
440
+ const key = '00000000000000000000000000000000'
441
+ + '00000000000000000000000000000000';
442
+ const iv = '8000000000000000';
443
+
444
+ const bk1 = '2ABA3DC45B4947007B14C851CD694456'
445
+ + 'B303AD59A465662803006705673D6C3E'
446
+ + '29F1D3510DFC0405463C03414E0E07E3'
447
+ + '59F1F1816C68B2434A19D3EEE0464873';
448
+ const bk2 = 'EFF0C107DCA563B5C0048EB488B40341'
449
+ + 'ED34052790475CD204A947EB480F3D75'
450
+ + '3EF5347CEBB0A21F25B6CC8DE6B48906'
451
+ + 'E604F554A6B01B23791F95C4A93A4717';
452
+ const bk3 = 'E3393E1599863B52DE8C52CF26C752FB'
453
+ + '473B74A34D6D9FE31E9CA8DD6292522F'
454
+ + '13EB456C5BE9E5432C06E1BA3965D454'
455
+ + '48936BC98376BF903969F049347EA05D';
456
+ const bk4 = 'FC4B2EF3B6B3815C99A437F16BDB06C5'
457
+ + 'B948692786081D91C48CC7B072ABB901'
458
+ + 'C0491CC6900F2FEA217BFFC70C43EDD6'
459
+ + '65E3E020B59AAA43868E9949FBB9AE22';
460
+ const xor = 'FE40F57D1586D7664C2FCA5AB10BD7C7'
461
+ + '9DE3234836E76949F9DC01CBFABC6D6C'
462
+ + '42AB27DDC748B4DF7991092972AB4985'
463
+ + 'CEC19B3E7C2C85D6E25A338DEC288282';
464
+
465
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
466
+ const result = handler.process(hexToBytes('00'.repeat(512)));
467
+
468
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
469
+ strictEqual(bytesToHex(result.slice(192, 256)), bk2.toLowerCase());
470
+ strictEqual(bytesToHex(result.slice(256, 320)), bk3.toLowerCase());
471
+ strictEqual(bytesToHex(result.slice(448, 512)), bk4.toLowerCase());
472
+
473
+ const xorResult = new Uint8Array(64);
474
+ for (let i = 0; i < 512; i += 1) {
475
+ xorResult[i % 64] ^= result[i];
476
+ }
477
+
478
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
479
+ });
480
+
481
+ test('Set 6, Vector #0', () => {
482
+ const key = '0053A6F94C9FF24598EB3E91E4378ADD'
483
+ + '3083D6297CCF2275C81B6EC11467BA0D';
484
+ const iv = '0D74DB42A91077DE';
485
+
486
+ const bk1 = 'F5FAD53F79F9DF58C4AEA0D0ED9A9601'
487
+ + 'F278112CA7180D565B420A48019670EA'
488
+ + 'F24CE493A86263F677B46ACE1924773D'
489
+ + '2BB25571E1AA8593758FC382B1280B71';
490
+ const bk2 = 'B70C50139C63332EF6E77AC54338A407'
491
+ + '9B82BEC9F9A403DFEA821B83F7860791'
492
+ + '650EF1B2489D0590B1DE772EEDA4E3BC'
493
+ + 'D60FA7CE9CD623D9D2FD5758B8653E70';
494
+ const bk3 = '81582C65D7562B80AEC2F1A673A9D01C'
495
+ + '9F892A23D4919F6AB47B9154E08E699B'
496
+ + '4117D7C666477B60F8391481682F5D95'
497
+ + 'D96623DBC489D88DAA6956B9F0646B6E';
498
+ const bk4 = 'A13FFA1208F8BF50900886FAAB40FD10'
499
+ + 'E8CAA306E63DF39536A1564FB760B242'
500
+ + 'A9D6A4628CDC878762834E27A541DA2A'
501
+ + '5E3B3445989C76F611E0FEC6D91ACACC';
502
+ const xor = 'C349B6A51A3EC9B712EAED3F90D8BCEE'
503
+ + '69B7628645F251A996F55260C62EF31F'
504
+ + 'D6C6B0AEA94E136C9D984AD2DF3578F7'
505
+ + '8E457527B03A0450580DD874F63B1AB9';
506
+
507
+ const handler = new Salsa20(hexToBytes(key), hexToBytes(iv));
508
+ const result = handler.process(hexToBytes('00'.repeat(131072)));
509
+
510
+ strictEqual(bytesToHex(result.slice(0, 64)), bk1.toLowerCase());
511
+ strictEqual(bytesToHex(result.slice(65472, 65536)), bk2.toLowerCase());
512
+ strictEqual(bytesToHex(result.slice(65536, 65600)), bk3.toLowerCase());
513
+ strictEqual(bytesToHex(result.slice(131008, 131072)), bk4.toLowerCase());
514
+
515
+ const xorResult = new Uint8Array(64);
516
+ for (let i = 0; i < 131072; i += 1) {
517
+ xorResult[i % 64] ^= result[i];
518
+ }
519
+
520
+ strictEqual(bytesToHex(xorResult), xor.toLowerCase());
521
+ });
522
+ });
package/src/utils.ts ADDED
@@ -0,0 +1,77 @@
1
+ const JEDEC = [
2
+ 'B',
3
+ 'KB',
4
+ 'MB',
5
+ 'GB',
6
+ 'TB',
7
+ 'PB',
8
+ 'EB',
9
+ 'ZB',
10
+ 'YB',
11
+ ];
12
+ // Simplified version of https://github.com/avoidwork/filesize.js
13
+ export const formatFileSize = (input: number) => {
14
+ if (Number.isNaN(input)) return '';
15
+
16
+ let size = Number(input);
17
+ const isNegative = size < 0;
18
+ const result = [];
19
+
20
+ // Flipping a negative number to determine the size.
21
+ if (isNegative) size = -size;
22
+
23
+ // Determining the exponent.
24
+ let exponent = Math.floor(Math.log(size) / Math.log(1024));
25
+ if (exponent < 0) exponent = 0;
26
+
27
+ // Exceeding supported length, time to reduce & multiply.
28
+ if (exponent > 8) exponent = 8;
29
+
30
+ // Zero is now a special case because bytes divide by 1.
31
+ if (size === 0) {
32
+ result[0] = 0;
33
+ result[1] = JEDEC[exponent];
34
+ } else {
35
+ const val = size / (2 ** (exponent * 10));
36
+
37
+ result[0] = Number(val.toFixed(exponent > 0 ? 2 : 0));
38
+
39
+ if (result[0] === 1024 && exponent < 8) {
40
+ result[0] = 1;
41
+ exponent += 1;
42
+ }
43
+
44
+ result[1] = JEDEC[exponent];
45
+ }
46
+
47
+ // Decorating a 'diff'.
48
+ if (isNegative) result[0] = -result[0];
49
+
50
+ return result.join(' ');
51
+ };
52
+
53
+ export const resolveCDNHost = async (
54
+ hosts: string[],
55
+ path: string,
56
+ ): Promise<string[]> => {
57
+ const latencies = await Promise.allSettled(
58
+ hosts.map(async (host) => {
59
+ const start = Date.now();
60
+ await fetch(`http://${host}/`);
61
+ const end = Date.now();
62
+ return {
63
+ host,
64
+ latency: end - start,
65
+ };
66
+ }),
67
+ );
68
+
69
+ const resolved = latencies
70
+ .filter((result): result is PromiseFulfilledResult<{
71
+ host: string, latency: number,
72
+ }> => result.status === 'fulfilled')
73
+ .map((result) => result.value)
74
+ .sort((a, b) => a.latency - b.latency);
75
+
76
+ return resolved.map((result) => `http://${result.host}/${path}`);
77
+ };