@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.
- package/dist/adb.d.ts +17 -0
- package/dist/adb.d.ts.map +1 -0
- package/dist/blte.d.ts +25 -0
- package/dist/blte.d.ts.map +1 -0
- package/dist/client.d.ts +84 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/dbd.d.ts +26 -0
- package/dist/dbd.d.ts.map +1 -0
- package/dist/fetcher.d.ts +21 -0
- package/dist/fetcher.d.ts.map +1 -0
- package/dist/index.cjs +72 -107
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -261
- package/dist/index.d.ts.map +1 -0
- package/dist/index.mjs +72 -107
- package/dist/index.mjs.map +1 -0
- package/dist/jenkins96.d.ts +3 -0
- package/dist/jenkins96.d.ts.map +1 -0
- package/dist/parsers/archiveIndex.d.ts +9 -0
- package/dist/parsers/archiveIndex.d.ts.map +1 -0
- package/dist/parsers/config.d.ts +40 -0
- package/dist/parsers/config.d.ts.map +1 -0
- package/dist/parsers/encodingFile.d.ts +11 -0
- package/dist/parsers/encodingFile.d.ts.map +1 -0
- package/dist/parsers/productConfig.d.ts +21 -0
- package/dist/parsers/productConfig.d.ts.map +1 -0
- package/dist/parsers/rootFile.d.ts +45 -0
- package/dist/parsers/rootFile.d.ts.map +1 -0
- package/dist/salsa20.d.ts +14 -0
- package/dist/salsa20.d.ts.map +1 -0
- package/dist/store.d.ts +9 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/test/salsa20.test.d.ts +2 -0
- package/dist/test/salsa20.test.d.ts.map +1 -0
- package/dist/utils.d.ts +3 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/wdc.d.ts +104 -0
- package/dist/wdc.d.ts.map +1 -0
- package/package.json +5 -4
- package/src/adb.ts +70 -0
- package/src/blte.ts +220 -0
- package/src/client.ts +411 -0
- package/src/dbd.ts +427 -0
- package/src/fetcher.ts +223 -0
- package/src/index.ts +44 -0
- package/src/jenkins96.ts +75 -0
- package/src/parsers/archiveIndex.ts +119 -0
- package/src/parsers/config.ts +75 -0
- package/src/parsers/encodingFile.ts +159 -0
- package/src/parsers/productConfig.ts +57 -0
- package/src/parsers/rootFile.ts +172 -0
- package/src/salsa20.ts +143 -0
- package/src/store.ts +37 -0
- package/src/test/salsa20.test.ts +522 -0
- package/src/utils.ts +77 -0
- 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
|
+
};
|