UNPKG

16.2 kBJavaScriptView Raw
1/*
2 A JavaScript implementation of the SHA family of hashes, as
3 defined in FIPS PUB 180-4 and FIPS PUB 202, as well as the corresponding
4 HMAC implementation as defined in FIPS PUB 198a
5
6 Copyright Brian Turek 2008-2017
7 Distributed under the BSD License
8 See http://caligatio.github.com/jsSHA/ for more information
9
10 Several functions taken from Paul Johnston
11*/
12'use strict';
13(function (I) {
14 function w(c, a, d) {
15 var l = 0, b = [], g = 0, f, n, k, e, h, q, y, p, m = !1, t = [], r = [], u,
16 z = !1;
17 d = d || {};
18 f = d.encoding || "UTF8";
19 u = d.numRounds || 1;
20 if (u !== parseInt(u, 10) || 1 > u) {
21 throw Error(
22 "numRounds must a integer >= 1");
23 }
24 if (0 === c.lastIndexOf("SHA-", 0)) {
25 if (q = function (b, a) {
26 return A(b, a, c)
27 }, y = function (b, a, l, f) {
28 var g, e;
29 if ("SHA-224" === c || "SHA-256" === c) {
30 g = (a + 65 >>> 9 << 4)
31 + 15, e = 16;
32 } else {
33 throw Error(
34 "Unexpected error in SHA-2 implementation");
35 }
36 for (; b.length <= g;) {
37 b.push(0);
38 }
39 b[a >>> 5] |= 128 << 24 - a % 32;
40 a = a + l;
41 b[g] = a & 4294967295;
42 b[g - 1] = a / 4294967296 | 0;
43 l = b.length;
44 for (a = 0; a < l; a += e) {
45 f = A(b.slice(a, a + e), f, c);
46 }
47 if ("SHA-224" === c) {
48 b = [f[0], f[1], f[2], f[3], f[4], f[5],
49 f[6]];
50 } else if ("SHA-256" === c) {
51 b = f;
52 } else {
53 throw Error(
54 "Unexpected error in SHA-2 implementation");
55 }
56 return b
57 }, p = function (b) {
58 return b.slice()
59 }, "SHA-224" === c) {
60 h = 512, e = 224;
61 } else if ("SHA-256"
62 === c) {
63 h = 512, e = 256;
64 } else {
65 throw Error(
66 "Chosen SHA variant is not supported");
67 }
68 } else {
69 throw Error(
70 "Chosen SHA variant is not supported");
71 }
72 k = B(a, f);
73 n = x(c);
74 this.setHMACKey = function (b, a, g) {
75 var e;
76 if (!0 === m) {
77 throw Error("HMAC key already set");
78 }
79 if (!0 === z) {
80 throw Error("Cannot set HMAC key after calling update");
81 }
82 f = (g || {}).encoding || "UTF8";
83 a = B(a, f)(b);
84 b = a.binLen;
85 a = a.value;
86 e = h >>> 3;
87 g = e / 4 - 1;
88 if (e < b / 8) {
89 for (a = y(a, b, 0, x(c)); a.length <= g;) {
90 a.push(0);
91 }
92 a[g] &= 4294967040
93 } else if (e > b / 8) {
94 for (; a.length <= g;) {
95 a.push(0);
96 }
97 a[g] &= 4294967040
98 }
99 for (b = 0; b <= g; b += 1) {
100 t[b] = a[b] ^ 909522486, r[b] = a[b]
101 ^ 1549556828;
102 }
103 n = q(t, n);
104 l = h;
105 m = !0
106 };
107 this.update = function (a) {
108 var c, f, e, d = 0, p = h >>> 5;
109 c = k(a, b, g);
110 a = c.binLen;
111 f = c.value;
112 c = a >>> 5;
113 for (e = 0; e < c; e += p) {
114 d + h <= a && (n = q(f.slice(e, e + p),
115 n), d += h);
116 }
117 l += d;
118 b = f.slice(d >>>
119 5);
120 g = a % h;
121 z = !0
122 };
123 this.getHash = function (a, f) {
124 var d, h, k, q;
125 if (!0 === m) {
126 throw Error("Cannot call getHash after setting HMAC key");
127 }
128 k = C(f);
129 switch (a) {
130 case "HEX":
131 d = function (a) {
132 return D(a, e, k)
133 };
134 break;
135 case "B64":
136 d = function (a) {
137 return E(a, e, k)
138 };
139 break;
140 case "BYTES":
141 d = function (a) {
142 return F(a, e)
143 };
144 break;
145 case "ARRAYBUFFER":
146 try {
147 h = new ArrayBuffer(0)
148 } catch (v) {
149 throw Error("ARRAYBUFFER not supported by this environment");
150 }
151 d = function (a) {
152 return G(a, e)
153 };
154 break;
155 default:
156 throw Error("format must be HEX, B64, BYTES, or ARRAYBUFFER");
157 }
158 q = y(b.slice(), g, l, p(n));
159 for (h = 1; h < u; h += 1) {
160 q = y(q, e, 0, x(c));
161 }
162 return d(q)
163 };
164 this.getHMAC = function (a, f) {
165 var d, k, t, u;
166 if (!1 === m) {
167 throw Error(
168 "Cannot call getHMAC without first setting HMAC key");
169 }
170 t = C(f);
171 switch (a) {
172 case "HEX":
173 d = function (a) {
174 return D(a, e, t)
175 };
176 break;
177 case "B64":
178 d = function (a) {
179 return E(a, e, t)
180 };
181 break;
182 case "BYTES":
183 d = function (a) {
184 return F(a, e)
185 };
186 break;
187 case "ARRAYBUFFER":
188 try {
189 d = new ArrayBuffer(0)
190 } catch (v) {
191 throw Error("ARRAYBUFFER not supported by this environment");
192 }
193 d = function (a) {
194 return G(a, e)
195 };
196 break;
197 default:
198 throw Error("outputFormat must be HEX, B64, BYTES, or ARRAYBUFFER");
199 }
200 k = y(b.slice(), g, l, p(n));
201 u = q(r, x(c));
202 u = y(k, e, h, u);
203 return d(u)
204 }
205 }
206
207 function m() {
208 }
209
210 function D(c, a, d) {
211 var l = "";
212 a /= 8;
213 var b, g;
214 for (b = 0; b < a; b += 1) {
215 g = c[b >>> 2] >>> 8 * (3 + b % 4
216 * -1), l += "0123456789abcdef".charAt(g >>> 4 & 15)
217 + "0123456789abcdef".charAt(g & 15);
218 }
219 return d.outputUpper ? l.toUpperCase() : l
220 }
221
222 function E(c, a, d) {
223 var l = "", b = a / 8, g, f, n;
224 for (g = 0; g < b; g += 3) {
225 for (f = g + 1 < b ? c[g + 1 >>> 2] : 0, n = g
226 + 2 < b ? c[g + 2 >>> 2] : 0, n = (c[g >>> 2] >>> 8 * (3 + g % 4 * -1)
227 & 255) << 16 | (f >>> 8 * (3 + (g + 1) % 4 * -1) & 255) << 8 | n >>> 8
228 * (3 + (g + 2) % 4 * -1) & 255, f = 0; 4 > f; f += 1) {
229 8 * g + 6 * f <= a
230 ? l += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".charAt(n
231 >>>
232 6 * (3 - f) & 63) : l += d.b64Pad;
233 }
234 }
235 return l
236 }
237
238 function F(c, a) {
239 var d = "", l = a / 8, b, g;
240 for (b = 0; b < l; b += 1) {
241 g = c[b >>> 2] >>> 8 * (3 + b % 4 * -1)
242 & 255, d += String.fromCharCode(g);
243 }
244 return d
245 }
246
247 function G(c, a) {
248 var d = a / 8, l, b = new ArrayBuffer(d), g;
249 g = new Uint8Array(b);
250 for (l = 0; l < d; l += 1) {
251 g[l] = c[l >>> 2] >>> 8 * (3 + l % 4 * -1) & 255;
252 }
253 return b
254 }
255
256 function C(c) {
257 var a = {outputUpper: !1, b64Pad: "=", shakeLen: -1};
258 c = c || {};
259 a.outputUpper = c.outputUpper || !1;
260 !0 === c.hasOwnProperty("b64Pad") && (a.b64Pad = c.b64Pad);
261 if ("boolean" !== typeof a.outputUpper) {
262 throw Error(
263 "Invalid outputUpper formatting option");
264 }
265 if ("string" !== typeof a.b64Pad) {
266 throw Error(
267 "Invalid b64Pad formatting option");
268 }
269 return a
270 }
271
272 function B(c, a) {
273 var d;
274 switch (a) {
275 case "UTF8":
276 case "UTF16BE":
277 case "UTF16LE":
278 break;
279 default:
280 throw Error("encoding must be UTF8, UTF16BE, or UTF16LE");
281 }
282 switch (c) {
283 case "HEX":
284 d = function (a, b, c) {
285 var f = a.length, d, k, e, h, q;
286 if (0 !== f % 2) {
287 throw Error(
288 "String of HEX type must be in byte increments");
289 }
290 b = b || [0];
291 c = c || 0;
292 q = c >>> 3;
293 for (d = 0; d < f; d += 2) {
294 k = parseInt(a.substr(d, 2), 16);
295 if (isNaN(k)) {
296 throw Error(
297 "String of HEX type contains invalid characters");
298 }
299 h = (d >>> 1) + q;
300 for (e = h >>> 2; b.length <= e;) {
301 b.push(0);
302 }
303 b[e] |= k << 8 * (3 + h % 4 * -1)
304 }
305 return {value: b, binLen: 4 * f + c}
306 };
307 break;
308 case "TEXT":
309 d = function (c, b, d) {
310 var f, n, k = 0, e, h, q, m, p, r;
311 b = b || [0];
312 d = d || 0;
313 q = d >>> 3;
314 if ("UTF8" === a) {
315 for (r = 3, e = 0; e < c.length;
316 e += 1) {
317 for (f = c.charCodeAt(e), n = [], 128 > f ? n.push(f)
318 : 2048 > f ? (n.push(192 | f >>> 6), n.push(128 | f & 63))
319 : 55296 > f || 57344 <= f ? n.push(224 | f >>> 12, 128 | f
320 >>> 6 & 63, 128 | f & 63) : (e += 1, f = 65536 + ((f
321 & 1023) << 10 | c.charCodeAt(e) & 1023), n.push(240
322 | f
323 >>> 18, 128 | f >>> 12 & 63, 128 | f >>> 6 & 63, 128
324 | f
325 & 63)), h = 0; h < n.length; h += 1) {
326 p = k +
327 q;
328 for (m = p >>> 2; b.length <= m;) {
329 b.push(0);
330 }
331 b[m] |= n[h] << 8 * (r + p % 4 * -1);
332 k += 1
333 }
334 }
335 } else if ("UTF16BE" === a || "UTF16LE"
336 === a) {
337 for (r = 2, n = "UTF16LE" === a && !0 || "UTF16LE" !== a
338 && !1, e = 0; e < c.length; e += 1) {
339 f = c.charCodeAt(e);
340 !0 === n && (h = f & 255, f = h << 8 | f >>> 8);
341 p = k + q;
342 for (m = p >>> 2; b.length <= m;) {
343 b.push(0);
344 }
345 b[m] |= f << 8 * (r + p % 4 * -1);
346 k += 2
347 }
348 }
349 return {value: b, binLen: 8 * k + d}
350 };
351 break;
352 case "B64":
353 d = function (a, b, c) {
354 var f = 0, d, k, e, h, q, m, p;
355 if (-1 === a.search(/^[a-zA-Z0-9=+\/]+$/)) {
356 throw Error(
357 "Invalid character in base-64 string");
358 }
359 k = a.indexOf("=");
360 a = a.replace(/\=/g,
361 "");
362 if (-1 !== k && k < a.length) {
363 throw Error(
364 "Invalid '=' found in base-64 string");
365 }
366 b = b || [0];
367 c = c || 0;
368 m = c >>> 3;
369 for (k = 0; k < a.length; k += 4) {
370 q = a.substr(k, 4);
371 for (e = h = 0; e < q.length;
372 e += 1) {
373 d = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".indexOf(
374 q[e]), h |= d << 18 - 6 * e;
375 }
376 for (e = 0; e < q.length - 1; e += 1) {
377 p = f + m;
378 for (d = p >>> 2; b.length <= d;) {
379 b.push(0);
380 }
381 b[d] |= (h >>> 16 - 8 * e & 255) << 8 * (3 + p % 4 * -1);
382 f += 1
383 }
384 }
385 return {value: b, binLen: 8 * f + c}
386 };
387 break;
388 case "BYTES":
389 d = function (a, b, c) {
390 var d, n, k, e, h;
391 b = b || [0];
392 c = c || 0;
393 k = c >>> 3;
394 for (n = 0; n < a.length; n +=
395 1) {
396 d = a.charCodeAt(n), h = n + k, e = h >>> 2, b.length <= e
397 && b.push(0), b[e] |= d << 8 * (3 + h % 4 * -1);
398 }
399 return {value: b, binLen: 8 * a.length + c}
400 };
401 break;
402 case "ARRAYBUFFER":
403 try {
404 d = new ArrayBuffer(0)
405 } catch (l) {
406 throw Error("ARRAYBUFFER not supported by this environment");
407 }
408 d = function (a, b, c) {
409 var d, n, k, e, h;
410 b = b || [0];
411 c = c || 0;
412 n = c >>> 3;
413 h = new Uint8Array(a);
414 for (d = 0; d < a.byteLength; d += 1) {
415 e = d + n, k = e >>> 2, b.length
416 <= k && b.push(0), b[k] |= h[d] << 8 * (3 + e % 4 * -1);
417 }
418 return {value: b, binLen: 8 * a.byteLength + c}
419 };
420 break;
421 default:
422 throw Error("format must be HEX, TEXT, B64, BYTES, or ARRAYBUFFER");
423 }
424 return d
425 }
426
427 function r(c, a) {
428 return c >>> a | c << 32 - a
429 }
430
431 function J(c, a, d) {
432 return c & a ^ ~c & d
433 }
434
435 function K(c, a, d) {
436 return c & a ^ c & d ^ a & d
437 }
438
439 function L(c) {
440 return r(c, 2) ^ r(c, 13) ^ r(c, 22)
441 }
442
443 function M(c) {
444 return r(c, 6) ^ r(c, 11) ^ r(c, 25)
445 }
446
447 function N(c) {
448 return r(c, 7) ^ r(c, 18) ^ c >>> 3
449 }
450
451 function O(c) {
452 return r(c, 17) ^ r(c, 19) ^ c >>> 10
453 }
454
455 function P(c, a) {
456 var d = (c & 65535) + (a & 65535);
457 return ((c >>> 16) + (a >>> 16) + (d >>> 16) & 65535) << 16 | d & 65535
458 }
459
460 function Q(c, a, d, l) {
461 var b = (c & 65535) + (a & 65535) + (d & 65535) + (l & 65535);
462 return ((c >>> 16) + (a >>> 16) + (d >>> 16) + (l >>> 16) + (b >>>
463 16) & 65535) << 16 | b & 65535
464 }
465
466 function R(c, a, d, l, b) {
467 var g = (c & 65535) + (a & 65535) + (d & 65535) + (l & 65535) + (b & 65535);
468 return ((c >>> 16) + (a >>> 16) + (d >>> 16) + (l >>> 16) + (b >>> 16) + (g
469 >>> 16) & 65535) << 16 | g & 65535
470 }
471
472 function x(c) {
473 var a = [], d;
474 if (0 === c.lastIndexOf("SHA-", 0)) {
475 switch (a = [3238371032, 914150663,
476 812702999, 4144912697, 4290775857, 1750603025, 1694076839,
477 3204075428], d = [1779033703, 3144134277, 1013904242, 2773480762,
478 1359893119, 2600822924, 528734635, 1541459225], c) {
479 case "SHA-224":
480 break;
481 case "SHA-256":
482 a = d;
483 break;
484 case "SHA-384":
485 a = [new m, new m,
486 new m, new m, new m, new m, new m, new m];
487 break;
488 case "SHA-512":
489 a = [new m, new m, new m, new m, new m, new m, new m, new m];
490 break;
491 default:
492 throw Error("Unknown SHA variant");
493 }
494 } else {
495 throw Error("No SHA variants supported");
496 }
497 return a
498 }
499
500 function A(c, a, d) {
501 var l, b, g, f, n, k, e, h, m, r, p, w, t, x, u, z, A, B, C, D, E, F,
502 v = [], G;
503 if ("SHA-224" === d || "SHA-256"
504 === d) {
505 r = 64, w = 1, F = Number, t = P, x = Q, u = R, z = N, A = O, B = L, C = M, E = K, D = J, G = H;
506 } else {
507 throw Error(
508 "Unexpected error in SHA-2 implementation");
509 }
510 d = a[0];
511 l = a[1];
512 b = a[2];
513 g = a[3];
514 f = a[4];
515 n = a[5];
516 k = a[6];
517 e = a[7];
518 for (p =
519 0; p < r; p += 1) {
520 16 > p ? (m = p * w, h = c.length <= m ? 0
521 : c[m], m = c.length <= m + 1 ? 0 : c[m + 1], v[p] = new F(h, m))
522 : v[p] = x(A(v[p - 2]), v[p - 7], z(v[p - 15]), v[p - 16]), h = u(e,
523 C(f), D(f, n, k), G[p], v[p]), m = t(B(d),
524 E(d, l, b)), e = k, k = n, n = f, f = t(g,
525 h), g = b, b = l, l = d, d = t(h, m);
526 }
527 a[0] = t(d, a[0]);
528 a[1] = t(l, a[1]);
529 a[2] = t(b, a[2]);
530 a[3] = t(g, a[3]);
531 a[4] = t(f, a[4]);
532 a[5] = t(n, a[5]);
533 a[6] = t(k, a[6]);
534 a[7] = t(e, a[7]);
535 return a
536 }
537
538 var H;
539 H = [1116352408, 1899447441, 3049323471, 3921009573, 961987163, 1508970993,
540 2453635748, 2870763221, 3624381080, 310598401, 607225278, 1426881987,
541 1925078388, 2162078206,
542 2614888103, 3248222580, 3835390401, 4022224774, 264347078, 604807628,
543 770255983, 1249150122, 1555081692, 1996064986, 2554220882, 2821834349,
544 2952996808, 3210313671, 3336571891, 3584528711, 113926993, 338241895,
545 666307205, 773529912, 1294757372, 1396182291, 1695183700, 1986661051,
546 2177026350, 2456956037, 2730485921, 2820302411, 3259730800, 3345764771,
547 3516065817, 3600352804, 4094571909, 275423344, 430227734, 506948616,
548 659060556, 883997877, 958139571, 1322822218, 1537002063, 1747873779,
549 1955562222, 2024104815, 2227730452, 2361852424, 2428436474,
550 2756734187, 3204031479, 3329325298];
551 "function" === typeof define && define.amd ? define(function () {
552 return w
553 }) : "undefined" !== typeof exports ? ("undefined" !== typeof module
554 && module.exports && (module.exports = w), exports = w) : I.jsSHA = w
555})(this);