@rhyster/wow-casc-dbc 2.6.18 → 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 +72 -107
  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 +72 -107
  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 +5 -4
  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
+ };