UNPKG

59.6 kBJavaScriptView Raw
1/**
2 * @licstart The following is the entire license notice for the
3 * Javascript code in this page
4 *
5 * Copyright 2018 Mozilla Foundation
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 *
19 * @licend The above is the entire license notice for the
20 * Javascript code in this page
21 */
22"use strict";
23
24Object.defineProperty(exports, "__esModule", {
25 value: true
26});
27exports.calculateSHA512 = exports.calculateSHA384 = exports.calculateSHA256 = exports.calculateMD5 = exports.PDF20 = exports.PDF17 = exports.CipherTransformFactory = exports.ARCFourCipher = exports.AES256Cipher = exports.AES128Cipher = void 0;
28
29var _util = require("../shared/util");
30
31var _primitives = require("./primitives");
32
33var _stream = require("./stream");
34
35function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
36
37function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
38
39function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
40
41function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
42
43function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
44
45function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
46
47function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
48
49function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
50
51function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
52
53var ARCFourCipher = function ARCFourCipherClosure() {
54 function ARCFourCipher(key) {
55 this.a = 0;
56 this.b = 0;
57 var s = new Uint8Array(256);
58 var i,
59 j = 0,
60 tmp,
61 keyLength = key.length;
62
63 for (i = 0; i < 256; ++i) {
64 s[i] = i;
65 }
66
67 for (i = 0; i < 256; ++i) {
68 tmp = s[i];
69 j = j + tmp + key[i % keyLength] & 0xFF;
70 s[i] = s[j];
71 s[j] = tmp;
72 }
73
74 this.s = s;
75 }
76
77 ARCFourCipher.prototype = {
78 encryptBlock: function ARCFourCipher_encryptBlock(data) {
79 var i,
80 n = data.length,
81 tmp,
82 tmp2;
83 var a = this.a,
84 b = this.b,
85 s = this.s;
86 var output = new Uint8Array(n);
87
88 for (i = 0; i < n; ++i) {
89 a = a + 1 & 0xFF;
90 tmp = s[a];
91 b = b + tmp & 0xFF;
92 tmp2 = s[b];
93 s[a] = tmp2;
94 s[b] = tmp;
95 output[i] = data[i] ^ s[tmp + tmp2 & 0xFF];
96 }
97
98 this.a = a;
99 this.b = b;
100 return output;
101 }
102 };
103 ARCFourCipher.prototype.decryptBlock = ARCFourCipher.prototype.encryptBlock;
104 return ARCFourCipher;
105}();
106
107exports.ARCFourCipher = ARCFourCipher;
108
109var calculateMD5 = function calculateMD5Closure() {
110 var r = new Uint8Array([7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 5, 9, 14, 20, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 4, 11, 16, 23, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21, 6, 10, 15, 21]);
111 var k = new Int32Array([-680876936, -389564586, 606105819, -1044525330, -176418897, 1200080426, -1473231341, -45705983, 1770035416, -1958414417, -42063, -1990404162, 1804603682, -40341101, -1502002290, 1236535329, -165796510, -1069501632, 643717713, -373897302, -701558691, 38016083, -660478335, -405537848, 568446438, -1019803690, -187363961, 1163531501, -1444681467, -51403784, 1735328473, -1926607734, -378558, -2022574463, 1839030562, -35309556, -1530992060, 1272893353, -155497632, -1094730640, 681279174, -358537222, -722521979, 76029189, -640364487, -421815835, 530742520, -995338651, -198630844, 1126891415, -1416354905, -57434055, 1700485571, -1894986606, -1051523, -2054922799, 1873313359, -30611744, -1560198380, 1309151649, -145523070, -1120210379, 718787259, -343485551]);
112
113 function hash(data, offset, length) {
114 var h0 = 1732584193,
115 h1 = -271733879,
116 h2 = -1732584194,
117 h3 = 271733878;
118 var paddedLength = length + 72 & ~63;
119 var padded = new Uint8Array(paddedLength);
120 var i, j, n;
121
122 for (i = 0; i < length; ++i) {
123 padded[i] = data[offset++];
124 }
125
126 padded[i++] = 0x80;
127 n = paddedLength - 8;
128
129 while (i < n) {
130 padded[i++] = 0;
131 }
132
133 padded[i++] = length << 3 & 0xFF;
134 padded[i++] = length >> 5 & 0xFF;
135 padded[i++] = length >> 13 & 0xFF;
136 padded[i++] = length >> 21 & 0xFF;
137 padded[i++] = length >>> 29 & 0xFF;
138 padded[i++] = 0;
139 padded[i++] = 0;
140 padded[i++] = 0;
141 var w = new Int32Array(16);
142
143 for (i = 0; i < paddedLength;) {
144 for (j = 0; j < 16; ++j, i += 4) {
145 w[j] = padded[i] | padded[i + 1] << 8 | padded[i + 2] << 16 | padded[i + 3] << 24;
146 }
147
148 var a = h0,
149 b = h1,
150 c = h2,
151 d = h3,
152 f,
153 g;
154
155 for (j = 0; j < 64; ++j) {
156 if (j < 16) {
157 f = b & c | ~b & d;
158 g = j;
159 } else if (j < 32) {
160 f = d & b | ~d & c;
161 g = 5 * j + 1 & 15;
162 } else if (j < 48) {
163 f = b ^ c ^ d;
164 g = 3 * j + 5 & 15;
165 } else {
166 f = c ^ (b | ~d);
167 g = 7 * j & 15;
168 }
169
170 var tmp = d,
171 rotateArg = a + f + k[j] + w[g] | 0,
172 rotate = r[j];
173 d = c;
174 c = b;
175 b = b + (rotateArg << rotate | rotateArg >>> 32 - rotate) | 0;
176 a = tmp;
177 }
178
179 h0 = h0 + a | 0;
180 h1 = h1 + b | 0;
181 h2 = h2 + c | 0;
182 h3 = h3 + d | 0;
183 }
184
185 return new Uint8Array([h0 & 0xFF, h0 >> 8 & 0xFF, h0 >> 16 & 0xFF, h0 >>> 24 & 0xFF, h1 & 0xFF, h1 >> 8 & 0xFF, h1 >> 16 & 0xFF, h1 >>> 24 & 0xFF, h2 & 0xFF, h2 >> 8 & 0xFF, h2 >> 16 & 0xFF, h2 >>> 24 & 0xFF, h3 & 0xFF, h3 >> 8 & 0xFF, h3 >> 16 & 0xFF, h3 >>> 24 & 0xFF]);
186 }
187
188 return hash;
189}();
190
191exports.calculateMD5 = calculateMD5;
192
193var Word64 = function Word64Closure() {
194 function Word64(highInteger, lowInteger) {
195 this.high = highInteger | 0;
196 this.low = lowInteger | 0;
197 }
198
199 Word64.prototype = {
200 and: function Word64_and(word) {
201 this.high &= word.high;
202 this.low &= word.low;
203 },
204 xor: function Word64_xor(word) {
205 this.high ^= word.high;
206 this.low ^= word.low;
207 },
208 or: function Word64_or(word) {
209 this.high |= word.high;
210 this.low |= word.low;
211 },
212 shiftRight: function Word64_shiftRight(places) {
213 if (places >= 32) {
214 this.low = this.high >>> places - 32 | 0;
215 this.high = 0;
216 } else {
217 this.low = this.low >>> places | this.high << 32 - places;
218 this.high = this.high >>> places | 0;
219 }
220 },
221 shiftLeft: function Word64_shiftLeft(places) {
222 if (places >= 32) {
223 this.high = this.low << places - 32;
224 this.low = 0;
225 } else {
226 this.high = this.high << places | this.low >>> 32 - places;
227 this.low = this.low << places;
228 }
229 },
230 rotateRight: function Word64_rotateRight(places) {
231 var low, high;
232
233 if (places & 32) {
234 high = this.low;
235 low = this.high;
236 } else {
237 low = this.low;
238 high = this.high;
239 }
240
241 places &= 31;
242 this.low = low >>> places | high << 32 - places;
243 this.high = high >>> places | low << 32 - places;
244 },
245 not: function Word64_not() {
246 this.high = ~this.high;
247 this.low = ~this.low;
248 },
249 add: function Word64_add(word) {
250 var lowAdd = (this.low >>> 0) + (word.low >>> 0);
251 var highAdd = (this.high >>> 0) + (word.high >>> 0);
252
253 if (lowAdd > 0xFFFFFFFF) {
254 highAdd += 1;
255 }
256
257 this.low = lowAdd | 0;
258 this.high = highAdd | 0;
259 },
260 copyTo: function Word64_copyTo(bytes, offset) {
261 bytes[offset] = this.high >>> 24 & 0xFF;
262 bytes[offset + 1] = this.high >> 16 & 0xFF;
263 bytes[offset + 2] = this.high >> 8 & 0xFF;
264 bytes[offset + 3] = this.high & 0xFF;
265 bytes[offset + 4] = this.low >>> 24 & 0xFF;
266 bytes[offset + 5] = this.low >> 16 & 0xFF;
267 bytes[offset + 6] = this.low >> 8 & 0xFF;
268 bytes[offset + 7] = this.low & 0xFF;
269 },
270 assign: function Word64_assign(word) {
271 this.high = word.high;
272 this.low = word.low;
273 }
274 };
275 return Word64;
276}();
277
278var calculateSHA256 = function calculateSHA256Closure() {
279 function rotr(x, n) {
280 return x >>> n | x << 32 - n;
281 }
282
283 function ch(x, y, z) {
284 return x & y ^ ~x & z;
285 }
286
287 function maj(x, y, z) {
288 return x & y ^ x & z ^ y & z;
289 }
290
291 function sigma(x) {
292 return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
293 }
294
295 function sigmaPrime(x) {
296 return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
297 }
298
299 function littleSigma(x) {
300 return rotr(x, 7) ^ rotr(x, 18) ^ x >>> 3;
301 }
302
303 function littleSigmaPrime(x) {
304 return rotr(x, 17) ^ rotr(x, 19) ^ x >>> 10;
305 }
306
307 var k = [0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2];
308
309 function hash(data, offset, length) {
310 var h0 = 0x6a09e667,
311 h1 = 0xbb67ae85,
312 h2 = 0x3c6ef372,
313 h3 = 0xa54ff53a,
314 h4 = 0x510e527f,
315 h5 = 0x9b05688c,
316 h6 = 0x1f83d9ab,
317 h7 = 0x5be0cd19;
318 var paddedLength = Math.ceil((length + 9) / 64) * 64;
319 var padded = new Uint8Array(paddedLength);
320 var i, j, n;
321
322 for (i = 0; i < length; ++i) {
323 padded[i] = data[offset++];
324 }
325
326 padded[i++] = 0x80;
327 n = paddedLength - 8;
328
329 while (i < n) {
330 padded[i++] = 0;
331 }
332
333 padded[i++] = 0;
334 padded[i++] = 0;
335 padded[i++] = 0;
336 padded[i++] = length >>> 29 & 0xFF;
337 padded[i++] = length >> 21 & 0xFF;
338 padded[i++] = length >> 13 & 0xFF;
339 padded[i++] = length >> 5 & 0xFF;
340 padded[i++] = length << 3 & 0xFF;
341 var w = new Uint32Array(64);
342
343 for (i = 0; i < paddedLength;) {
344 for (j = 0; j < 16; ++j) {
345 w[j] = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
346 i += 4;
347 }
348
349 for (j = 16; j < 64; ++j) {
350 w[j] = littleSigmaPrime(w[j - 2]) + w[j - 7] + littleSigma(w[j - 15]) + w[j - 16] | 0;
351 }
352
353 var a = h0,
354 b = h1,
355 c = h2,
356 d = h3,
357 e = h4,
358 f = h5,
359 g = h6,
360 h = h7,
361 t1,
362 t2;
363
364 for (j = 0; j < 64; ++j) {
365 t1 = h + sigmaPrime(e) + ch(e, f, g) + k[j] + w[j];
366 t2 = sigma(a) + maj(a, b, c);
367 h = g;
368 g = f;
369 f = e;
370 e = d + t1 | 0;
371 d = c;
372 c = b;
373 b = a;
374 a = t1 + t2 | 0;
375 }
376
377 h0 = h0 + a | 0;
378 h1 = h1 + b | 0;
379 h2 = h2 + c | 0;
380 h3 = h3 + d | 0;
381 h4 = h4 + e | 0;
382 h5 = h5 + f | 0;
383 h6 = h6 + g | 0;
384 h7 = h7 + h | 0;
385 }
386
387 return new Uint8Array([h0 >> 24 & 0xFF, h0 >> 16 & 0xFF, h0 >> 8 & 0xFF, h0 & 0xFF, h1 >> 24 & 0xFF, h1 >> 16 & 0xFF, h1 >> 8 & 0xFF, h1 & 0xFF, h2 >> 24 & 0xFF, h2 >> 16 & 0xFF, h2 >> 8 & 0xFF, h2 & 0xFF, h3 >> 24 & 0xFF, h3 >> 16 & 0xFF, h3 >> 8 & 0xFF, h3 & 0xFF, h4 >> 24 & 0xFF, h4 >> 16 & 0xFF, h4 >> 8 & 0xFF, h4 & 0xFF, h5 >> 24 & 0xFF, h5 >> 16 & 0xFF, h5 >> 8 & 0xFF, h5 & 0xFF, h6 >> 24 & 0xFF, h6 >> 16 & 0xFF, h6 >> 8 & 0xFF, h6 & 0xFF, h7 >> 24 & 0xFF, h7 >> 16 & 0xFF, h7 >> 8 & 0xFF, h7 & 0xFF]);
388 }
389
390 return hash;
391}();
392
393exports.calculateSHA256 = calculateSHA256;
394
395var calculateSHA512 = function calculateSHA512Closure() {
396 function ch(result, x, y, z, tmp) {
397 result.assign(x);
398 result.and(y);
399 tmp.assign(x);
400 tmp.not();
401 tmp.and(z);
402 result.xor(tmp);
403 }
404
405 function maj(result, x, y, z, tmp) {
406 result.assign(x);
407 result.and(y);
408 tmp.assign(x);
409 tmp.and(z);
410 result.xor(tmp);
411 tmp.assign(y);
412 tmp.and(z);
413 result.xor(tmp);
414 }
415
416 function sigma(result, x, tmp) {
417 result.assign(x);
418 result.rotateRight(28);
419 tmp.assign(x);
420 tmp.rotateRight(34);
421 result.xor(tmp);
422 tmp.assign(x);
423 tmp.rotateRight(39);
424 result.xor(tmp);
425 }
426
427 function sigmaPrime(result, x, tmp) {
428 result.assign(x);
429 result.rotateRight(14);
430 tmp.assign(x);
431 tmp.rotateRight(18);
432 result.xor(tmp);
433 tmp.assign(x);
434 tmp.rotateRight(41);
435 result.xor(tmp);
436 }
437
438 function littleSigma(result, x, tmp) {
439 result.assign(x);
440 result.rotateRight(1);
441 tmp.assign(x);
442 tmp.rotateRight(8);
443 result.xor(tmp);
444 tmp.assign(x);
445 tmp.shiftRight(7);
446 result.xor(tmp);
447 }
448
449 function littleSigmaPrime(result, x, tmp) {
450 result.assign(x);
451 result.rotateRight(19);
452 tmp.assign(x);
453 tmp.rotateRight(61);
454 result.xor(tmp);
455 tmp.assign(x);
456 tmp.shiftRight(6);
457 result.xor(tmp);
458 }
459
460 var k = [new Word64(0x428a2f98, 0xd728ae22), new Word64(0x71374491, 0x23ef65cd), new Word64(0xb5c0fbcf, 0xec4d3b2f), new Word64(0xe9b5dba5, 0x8189dbbc), new Word64(0x3956c25b, 0xf348b538), new Word64(0x59f111f1, 0xb605d019), new Word64(0x923f82a4, 0xaf194f9b), new Word64(0xab1c5ed5, 0xda6d8118), new Word64(0xd807aa98, 0xa3030242), new Word64(0x12835b01, 0x45706fbe), new Word64(0x243185be, 0x4ee4b28c), new Word64(0x550c7dc3, 0xd5ffb4e2), new Word64(0x72be5d74, 0xf27b896f), new Word64(0x80deb1fe, 0x3b1696b1), new Word64(0x9bdc06a7, 0x25c71235), new Word64(0xc19bf174, 0xcf692694), new Word64(0xe49b69c1, 0x9ef14ad2), new Word64(0xefbe4786, 0x384f25e3), new Word64(0x0fc19dc6, 0x8b8cd5b5), new Word64(0x240ca1cc, 0x77ac9c65), new Word64(0x2de92c6f, 0x592b0275), new Word64(0x4a7484aa, 0x6ea6e483), new Word64(0x5cb0a9dc, 0xbd41fbd4), new Word64(0x76f988da, 0x831153b5), new Word64(0x983e5152, 0xee66dfab), new Word64(0xa831c66d, 0x2db43210), new Word64(0xb00327c8, 0x98fb213f), new Word64(0xbf597fc7, 0xbeef0ee4), new Word64(0xc6e00bf3, 0x3da88fc2), new Word64(0xd5a79147, 0x930aa725), new Word64(0x06ca6351, 0xe003826f), new Word64(0x14292967, 0x0a0e6e70), new Word64(0x27b70a85, 0x46d22ffc), new Word64(0x2e1b2138, 0x5c26c926), new Word64(0x4d2c6dfc, 0x5ac42aed), new Word64(0x53380d13, 0x9d95b3df), new Word64(0x650a7354, 0x8baf63de), new Word64(0x766a0abb, 0x3c77b2a8), new Word64(0x81c2c92e, 0x47edaee6), new Word64(0x92722c85, 0x1482353b), new Word64(0xa2bfe8a1, 0x4cf10364), new Word64(0xa81a664b, 0xbc423001), new Word64(0xc24b8b70, 0xd0f89791), new Word64(0xc76c51a3, 0x0654be30), new Word64(0xd192e819, 0xd6ef5218), new Word64(0xd6990624, 0x5565a910), new Word64(0xf40e3585, 0x5771202a), new Word64(0x106aa070, 0x32bbd1b8), new Word64(0x19a4c116, 0xb8d2d0c8), new Word64(0x1e376c08, 0x5141ab53), new Word64(0x2748774c, 0xdf8eeb99), new Word64(0x34b0bcb5, 0xe19b48a8), new Word64(0x391c0cb3, 0xc5c95a63), new Word64(0x4ed8aa4a, 0xe3418acb), new Word64(0x5b9cca4f, 0x7763e373), new Word64(0x682e6ff3, 0xd6b2b8a3), new Word64(0x748f82ee, 0x5defb2fc), new Word64(0x78a5636f, 0x43172f60), new Word64(0x84c87814, 0xa1f0ab72), new Word64(0x8cc70208, 0x1a6439ec), new Word64(0x90befffa, 0x23631e28), new Word64(0xa4506ceb, 0xde82bde9), new Word64(0xbef9a3f7, 0xb2c67915), new Word64(0xc67178f2, 0xe372532b), new Word64(0xca273ece, 0xea26619c), new Word64(0xd186b8c7, 0x21c0c207), new Word64(0xeada7dd6, 0xcde0eb1e), new Word64(0xf57d4f7f, 0xee6ed178), new Word64(0x06f067aa, 0x72176fba), new Word64(0x0a637dc5, 0xa2c898a6), new Word64(0x113f9804, 0xbef90dae), new Word64(0x1b710b35, 0x131c471b), new Word64(0x28db77f5, 0x23047d84), new Word64(0x32caab7b, 0x40c72493), new Word64(0x3c9ebe0a, 0x15c9bebc), new Word64(0x431d67c4, 0x9c100d4c), new Word64(0x4cc5d4be, 0xcb3e42b6), new Word64(0x597f299c, 0xfc657e2a), new Word64(0x5fcb6fab, 0x3ad6faec), new Word64(0x6c44198c, 0x4a475817)];
461
462 function hash(data, offset, length, mode384) {
463 mode384 = !!mode384;
464 var h0, h1, h2, h3, h4, h5, h6, h7;
465
466 if (!mode384) {
467 h0 = new Word64(0x6a09e667, 0xf3bcc908);
468 h1 = new Word64(0xbb67ae85, 0x84caa73b);
469 h2 = new Word64(0x3c6ef372, 0xfe94f82b);
470 h3 = new Word64(0xa54ff53a, 0x5f1d36f1);
471 h4 = new Word64(0x510e527f, 0xade682d1);
472 h5 = new Word64(0x9b05688c, 0x2b3e6c1f);
473 h6 = new Word64(0x1f83d9ab, 0xfb41bd6b);
474 h7 = new Word64(0x5be0cd19, 0x137e2179);
475 } else {
476 h0 = new Word64(0xcbbb9d5d, 0xc1059ed8);
477 h1 = new Word64(0x629a292a, 0x367cd507);
478 h2 = new Word64(0x9159015a, 0x3070dd17);
479 h3 = new Word64(0x152fecd8, 0xf70e5939);
480 h4 = new Word64(0x67332667, 0xffc00b31);
481 h5 = new Word64(0x8eb44a87, 0x68581511);
482 h6 = new Word64(0xdb0c2e0d, 0x64f98fa7);
483 h7 = new Word64(0x47b5481d, 0xbefa4fa4);
484 }
485
486 var paddedLength = Math.ceil((length + 17) / 128) * 128;
487 var padded = new Uint8Array(paddedLength);
488 var i, j, n;
489
490 for (i = 0; i < length; ++i) {
491 padded[i] = data[offset++];
492 }
493
494 padded[i++] = 0x80;
495 n = paddedLength - 16;
496
497 while (i < n) {
498 padded[i++] = 0;
499 }
500
501 padded[i++] = 0;
502 padded[i++] = 0;
503 padded[i++] = 0;
504 padded[i++] = 0;
505 padded[i++] = 0;
506 padded[i++] = 0;
507 padded[i++] = 0;
508 padded[i++] = 0;
509 padded[i++] = 0;
510 padded[i++] = 0;
511 padded[i++] = 0;
512 padded[i++] = length >>> 29 & 0xFF;
513 padded[i++] = length >> 21 & 0xFF;
514 padded[i++] = length >> 13 & 0xFF;
515 padded[i++] = length >> 5 & 0xFF;
516 padded[i++] = length << 3 & 0xFF;
517 var w = new Array(80);
518
519 for (i = 0; i < 80; i++) {
520 w[i] = new Word64(0, 0);
521 }
522
523 var a = new Word64(0, 0),
524 b = new Word64(0, 0),
525 c = new Word64(0, 0);
526 var d = new Word64(0, 0),
527 e = new Word64(0, 0),
528 f = new Word64(0, 0);
529 var g = new Word64(0, 0),
530 h = new Word64(0, 0);
531 var t1 = new Word64(0, 0),
532 t2 = new Word64(0, 0);
533 var tmp1 = new Word64(0, 0),
534 tmp2 = new Word64(0, 0),
535 tmp3;
536
537 for (i = 0; i < paddedLength;) {
538 for (j = 0; j < 16; ++j) {
539 w[j].high = padded[i] << 24 | padded[i + 1] << 16 | padded[i + 2] << 8 | padded[i + 3];
540 w[j].low = padded[i + 4] << 24 | padded[i + 5] << 16 | padded[i + 6] << 8 | padded[i + 7];
541 i += 8;
542 }
543
544 for (j = 16; j < 80; ++j) {
545 tmp3 = w[j];
546 littleSigmaPrime(tmp3, w[j - 2], tmp2);
547 tmp3.add(w[j - 7]);
548 littleSigma(tmp1, w[j - 15], tmp2);
549 tmp3.add(tmp1);
550 tmp3.add(w[j - 16]);
551 }
552
553 a.assign(h0);
554 b.assign(h1);
555 c.assign(h2);
556 d.assign(h3);
557 e.assign(h4);
558 f.assign(h5);
559 g.assign(h6);
560 h.assign(h7);
561
562 for (j = 0; j < 80; ++j) {
563 t1.assign(h);
564 sigmaPrime(tmp1, e, tmp2);
565 t1.add(tmp1);
566 ch(tmp1, e, f, g, tmp2);
567 t1.add(tmp1);
568 t1.add(k[j]);
569 t1.add(w[j]);
570 sigma(t2, a, tmp2);
571 maj(tmp1, a, b, c, tmp2);
572 t2.add(tmp1);
573 tmp3 = h;
574 h = g;
575 g = f;
576 f = e;
577 d.add(t1);
578 e = d;
579 d = c;
580 c = b;
581 b = a;
582 tmp3.assign(t1);
583 tmp3.add(t2);
584 a = tmp3;
585 }
586
587 h0.add(a);
588 h1.add(b);
589 h2.add(c);
590 h3.add(d);
591 h4.add(e);
592 h5.add(f);
593 h6.add(g);
594 h7.add(h);
595 }
596
597 var result;
598
599 if (!mode384) {
600 result = new Uint8Array(64);
601 h0.copyTo(result, 0);
602 h1.copyTo(result, 8);
603 h2.copyTo(result, 16);
604 h3.copyTo(result, 24);
605 h4.copyTo(result, 32);
606 h5.copyTo(result, 40);
607 h6.copyTo(result, 48);
608 h7.copyTo(result, 56);
609 } else {
610 result = new Uint8Array(48);
611 h0.copyTo(result, 0);
612 h1.copyTo(result, 8);
613 h2.copyTo(result, 16);
614 h3.copyTo(result, 24);
615 h4.copyTo(result, 32);
616 h5.copyTo(result, 40);
617 }
618
619 return result;
620 }
621
622 return hash;
623}();
624
625exports.calculateSHA512 = calculateSHA512;
626
627var calculateSHA384 = function calculateSHA384Closure() {
628 function hash(data, offset, length) {
629 return calculateSHA512(data, offset, length, true);
630 }
631
632 return hash;
633}();
634
635exports.calculateSHA384 = calculateSHA384;
636
637var NullCipher = function NullCipherClosure() {
638 function NullCipher() {}
639
640 NullCipher.prototype = {
641 decryptBlock: function NullCipher_decryptBlock(data) {
642 return data;
643 }
644 };
645 return NullCipher;
646}();
647
648var AESBaseCipher =
649/*#__PURE__*/
650function () {
651 function AESBaseCipher() {
652 _classCallCheck(this, AESBaseCipher);
653
654 if (this.constructor === AESBaseCipher) {
655 (0, _util.unreachable)('Cannot initialize AESBaseCipher.');
656 }
657
658 this._s = new Uint8Array([0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16]);
659 this._inv_s = new Uint8Array([0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e, 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d]);
660 this._mix = new Uint32Array([0x00000000, 0x0e090d0b, 0x1c121a16, 0x121b171d, 0x3824342c, 0x362d3927, 0x24362e3a, 0x2a3f2331, 0x70486858, 0x7e416553, 0x6c5a724e, 0x62537f45, 0x486c5c74, 0x4665517f, 0x547e4662, 0x5a774b69, 0xe090d0b0, 0xee99ddbb, 0xfc82caa6, 0xf28bc7ad, 0xd8b4e49c, 0xd6bde997, 0xc4a6fe8a, 0xcaaff381, 0x90d8b8e8, 0x9ed1b5e3, 0x8ccaa2fe, 0x82c3aff5, 0xa8fc8cc4, 0xa6f581cf, 0xb4ee96d2, 0xbae79bd9, 0xdb3bbb7b, 0xd532b670, 0xc729a16d, 0xc920ac66, 0xe31f8f57, 0xed16825c, 0xff0d9541, 0xf104984a, 0xab73d323, 0xa57ade28, 0xb761c935, 0xb968c43e, 0x9357e70f, 0x9d5eea04, 0x8f45fd19, 0x814cf012, 0x3bab6bcb, 0x35a266c0, 0x27b971dd, 0x29b07cd6, 0x038f5fe7, 0x0d8652ec, 0x1f9d45f1, 0x119448fa, 0x4be30393, 0x45ea0e98, 0x57f11985, 0x59f8148e, 0x73c737bf, 0x7dce3ab4, 0x6fd52da9, 0x61dc20a2, 0xad766df6, 0xa37f60fd, 0xb16477e0, 0xbf6d7aeb, 0x955259da, 0x9b5b54d1, 0x894043cc, 0x87494ec7, 0xdd3e05ae, 0xd33708a5, 0xc12c1fb8, 0xcf2512b3, 0xe51a3182, 0xeb133c89, 0xf9082b94, 0xf701269f, 0x4de6bd46, 0x43efb04d, 0x51f4a750, 0x5ffdaa5b, 0x75c2896a, 0x7bcb8461, 0x69d0937c, 0x67d99e77, 0x3daed51e, 0x33a7d815, 0x21bccf08, 0x2fb5c203, 0x058ae132, 0x0b83ec39, 0x1998fb24, 0x1791f62f, 0x764dd68d, 0x7844db86, 0x6a5fcc9b, 0x6456c190, 0x4e69e2a1, 0x4060efaa, 0x527bf8b7, 0x5c72f5bc, 0x0605bed5, 0x080cb3de, 0x1a17a4c3, 0x141ea9c8, 0x3e218af9, 0x302887f2, 0x223390ef, 0x2c3a9de4, 0x96dd063d, 0x98d40b36, 0x8acf1c2b, 0x84c61120, 0xaef93211, 0xa0f03f1a, 0xb2eb2807, 0xbce2250c, 0xe6956e65, 0xe89c636e, 0xfa877473, 0xf48e7978, 0xdeb15a49, 0xd0b85742, 0xc2a3405f, 0xccaa4d54, 0x41ecdaf7, 0x4fe5d7fc, 0x5dfec0e1, 0x53f7cdea, 0x79c8eedb, 0x77c1e3d0, 0x65daf4cd, 0x6bd3f9c6, 0x31a4b2af, 0x3fadbfa4, 0x2db6a8b9, 0x23bfa5b2, 0x09808683, 0x07898b88, 0x15929c95, 0x1b9b919e, 0xa17c0a47, 0xaf75074c, 0xbd6e1051, 0xb3671d5a, 0x99583e6b, 0x97513360, 0x854a247d, 0x8b432976, 0xd134621f, 0xdf3d6f14, 0xcd267809, 0xc32f7502, 0xe9105633, 0xe7195b38, 0xf5024c25, 0xfb0b412e, 0x9ad7618c, 0x94de6c87, 0x86c57b9a, 0x88cc7691, 0xa2f355a0, 0xacfa58ab, 0xbee14fb6, 0xb0e842bd, 0xea9f09d4, 0xe49604df, 0xf68d13c2, 0xf8841ec9, 0xd2bb3df8, 0xdcb230f3, 0xcea927ee, 0xc0a02ae5, 0x7a47b13c, 0x744ebc37, 0x6655ab2a, 0x685ca621, 0x42638510, 0x4c6a881b, 0x5e719f06, 0x5078920d, 0x0a0fd964, 0x0406d46f, 0x161dc372, 0x1814ce79, 0x322bed48, 0x3c22e043, 0x2e39f75e, 0x2030fa55, 0xec9ab701, 0xe293ba0a, 0xf088ad17, 0xfe81a01c, 0xd4be832d, 0xdab78e26, 0xc8ac993b, 0xc6a59430, 0x9cd2df59, 0x92dbd252, 0x80c0c54f, 0x8ec9c844, 0xa4f6eb75, 0xaaffe67e, 0xb8e4f163, 0xb6edfc68, 0x0c0a67b1, 0x02036aba, 0x10187da7, 0x1e1170ac, 0x342e539d, 0x3a275e96, 0x283c498b, 0x26354480, 0x7c420fe9, 0x724b02e2, 0x605015ff, 0x6e5918f4, 0x44663bc5, 0x4a6f36ce, 0x587421d3, 0x567d2cd8, 0x37a10c7a, 0x39a80171, 0x2bb3166c, 0x25ba1b67, 0x0f853856, 0x018c355d, 0x13972240, 0x1d9e2f4b, 0x47e96422, 0x49e06929, 0x5bfb7e34, 0x55f2733f, 0x7fcd500e, 0x71c45d05, 0x63df4a18, 0x6dd64713, 0xd731dcca, 0xd938d1c1, 0xcb23c6dc, 0xc52acbd7, 0xef15e8e6, 0xe11ce5ed, 0xf307f2f0, 0xfd0efffb, 0xa779b492, 0xa970b999, 0xbb6bae84, 0xb562a38f, 0x9f5d80be, 0x91548db5, 0x834f9aa8, 0x8d4697a3]);
661 this._mixCol = new Uint8Array(256);
662
663 for (var i = 0; i < 256; i++) {
664 if (i < 128) {
665 this._mixCol[i] = i << 1;
666 } else {
667 this._mixCol[i] = i << 1 ^ 0x1b;
668 }
669 }
670
671 this.buffer = new Uint8Array(16);
672 this.bufferPosition = 0;
673 }
674
675 _createClass(AESBaseCipher, [{
676 key: "_expandKey",
677 value: function _expandKey(cipherKey) {
678 (0, _util.unreachable)('Cannot call `_expandKey` on the base class');
679 }
680 }, {
681 key: "_decrypt",
682 value: function _decrypt(input, key) {
683 var t, u, v;
684 var state = new Uint8Array(16);
685 state.set(input);
686
687 for (var j = 0, k = this._keySize; j < 16; ++j, ++k) {
688 state[j] ^= key[k];
689 }
690
691 for (var i = this._cyclesOfRepetition - 1; i >= 1; --i) {
692 t = state[13];
693 state[13] = state[9];
694 state[9] = state[5];
695 state[5] = state[1];
696 state[1] = t;
697 t = state[14];
698 u = state[10];
699 state[14] = state[6];
700 state[10] = state[2];
701 state[6] = t;
702 state[2] = u;
703 t = state[15];
704 u = state[11];
705 v = state[7];
706 state[15] = state[3];
707 state[11] = t;
708 state[7] = u;
709 state[3] = v;
710
711 for (var _j = 0; _j < 16; ++_j) {
712 state[_j] = this._inv_s[state[_j]];
713 }
714
715 for (var _j2 = 0, _k = i * 16; _j2 < 16; ++_j2, ++_k) {
716 state[_j2] ^= key[_k];
717 }
718
719 for (var _j3 = 0; _j3 < 16; _j3 += 4) {
720 var s0 = this._mix[state[_j3]];
721 var s1 = this._mix[state[_j3 + 1]];
722 var s2 = this._mix[state[_j3 + 2]];
723 var s3 = this._mix[state[_j3 + 3]];
724 t = s0 ^ s1 >>> 8 ^ s1 << 24 ^ s2 >>> 16 ^ s2 << 16 ^ s3 >>> 24 ^ s3 << 8;
725 state[_j3] = t >>> 24 & 0xFF;
726 state[_j3 + 1] = t >> 16 & 0xFF;
727 state[_j3 + 2] = t >> 8 & 0xFF;
728 state[_j3 + 3] = t & 0xFF;
729 }
730 }
731
732 t = state[13];
733 state[13] = state[9];
734 state[9] = state[5];
735 state[5] = state[1];
736 state[1] = t;
737 t = state[14];
738 u = state[10];
739 state[14] = state[6];
740 state[10] = state[2];
741 state[6] = t;
742 state[2] = u;
743 t = state[15];
744 u = state[11];
745 v = state[7];
746 state[15] = state[3];
747 state[11] = t;
748 state[7] = u;
749 state[3] = v;
750
751 for (var _j4 = 0; _j4 < 16; ++_j4) {
752 state[_j4] = this._inv_s[state[_j4]];
753 state[_j4] ^= key[_j4];
754 }
755
756 return state;
757 }
758 }, {
759 key: "_encrypt",
760 value: function _encrypt(input, key) {
761 var s = this._s;
762 var t, u, v;
763 var state = new Uint8Array(16);
764 state.set(input);
765
766 for (var j = 0; j < 16; ++j) {
767 state[j] ^= key[j];
768 }
769
770 for (var i = 1; i < this._cyclesOfRepetition; i++) {
771 for (var _j5 = 0; _j5 < 16; ++_j5) {
772 state[_j5] = s[state[_j5]];
773 }
774
775 v = state[1];
776 state[1] = state[5];
777 state[5] = state[9];
778 state[9] = state[13];
779 state[13] = v;
780 v = state[2];
781 u = state[6];
782 state[2] = state[10];
783 state[6] = state[14];
784 state[10] = v;
785 state[14] = u;
786 v = state[3];
787 u = state[7];
788 t = state[11];
789 state[3] = state[15];
790 state[7] = v;
791 state[11] = u;
792 state[15] = t;
793
794 for (var _j6 = 0; _j6 < 16; _j6 += 4) {
795 var s0 = state[_j6 + 0];
796 var s1 = state[_j6 + 1];
797 var s2 = state[_j6 + 2];
798 var s3 = state[_j6 + 3];
799 t = s0 ^ s1 ^ s2 ^ s3;
800 state[_j6 + 0] ^= t ^ this._mixCol[s0 ^ s1];
801 state[_j6 + 1] ^= t ^ this._mixCol[s1 ^ s2];
802 state[_j6 + 2] ^= t ^ this._mixCol[s2 ^ s3];
803 state[_j6 + 3] ^= t ^ this._mixCol[s3 ^ s0];
804 }
805
806 for (var _j7 = 0, k = i * 16; _j7 < 16; ++_j7, ++k) {
807 state[_j7] ^= key[k];
808 }
809 }
810
811 for (var _j8 = 0; _j8 < 16; ++_j8) {
812 state[_j8] = s[state[_j8]];
813 }
814
815 v = state[1];
816 state[1] = state[5];
817 state[5] = state[9];
818 state[9] = state[13];
819 state[13] = v;
820 v = state[2];
821 u = state[6];
822 state[2] = state[10];
823 state[6] = state[14];
824 state[10] = v;
825 state[14] = u;
826 v = state[3];
827 u = state[7];
828 t = state[11];
829 state[3] = state[15];
830 state[7] = v;
831 state[11] = u;
832 state[15] = t;
833
834 for (var _j9 = 0, _k2 = this._keySize; _j9 < 16; ++_j9, ++_k2) {
835 state[_j9] ^= key[_k2];
836 }
837
838 return state;
839 }
840 }, {
841 key: "_decryptBlock2",
842 value: function _decryptBlock2(data, finalize) {
843 var sourceLength = data.length;
844 var buffer = this.buffer,
845 bufferLength = this.bufferPosition;
846 var result = [],
847 iv = this.iv;
848
849 for (var i = 0; i < sourceLength; ++i) {
850 buffer[bufferLength] = data[i];
851 ++bufferLength;
852
853 if (bufferLength < 16) {
854 continue;
855 }
856
857 var plain = this._decrypt(buffer, this._key);
858
859 for (var j = 0; j < 16; ++j) {
860 plain[j] ^= iv[j];
861 }
862
863 iv = buffer;
864 result.push(plain);
865 buffer = new Uint8Array(16);
866 bufferLength = 0;
867 }
868
869 this.buffer = buffer;
870 this.bufferLength = bufferLength;
871 this.iv = iv;
872
873 if (result.length === 0) {
874 return new Uint8Array(0);
875 }
876
877 var outputLength = 16 * result.length;
878
879 if (finalize) {
880 var lastBlock = result[result.length - 1];
881 var psLen = lastBlock[15];
882
883 if (psLen <= 16) {
884 for (var _i = 15, ii = 16 - psLen; _i >= ii; --_i) {
885 if (lastBlock[_i] !== psLen) {
886 psLen = 0;
887 break;
888 }
889 }
890
891 outputLength -= psLen;
892 result[result.length - 1] = lastBlock.subarray(0, 16 - psLen);
893 }
894 }
895
896 var output = new Uint8Array(outputLength);
897
898 for (var _i2 = 0, _j10 = 0, _ii = result.length; _i2 < _ii; ++_i2, _j10 += 16) {
899 output.set(result[_i2], _j10);
900 }
901
902 return output;
903 }
904 }, {
905 key: "decryptBlock",
906 value: function decryptBlock(data, finalize) {
907 var iv = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
908 var sourceLength = data.length;
909 var buffer = this.buffer,
910 bufferLength = this.bufferPosition;
911
912 if (iv) {
913 this.iv = iv;
914 } else {
915 for (var i = 0; bufferLength < 16 && i < sourceLength; ++i, ++bufferLength) {
916 buffer[bufferLength] = data[i];
917 }
918
919 if (bufferLength < 16) {
920 this.bufferLength = bufferLength;
921 return new Uint8Array(0);
922 }
923
924 this.iv = buffer;
925 data = data.subarray(16);
926 }
927
928 this.buffer = new Uint8Array(16);
929 this.bufferLength = 0;
930 this.decryptBlock = this._decryptBlock2;
931 return this.decryptBlock(data, finalize);
932 }
933 }, {
934 key: "encrypt",
935 value: function encrypt(data, iv) {
936 var sourceLength = data.length;
937 var buffer = this.buffer,
938 bufferLength = this.bufferPosition;
939 var result = [];
940
941 if (!iv) {
942 iv = new Uint8Array(16);
943 }
944
945 for (var i = 0; i < sourceLength; ++i) {
946 buffer[bufferLength] = data[i];
947 ++bufferLength;
948
949 if (bufferLength < 16) {
950 continue;
951 }
952
953 for (var j = 0; j < 16; ++j) {
954 buffer[j] ^= iv[j];
955 }
956
957 var cipher = this._encrypt(buffer, this._key);
958
959 iv = cipher;
960 result.push(cipher);
961 buffer = new Uint8Array(16);
962 bufferLength = 0;
963 }
964
965 this.buffer = buffer;
966 this.bufferLength = bufferLength;
967 this.iv = iv;
968
969 if (result.length === 0) {
970 return new Uint8Array(0);
971 }
972
973 var outputLength = 16 * result.length;
974 var output = new Uint8Array(outputLength);
975
976 for (var _i3 = 0, _j11 = 0, ii = result.length; _i3 < ii; ++_i3, _j11 += 16) {
977 output.set(result[_i3], _j11);
978 }
979
980 return output;
981 }
982 }]);
983
984 return AESBaseCipher;
985}();
986
987var AES128Cipher =
988/*#__PURE__*/
989function (_AESBaseCipher) {
990 _inherits(AES128Cipher, _AESBaseCipher);
991
992 function AES128Cipher(key) {
993 var _this;
994
995 _classCallCheck(this, AES128Cipher);
996
997 _this = _possibleConstructorReturn(this, _getPrototypeOf(AES128Cipher).call(this));
998 _this._cyclesOfRepetition = 10;
999 _this._keySize = 160;
1000 _this._rcon = new Uint8Array([0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d]);
1001 _this._key = _this._expandKey(key);
1002 return _this;
1003 }
1004
1005 _createClass(AES128Cipher, [{
1006 key: "_expandKey",
1007 value: function _expandKey(cipherKey) {
1008 var b = 176;
1009 var s = this._s;
1010 var rcon = this._rcon;
1011 var result = new Uint8Array(b);
1012 result.set(cipherKey);
1013
1014 for (var j = 16, i = 1; j < b; ++i) {
1015 var t1 = result[j - 3];
1016 var t2 = result[j - 2];
1017 var t3 = result[j - 1];
1018 var t4 = result[j - 4];
1019 t1 = s[t1];
1020 t2 = s[t2];
1021 t3 = s[t3];
1022 t4 = s[t4];
1023 t1 = t1 ^ rcon[i];
1024
1025 for (var n = 0; n < 4; ++n) {
1026 result[j] = t1 ^= result[j - 16];
1027 j++;
1028 result[j] = t2 ^= result[j - 16];
1029 j++;
1030 result[j] = t3 ^= result[j - 16];
1031 j++;
1032 result[j] = t4 ^= result[j - 16];
1033 j++;
1034 }
1035 }
1036
1037 return result;
1038 }
1039 }]);
1040
1041 return AES128Cipher;
1042}(AESBaseCipher);
1043
1044exports.AES128Cipher = AES128Cipher;
1045
1046var AES256Cipher =
1047/*#__PURE__*/
1048function (_AESBaseCipher2) {
1049 _inherits(AES256Cipher, _AESBaseCipher2);
1050
1051 function AES256Cipher(key) {
1052 var _this2;
1053
1054 _classCallCheck(this, AES256Cipher);
1055
1056 _this2 = _possibleConstructorReturn(this, _getPrototypeOf(AES256Cipher).call(this));
1057 _this2._cyclesOfRepetition = 14;
1058 _this2._keySize = 224;
1059 _this2._key = _this2._expandKey(key);
1060 return _this2;
1061 }
1062
1063 _createClass(AES256Cipher, [{
1064 key: "_expandKey",
1065 value: function _expandKey(cipherKey) {
1066 var b = 240;
1067 var s = this._s;
1068 var result = new Uint8Array(b);
1069 result.set(cipherKey);
1070 var r = 1;
1071 var t1, t2, t3, t4;
1072
1073 for (var j = 32, i = 1; j < b; ++i) {
1074 if (j % 32 === 16) {
1075 t1 = s[t1];
1076 t2 = s[t2];
1077 t3 = s[t3];
1078 t4 = s[t4];
1079 } else if (j % 32 === 0) {
1080 t1 = result[j - 3];
1081 t2 = result[j - 2];
1082 t3 = result[j - 1];
1083 t4 = result[j - 4];
1084 t1 = s[t1];
1085 t2 = s[t2];
1086 t3 = s[t3];
1087 t4 = s[t4];
1088 t1 = t1 ^ r;
1089
1090 if ((r <<= 1) >= 256) {
1091 r = (r ^ 0x1b) & 0xFF;
1092 }
1093 }
1094
1095 for (var n = 0; n < 4; ++n) {
1096 result[j] = t1 ^= result[j - 32];
1097 j++;
1098 result[j] = t2 ^= result[j - 32];
1099 j++;
1100 result[j] = t3 ^= result[j - 32];
1101 j++;
1102 result[j] = t4 ^= result[j - 32];
1103 j++;
1104 }
1105 }
1106
1107 return result;
1108 }
1109 }]);
1110
1111 return AES256Cipher;
1112}(AESBaseCipher);
1113
1114exports.AES256Cipher = AES256Cipher;
1115
1116var PDF17 = function PDF17Closure() {
1117 function compareByteArrays(array1, array2) {
1118 if (array1.length !== array2.length) {
1119 return false;
1120 }
1121
1122 for (var i = 0; i < array1.length; i++) {
1123 if (array1[i] !== array2[i]) {
1124 return false;
1125 }
1126 }
1127
1128 return true;
1129 }
1130
1131 function PDF17() {}
1132
1133 PDF17.prototype = {
1134 checkOwnerPassword: function PDF17_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
1135 var hashData = new Uint8Array(password.length + 56);
1136 hashData.set(password, 0);
1137 hashData.set(ownerValidationSalt, password.length);
1138 hashData.set(userBytes, password.length + ownerValidationSalt.length);
1139 var result = calculateSHA256(hashData, 0, hashData.length);
1140 return compareByteArrays(result, ownerPassword);
1141 },
1142 checkUserPassword: function PDF17_checkUserPassword(password, userValidationSalt, userPassword) {
1143 var hashData = new Uint8Array(password.length + 8);
1144 hashData.set(password, 0);
1145 hashData.set(userValidationSalt, password.length);
1146 var result = calculateSHA256(hashData, 0, hashData.length);
1147 return compareByteArrays(result, userPassword);
1148 },
1149 getOwnerKey: function PDF17_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
1150 var hashData = new Uint8Array(password.length + 56);
1151 hashData.set(password, 0);
1152 hashData.set(ownerKeySalt, password.length);
1153 hashData.set(userBytes, password.length + ownerKeySalt.length);
1154 var key = calculateSHA256(hashData, 0, hashData.length);
1155 var cipher = new AES256Cipher(key);
1156 return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
1157 },
1158 getUserKey: function PDF17_getUserKey(password, userKeySalt, userEncryption) {
1159 var hashData = new Uint8Array(password.length + 8);
1160 hashData.set(password, 0);
1161 hashData.set(userKeySalt, password.length);
1162 var key = calculateSHA256(hashData, 0, hashData.length);
1163 var cipher = new AES256Cipher(key);
1164 return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
1165 }
1166 };
1167 return PDF17;
1168}();
1169
1170exports.PDF17 = PDF17;
1171
1172var PDF20 = function PDF20Closure() {
1173 function concatArrays(array1, array2) {
1174 var t = new Uint8Array(array1.length + array2.length);
1175 t.set(array1, 0);
1176 t.set(array2, array1.length);
1177 return t;
1178 }
1179
1180 function calculatePDF20Hash(password, input, userBytes) {
1181 var k = calculateSHA256(input, 0, input.length).subarray(0, 32);
1182 var e = [0];
1183 var i = 0;
1184
1185 while (i < 64 || e[e.length - 1] > i - 32) {
1186 var arrayLength = password.length + k.length + userBytes.length;
1187 var k1 = new Uint8Array(arrayLength * 64);
1188 var array = concatArrays(password, k);
1189 array = concatArrays(array, userBytes);
1190
1191 for (var j = 0, pos = 0; j < 64; j++, pos += arrayLength) {
1192 k1.set(array, pos);
1193 }
1194
1195 var cipher = new AES128Cipher(k.subarray(0, 16));
1196 e = cipher.encrypt(k1, k.subarray(16, 32));
1197 var remainder = 0;
1198
1199 for (var z = 0; z < 16; z++) {
1200 remainder *= 256 % 3;
1201 remainder %= 3;
1202 remainder += (e[z] >>> 0) % 3;
1203 remainder %= 3;
1204 }
1205
1206 if (remainder === 0) {
1207 k = calculateSHA256(e, 0, e.length);
1208 } else if (remainder === 1) {
1209 k = calculateSHA384(e, 0, e.length);
1210 } else if (remainder === 2) {
1211 k = calculateSHA512(e, 0, e.length);
1212 }
1213
1214 i++;
1215 }
1216
1217 return k.subarray(0, 32);
1218 }
1219
1220 function PDF20() {}
1221
1222 function compareByteArrays(array1, array2) {
1223 if (array1.length !== array2.length) {
1224 return false;
1225 }
1226
1227 for (var i = 0; i < array1.length; i++) {
1228 if (array1[i] !== array2[i]) {
1229 return false;
1230 }
1231 }
1232
1233 return true;
1234 }
1235
1236 PDF20.prototype = {
1237 hash: function PDF20_hash(password, concatBytes, userBytes) {
1238 return calculatePDF20Hash(password, concatBytes, userBytes);
1239 },
1240 checkOwnerPassword: function PDF20_checkOwnerPassword(password, ownerValidationSalt, userBytes, ownerPassword) {
1241 var hashData = new Uint8Array(password.length + 56);
1242 hashData.set(password, 0);
1243 hashData.set(ownerValidationSalt, password.length);
1244 hashData.set(userBytes, password.length + ownerValidationSalt.length);
1245 var result = calculatePDF20Hash(password, hashData, userBytes);
1246 return compareByteArrays(result, ownerPassword);
1247 },
1248 checkUserPassword: function PDF20_checkUserPassword(password, userValidationSalt, userPassword) {
1249 var hashData = new Uint8Array(password.length + 8);
1250 hashData.set(password, 0);
1251 hashData.set(userValidationSalt, password.length);
1252 var result = calculatePDF20Hash(password, hashData, []);
1253 return compareByteArrays(result, userPassword);
1254 },
1255 getOwnerKey: function PDF20_getOwnerKey(password, ownerKeySalt, userBytes, ownerEncryption) {
1256 var hashData = new Uint8Array(password.length + 56);
1257 hashData.set(password, 0);
1258 hashData.set(ownerKeySalt, password.length);
1259 hashData.set(userBytes, password.length + ownerKeySalt.length);
1260 var key = calculatePDF20Hash(password, hashData, userBytes);
1261 var cipher = new AES256Cipher(key);
1262 return cipher.decryptBlock(ownerEncryption, false, new Uint8Array(16));
1263 },
1264 getUserKey: function PDF20_getUserKey(password, userKeySalt, userEncryption) {
1265 var hashData = new Uint8Array(password.length + 8);
1266 hashData.set(password, 0);
1267 hashData.set(userKeySalt, password.length);
1268 var key = calculatePDF20Hash(password, hashData, []);
1269 var cipher = new AES256Cipher(key);
1270 return cipher.decryptBlock(userEncryption, false, new Uint8Array(16));
1271 }
1272 };
1273 return PDF20;
1274}();
1275
1276exports.PDF20 = PDF20;
1277
1278var CipherTransform = function CipherTransformClosure() {
1279 function CipherTransform(stringCipherConstructor, streamCipherConstructor) {
1280 this.StringCipherConstructor = stringCipherConstructor;
1281 this.StreamCipherConstructor = streamCipherConstructor;
1282 }
1283
1284 CipherTransform.prototype = {
1285 createStream: function CipherTransform_createStream(stream, length) {
1286 var cipher = new this.StreamCipherConstructor();
1287 return new _stream.DecryptStream(stream, length, function cipherTransformDecryptStream(data, finalize) {
1288 return cipher.decryptBlock(data, finalize);
1289 });
1290 },
1291 decryptString: function CipherTransform_decryptString(s) {
1292 var cipher = new this.StringCipherConstructor();
1293 var data = (0, _util.stringToBytes)(s);
1294 data = cipher.decryptBlock(data, true);
1295 return (0, _util.bytesToString)(data);
1296 }
1297 };
1298 return CipherTransform;
1299}();
1300
1301var CipherTransformFactory = function CipherTransformFactoryClosure() {
1302 var defaultPasswordBytes = new Uint8Array([0x28, 0xBF, 0x4E, 0x5E, 0x4E, 0x75, 0x8A, 0x41, 0x64, 0x00, 0x4E, 0x56, 0xFF, 0xFA, 0x01, 0x08, 0x2E, 0x2E, 0x00, 0xB6, 0xD0, 0x68, 0x3E, 0x80, 0x2F, 0x0C, 0xA9, 0xFE, 0x64, 0x53, 0x69, 0x7A]);
1303
1304 function createEncryptionKey20(revision, password, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms) {
1305 if (password) {
1306 var passwordLength = Math.min(127, password.length);
1307 password = password.subarray(0, passwordLength);
1308 } else {
1309 password = [];
1310 }
1311
1312 var pdfAlgorithm;
1313
1314 if (revision === 6) {
1315 pdfAlgorithm = new PDF20();
1316 } else {
1317 pdfAlgorithm = new PDF17();
1318 }
1319
1320 if (pdfAlgorithm.checkUserPassword(password, userValidationSalt, userPassword)) {
1321 return pdfAlgorithm.getUserKey(password, userKeySalt, userEncryption);
1322 } else if (password.length && pdfAlgorithm.checkOwnerPassword(password, ownerValidationSalt, uBytes, ownerPassword)) {
1323 return pdfAlgorithm.getOwnerKey(password, ownerKeySalt, uBytes, ownerEncryption);
1324 }
1325
1326 return null;
1327 }
1328
1329 function prepareKeyData(fileId, password, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata) {
1330 var hashDataSize = 40 + ownerPassword.length + fileId.length;
1331 var hashData = new Uint8Array(hashDataSize),
1332 i = 0,
1333 j,
1334 n;
1335
1336 if (password) {
1337 n = Math.min(32, password.length);
1338
1339 for (; i < n; ++i) {
1340 hashData[i] = password[i];
1341 }
1342 }
1343
1344 j = 0;
1345
1346 while (i < 32) {
1347 hashData[i++] = defaultPasswordBytes[j++];
1348 }
1349
1350 for (j = 0, n = ownerPassword.length; j < n; ++j) {
1351 hashData[i++] = ownerPassword[j];
1352 }
1353
1354 hashData[i++] = flags & 0xFF;
1355 hashData[i++] = flags >> 8 & 0xFF;
1356 hashData[i++] = flags >> 16 & 0xFF;
1357 hashData[i++] = flags >>> 24 & 0xFF;
1358
1359 for (j = 0, n = fileId.length; j < n; ++j) {
1360 hashData[i++] = fileId[j];
1361 }
1362
1363 if (revision >= 4 && !encryptMetadata) {
1364 hashData[i++] = 0xFF;
1365 hashData[i++] = 0xFF;
1366 hashData[i++] = 0xFF;
1367 hashData[i++] = 0xFF;
1368 }
1369
1370 var hash = calculateMD5(hashData, 0, i);
1371 var keyLengthInBytes = keyLength >> 3;
1372
1373 if (revision >= 3) {
1374 for (j = 0; j < 50; ++j) {
1375 hash = calculateMD5(hash, 0, keyLengthInBytes);
1376 }
1377 }
1378
1379 var encryptionKey = hash.subarray(0, keyLengthInBytes);
1380 var cipher, checkData;
1381
1382 if (revision >= 3) {
1383 for (i = 0; i < 32; ++i) {
1384 hashData[i] = defaultPasswordBytes[i];
1385 }
1386
1387 for (j = 0, n = fileId.length; j < n; ++j) {
1388 hashData[i++] = fileId[j];
1389 }
1390
1391 cipher = new ARCFourCipher(encryptionKey);
1392 checkData = cipher.encryptBlock(calculateMD5(hashData, 0, i));
1393 n = encryptionKey.length;
1394 var derivedKey = new Uint8Array(n),
1395 k;
1396
1397 for (j = 1; j <= 19; ++j) {
1398 for (k = 0; k < n; ++k) {
1399 derivedKey[k] = encryptionKey[k] ^ j;
1400 }
1401
1402 cipher = new ARCFourCipher(derivedKey);
1403 checkData = cipher.encryptBlock(checkData);
1404 }
1405
1406 for (j = 0, n = checkData.length; j < n; ++j) {
1407 if (userPassword[j] !== checkData[j]) {
1408 return null;
1409 }
1410 }
1411 } else {
1412 cipher = new ARCFourCipher(encryptionKey);
1413 checkData = cipher.encryptBlock(defaultPasswordBytes);
1414
1415 for (j = 0, n = checkData.length; j < n; ++j) {
1416 if (userPassword[j] !== checkData[j]) {
1417 return null;
1418 }
1419 }
1420 }
1421
1422 return encryptionKey;
1423 }
1424
1425 function decodeUserPassword(password, ownerPassword, revision, keyLength) {
1426 var hashData = new Uint8Array(32),
1427 i = 0,
1428 j,
1429 n;
1430 n = Math.min(32, password.length);
1431
1432 for (; i < n; ++i) {
1433 hashData[i] = password[i];
1434 }
1435
1436 j = 0;
1437
1438 while (i < 32) {
1439 hashData[i++] = defaultPasswordBytes[j++];
1440 }
1441
1442 var hash = calculateMD5(hashData, 0, i);
1443 var keyLengthInBytes = keyLength >> 3;
1444
1445 if (revision >= 3) {
1446 for (j = 0; j < 50; ++j) {
1447 hash = calculateMD5(hash, 0, hash.length);
1448 }
1449 }
1450
1451 var cipher, userPassword;
1452
1453 if (revision >= 3) {
1454 userPassword = ownerPassword;
1455 var derivedKey = new Uint8Array(keyLengthInBytes),
1456 k;
1457
1458 for (j = 19; j >= 0; j--) {
1459 for (k = 0; k < keyLengthInBytes; ++k) {
1460 derivedKey[k] = hash[k] ^ j;
1461 }
1462
1463 cipher = new ARCFourCipher(derivedKey);
1464 userPassword = cipher.encryptBlock(userPassword);
1465 }
1466 } else {
1467 cipher = new ARCFourCipher(hash.subarray(0, keyLengthInBytes));
1468 userPassword = cipher.encryptBlock(ownerPassword);
1469 }
1470
1471 return userPassword;
1472 }
1473
1474 var identityName = _primitives.Name.get('Identity');
1475
1476 function CipherTransformFactory(dict, fileId, password) {
1477 var filter = dict.get('Filter');
1478
1479 if (!(0, _primitives.isName)(filter, 'Standard')) {
1480 throw new _util.FormatError('unknown encryption method');
1481 }
1482
1483 this.dict = dict;
1484 var algorithm = dict.get('V');
1485
1486 if (!Number.isInteger(algorithm) || algorithm !== 1 && algorithm !== 2 && algorithm !== 4 && algorithm !== 5) {
1487 throw new _util.FormatError('unsupported encryption algorithm');
1488 }
1489
1490 this.algorithm = algorithm;
1491 var keyLength = dict.get('Length');
1492
1493 if (!keyLength) {
1494 if (algorithm <= 3) {
1495 keyLength = 40;
1496 } else {
1497 var cfDict = dict.get('CF');
1498 var streamCryptoName = dict.get('StmF');
1499
1500 if ((0, _primitives.isDict)(cfDict) && (0, _primitives.isName)(streamCryptoName)) {
1501 cfDict.suppressEncryption = true;
1502 var handlerDict = cfDict.get(streamCryptoName.name);
1503 keyLength = handlerDict && handlerDict.get('Length') || 128;
1504
1505 if (keyLength < 40) {
1506 keyLength <<= 3;
1507 }
1508 }
1509 }
1510 }
1511
1512 if (!Number.isInteger(keyLength) || keyLength < 40 || keyLength % 8 !== 0) {
1513 throw new _util.FormatError('invalid key length');
1514 }
1515
1516 var ownerPassword = (0, _util.stringToBytes)(dict.get('O')).subarray(0, 32);
1517 var userPassword = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 32);
1518 var flags = dict.get('P');
1519 var revision = dict.get('R');
1520 var encryptMetadata = (algorithm === 4 || algorithm === 5) && dict.get('EncryptMetadata') !== false;
1521 this.encryptMetadata = encryptMetadata;
1522 var fileIdBytes = (0, _util.stringToBytes)(fileId);
1523 var passwordBytes;
1524
1525 if (password) {
1526 if (revision === 6) {
1527 try {
1528 password = (0, _util.utf8StringToString)(password);
1529 } catch (ex) {
1530 (0, _util.warn)('CipherTransformFactory: ' + 'Unable to convert UTF8 encoded password.');
1531 }
1532 }
1533
1534 passwordBytes = (0, _util.stringToBytes)(password);
1535 }
1536
1537 var encryptionKey;
1538
1539 if (algorithm !== 5) {
1540 encryptionKey = prepareKeyData(fileIdBytes, passwordBytes, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
1541 } else {
1542 var ownerValidationSalt = (0, _util.stringToBytes)(dict.get('O')).subarray(32, 40);
1543 var ownerKeySalt = (0, _util.stringToBytes)(dict.get('O')).subarray(40, 48);
1544 var uBytes = (0, _util.stringToBytes)(dict.get('U')).subarray(0, 48);
1545 var userValidationSalt = (0, _util.stringToBytes)(dict.get('U')).subarray(32, 40);
1546 var userKeySalt = (0, _util.stringToBytes)(dict.get('U')).subarray(40, 48);
1547 var ownerEncryption = (0, _util.stringToBytes)(dict.get('OE'));
1548 var userEncryption = (0, _util.stringToBytes)(dict.get('UE'));
1549 var perms = (0, _util.stringToBytes)(dict.get('Perms'));
1550 encryptionKey = createEncryptionKey20(revision, passwordBytes, ownerPassword, ownerValidationSalt, ownerKeySalt, uBytes, userPassword, userValidationSalt, userKeySalt, ownerEncryption, userEncryption, perms);
1551 }
1552
1553 if (!encryptionKey && !password) {
1554 throw new _util.PasswordException('No password given', _util.PasswordResponses.NEED_PASSWORD);
1555 } else if (!encryptionKey && password) {
1556 var decodedPassword = decodeUserPassword(passwordBytes, ownerPassword, revision, keyLength);
1557 encryptionKey = prepareKeyData(fileIdBytes, decodedPassword, ownerPassword, userPassword, flags, revision, keyLength, encryptMetadata);
1558 }
1559
1560 if (!encryptionKey) {
1561 throw new _util.PasswordException('Incorrect Password', _util.PasswordResponses.INCORRECT_PASSWORD);
1562 }
1563
1564 this.encryptionKey = encryptionKey;
1565
1566 if (algorithm >= 4) {
1567 var cf = dict.get('CF');
1568
1569 if ((0, _primitives.isDict)(cf)) {
1570 cf.suppressEncryption = true;
1571 }
1572
1573 this.cf = cf;
1574 this.stmf = dict.get('StmF') || identityName;
1575 this.strf = dict.get('StrF') || identityName;
1576 this.eff = dict.get('EFF') || this.stmf;
1577 }
1578 }
1579
1580 function buildObjectKey(num, gen, encryptionKey, isAes) {
1581 var key = new Uint8Array(encryptionKey.length + 9),
1582 i,
1583 n;
1584
1585 for (i = 0, n = encryptionKey.length; i < n; ++i) {
1586 key[i] = encryptionKey[i];
1587 }
1588
1589 key[i++] = num & 0xFF;
1590 key[i++] = num >> 8 & 0xFF;
1591 key[i++] = num >> 16 & 0xFF;
1592 key[i++] = gen & 0xFF;
1593 key[i++] = gen >> 8 & 0xFF;
1594
1595 if (isAes) {
1596 key[i++] = 0x73;
1597 key[i++] = 0x41;
1598 key[i++] = 0x6C;
1599 key[i++] = 0x54;
1600 }
1601
1602 var hash = calculateMD5(key, 0, i);
1603 return hash.subarray(0, Math.min(encryptionKey.length + 5, 16));
1604 }
1605
1606 function buildCipherConstructor(cf, name, num, gen, key) {
1607 if (!(0, _primitives.isName)(name)) {
1608 throw new _util.FormatError('Invalid crypt filter name.');
1609 }
1610
1611 var cryptFilter = cf.get(name.name);
1612 var cfm;
1613
1614 if (cryptFilter !== null && cryptFilter !== undefined) {
1615 cfm = cryptFilter.get('CFM');
1616 }
1617
1618 if (!cfm || cfm.name === 'None') {
1619 return function cipherTransformFactoryBuildCipherConstructorNone() {
1620 return new NullCipher();
1621 };
1622 }
1623
1624 if (cfm.name === 'V2') {
1625 return function cipherTransformFactoryBuildCipherConstructorV2() {
1626 return new ARCFourCipher(buildObjectKey(num, gen, key, false));
1627 };
1628 }
1629
1630 if (cfm.name === 'AESV2') {
1631 return function cipherTransformFactoryBuildCipherConstructorAESV2() {
1632 return new AES128Cipher(buildObjectKey(num, gen, key, true));
1633 };
1634 }
1635
1636 if (cfm.name === 'AESV3') {
1637 return function cipherTransformFactoryBuildCipherConstructorAESV3() {
1638 return new AES256Cipher(key);
1639 };
1640 }
1641
1642 throw new _util.FormatError('Unknown crypto method');
1643 }
1644
1645 CipherTransformFactory.prototype = {
1646 createCipherTransform: function CipherTransformFactory_createCipherTransform(num, gen) {
1647 if (this.algorithm === 4 || this.algorithm === 5) {
1648 return new CipherTransform(buildCipherConstructor(this.cf, this.stmf, num, gen, this.encryptionKey), buildCipherConstructor(this.cf, this.strf, num, gen, this.encryptionKey));
1649 }
1650
1651 var key = buildObjectKey(num, gen, this.encryptionKey, false);
1652
1653 var cipherConstructor = function buildCipherCipherConstructor() {
1654 return new ARCFourCipher(key);
1655 };
1656
1657 return new CipherTransform(cipherConstructor, cipherConstructor);
1658 }
1659 };
1660 return CipherTransformFactory;
1661}();
1662
1663exports.CipherTransformFactory = CipherTransformFactory;
\No newline at end of file