@brix-crypto/crypto-js 0.0.1-security → 4.2.2

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.

Potentially problematic release.


This version of @brix-crypto/crypto-js might be problematic. Click here for more details.

Files changed (109) hide show
  1. package/.jshintrc +33 -0
  2. package/.travis.yml +15 -0
  3. package/CONTRIBUTING.md +28 -0
  4. package/LICENSE +24 -0
  5. package/README.md +273 -3
  6. package/aes.js +214 -0
  7. package/blowfish.js +451 -0
  8. package/cipher-core.js +877 -0
  9. package/core.js +796 -0
  10. package/docs/QuickStartGuide.wiki +470 -0
  11. package/enc-base64.js +116 -0
  12. package/enc-base64url.js +128 -0
  13. package/enc-utf16.js +129 -0
  14. package/evpkdf.js +114 -0
  15. package/format-hex.js +46 -0
  16. package/hmac.js +125 -0
  17. package/index.js +18 -0
  18. package/lib-typedarrays.js +56 -0
  19. package/md5.js +248 -0
  20. package/mode-cfb.js +60 -0
  21. package/mode-ctr-gladman.js +96 -0
  22. package/mode-ctr.js +38 -0
  23. package/mode-ecb.js +20 -0
  24. package/mode-ofb.js +34 -0
  25. package/package.json +45 -3
  26. package/pad-ansix923.js +29 -0
  27. package/pad-iso10126.js +24 -0
  28. package/pad-iso97971.js +20 -0
  29. package/pad-nopadding.js +10 -0
  30. package/pad-zeropadding.js +27 -0
  31. package/pbkdf2.js +125 -0
  32. package/rabbit-legacy.js +170 -0
  33. package/rabbit.js +172 -0
  34. package/rc4.js +119 -0
  35. package/ripemd160.js +247 -0
  36. package/sha1.js +130 -0
  37. package/sha224.js +60 -0
  38. package/sha256.js +179 -0
  39. package/sha3.js +306 -0
  40. package/sha384.js +63 -0
  41. package/sha512.js +306 -0
  42. package/test/aes-profile.js +31 -0
  43. package/test/aes-test.js +80 -0
  44. package/test/blowfish-test.js +33 -0
  45. package/test/cipher-test.js +522 -0
  46. package/test/config-test.js +51 -0
  47. package/test/des-profile.js +31 -0
  48. package/test/des-test.js +104 -0
  49. package/test/enc-base64-test.js +71 -0
  50. package/test/enc-hex-test.js +15 -0
  51. package/test/enc-latin1-test.js +15 -0
  52. package/test/enc-utf16-test.js +55 -0
  53. package/test/enc-utf8-test.js +39 -0
  54. package/test/evpkdf-profile.js +11 -0
  55. package/test/evpkdf-test.js +32 -0
  56. package/test/format-openssl-test.js +37 -0
  57. package/test/hmac-md5-profile.js +30 -0
  58. package/test/hmac-md5-test.js +59 -0
  59. package/test/hmac-sha224-test.js +59 -0
  60. package/test/hmac-sha256-test.js +59 -0
  61. package/test/hmac-sha384-test.js +59 -0
  62. package/test/hmac-sha512-test.js +59 -0
  63. package/test/kdf-openssl-test.js +15 -0
  64. package/test/lib-base-test.js +92 -0
  65. package/test/lib-cipherparams-test.js +59 -0
  66. package/test/lib-passwordbasedcipher-test.js +25 -0
  67. package/test/lib-serializablecipher-test.js +51 -0
  68. package/test/lib-typedarrays-test.js +57 -0
  69. package/test/lib-wordarray-test.js +85 -0
  70. package/test/md5-profile.js +24 -0
  71. package/test/md5-test.js +70 -0
  72. package/test/mode-cbc-test.js +49 -0
  73. package/test/mode-cfb-test.js +51 -0
  74. package/test/mode-ctr-test.js +55 -0
  75. package/test/mode-ecb-test.js +38 -0
  76. package/test/mode-ofb-test.js +50 -0
  77. package/test/pad-ansix923-test.js +28 -0
  78. package/test/pad-iso10126-test.js +50 -0
  79. package/test/pad-iso97971-test.js +35 -0
  80. package/test/pad-pkcs7-test.js +28 -0
  81. package/test/pad-zeropadding-test.js +28 -0
  82. package/test/pbkdf2-profile.js +11 -0
  83. package/test/pbkdf2-test.js +80 -0
  84. package/test/profile.html +281 -0
  85. package/test/rabbit-legacy-test.js +80 -0
  86. package/test/rabbit-profile.js +30 -0
  87. package/test/rabbit-test.js +84 -0
  88. package/test/rc4-profile.js +30 -0
  89. package/test/rc4-test.js +68 -0
  90. package/test/ripemd160-test.js +19 -0
  91. package/test/sha1-profile.js +24 -0
  92. package/test/sha1-test.js +70 -0
  93. package/test/sha224-test.js +19 -0
  94. package/test/sha256-profile.js +24 -0
  95. package/test/sha256-test.js +70 -0
  96. package/test/sha3-profile.js +24 -0
  97. package/test/sha3-test.js +69 -0
  98. package/test/sha384-test.js +54 -0
  99. package/test/sha512-profile.js +24 -0
  100. package/test/sha512-test.js +54 -0
  101. package/test/test-build.html +105 -0
  102. package/test/test.html +138 -0
  103. package/test/test1.html +63 -0
  104. package/test/tripledes-profile.js +31 -0
  105. package/test/tripledes-test.js +121 -0
  106. package/test/x64-word-test.js +99 -0
  107. package/test/x64-wordarray-test.js +38 -0
  108. package/tripledes.js +759 -0
  109. package/x64-core.js +284 -0
package/ripemd160.js ADDED
@@ -0,0 +1,247 @@
1
+ /** @preserve
2
+ (c) 2012 by Cédric Mesnil. All rights reserved.
3
+
4
+ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
5
+
6
+ - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
7
+ - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
8
+
9
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
10
+ */
11
+
12
+ (function (Math) {
13
+ // Shortcuts
14
+ var C = CryptoJS;
15
+ var C_lib = C.lib;
16
+ var WordArray = C_lib.WordArray;
17
+ var Hasher = C_lib.Hasher;
18
+ var C_algo = C.algo;
19
+
20
+ // Constants table
21
+ var _zl = WordArray.create([
22
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
23
+ 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
24
+ 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
25
+ 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
26
+ 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
27
+ var _zr = WordArray.create([
28
+ 5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
29
+ 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
30
+ 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
31
+ 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
32
+ 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
33
+ var _sl = WordArray.create([
34
+ 11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
35
+ 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
36
+ 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
37
+ 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
38
+ 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]);
39
+ var _sr = WordArray.create([
40
+ 8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
41
+ 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
42
+ 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
43
+ 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
44
+ 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]);
45
+
46
+ var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
47
+ var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
48
+
49
+ /**
50
+ * RIPEMD160 hash algorithm.
51
+ */
52
+ var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
53
+ _doReset: function () {
54
+ this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
55
+ },
56
+
57
+ _doProcessBlock: function (M, offset) {
58
+
59
+ // Swap endian
60
+ for (var i = 0; i < 16; i++) {
61
+ // Shortcuts
62
+ var offset_i = offset + i;
63
+ var M_offset_i = M[offset_i];
64
+
65
+ // Swap
66
+ M[offset_i] = (
67
+ (((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
68
+ (((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
69
+ );
70
+ }
71
+ // Shortcut
72
+ var H = this._hash.words;
73
+ var hl = _hl.words;
74
+ var hr = _hr.words;
75
+ var zl = _zl.words;
76
+ var zr = _zr.words;
77
+ var sl = _sl.words;
78
+ var sr = _sr.words;
79
+
80
+ // Working variables
81
+ var al, bl, cl, dl, el;
82
+ var ar, br, cr, dr, er;
83
+
84
+ ar = al = H[0];
85
+ br = bl = H[1];
86
+ cr = cl = H[2];
87
+ dr = dl = H[3];
88
+ er = el = H[4];
89
+ // Computation
90
+ var t;
91
+ for (var i = 0; i < 80; i += 1) {
92
+ t = (al + M[offset+zl[i]])|0;
93
+ if (i<16){
94
+ t += f1(bl,cl,dl) + hl[0];
95
+ } else if (i<32) {
96
+ t += f2(bl,cl,dl) + hl[1];
97
+ } else if (i<48) {
98
+ t += f3(bl,cl,dl) + hl[2];
99
+ } else if (i<64) {
100
+ t += f4(bl,cl,dl) + hl[3];
101
+ } else {// if (i<80) {
102
+ t += f5(bl,cl,dl) + hl[4];
103
+ }
104
+ t = t|0;
105
+ t = rotl(t,sl[i]);
106
+ t = (t+el)|0;
107
+ al = el;
108
+ el = dl;
109
+ dl = rotl(cl, 10);
110
+ cl = bl;
111
+ bl = t;
112
+
113
+ t = (ar + M[offset+zr[i]])|0;
114
+ if (i<16){
115
+ t += f5(br,cr,dr) + hr[0];
116
+ } else if (i<32) {
117
+ t += f4(br,cr,dr) + hr[1];
118
+ } else if (i<48) {
119
+ t += f3(br,cr,dr) + hr[2];
120
+ } else if (i<64) {
121
+ t += f2(br,cr,dr) + hr[3];
122
+ } else {// if (i<80) {
123
+ t += f1(br,cr,dr) + hr[4];
124
+ }
125
+ t = t|0;
126
+ t = rotl(t,sr[i]) ;
127
+ t = (t+er)|0;
128
+ ar = er;
129
+ er = dr;
130
+ dr = rotl(cr, 10);
131
+ cr = br;
132
+ br = t;
133
+ }
134
+ // Intermediate hash value
135
+ t = (H[1] + cl + dr)|0;
136
+ H[1] = (H[2] + dl + er)|0;
137
+ H[2] = (H[3] + el + ar)|0;
138
+ H[3] = (H[4] + al + br)|0;
139
+ H[4] = (H[0] + bl + cr)|0;
140
+ H[0] = t;
141
+ },
142
+
143
+ _doFinalize: function () {
144
+ // Shortcuts
145
+ var data = this._data;
146
+ var dataWords = data.words;
147
+
148
+ var nBitsTotal = this._nDataBytes * 8;
149
+ var nBitsLeft = data.sigBytes * 8;
150
+
151
+ // Add padding
152
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
153
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
154
+ (((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |
155
+ (((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)
156
+ );
157
+ data.sigBytes = (dataWords.length + 1) * 4;
158
+
159
+ // Hash final blocks
160
+ this._process();
161
+
162
+ // Shortcuts
163
+ var hash = this._hash;
164
+ var H = hash.words;
165
+
166
+ // Swap endian
167
+ for (var i = 0; i < 5; i++) {
168
+ // Shortcut
169
+ var H_i = H[i];
170
+
171
+ // Swap
172
+ H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
173
+ (((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
174
+ }
175
+
176
+ // Return final computed hash
177
+ return hash;
178
+ },
179
+
180
+ clone: function () {
181
+ var clone = Hasher.clone.call(this);
182
+ clone._hash = this._hash.clone();
183
+
184
+ return clone;
185
+ }
186
+ });
187
+
188
+
189
+ function f1(x, y, z) {
190
+ return ((x) ^ (y) ^ (z));
191
+
192
+ }
193
+
194
+ function f2(x, y, z) {
195
+ return (((x)&(y)) | ((~x)&(z)));
196
+ }
197
+
198
+ function f3(x, y, z) {
199
+ return (((x) | (~(y))) ^ (z));
200
+ }
201
+
202
+ function f4(x, y, z) {
203
+ return (((x) & (z)) | ((y)&(~(z))));
204
+ }
205
+
206
+ function f5(x, y, z) {
207
+ return ((x) ^ ((y) |(~(z))));
208
+
209
+ }
210
+
211
+ function rotl(x,n) {
212
+ return (x<<n) | (x>>>(32-n));
213
+ }
214
+
215
+
216
+ /**
217
+ * Shortcut function to the hasher's object interface.
218
+ *
219
+ * @param {WordArray|string} message The message to hash.
220
+ *
221
+ * @return {WordArray} The hash.
222
+ *
223
+ * @static
224
+ *
225
+ * @example
226
+ *
227
+ * var hash = CryptoJS.RIPEMD160('message');
228
+ * var hash = CryptoJS.RIPEMD160(wordArray);
229
+ */
230
+ C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
231
+
232
+ /**
233
+ * Shortcut function to the HMAC's object interface.
234
+ *
235
+ * @param {WordArray|string} message The message to hash.
236
+ * @param {WordArray|string} key The secret key.
237
+ *
238
+ * @return {WordArray} The HMAC.
239
+ *
240
+ * @static
241
+ *
242
+ * @example
243
+ *
244
+ * var hmac = CryptoJS.HmacRIPEMD160(message, key);
245
+ */
246
+ C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
247
+ }(Math));
package/sha1.js ADDED
@@ -0,0 +1,130 @@
1
+ (function () {
2
+ // Shortcuts
3
+ var C = CryptoJS;
4
+ var C_lib = C.lib;
5
+ var WordArray = C_lib.WordArray;
6
+ var Hasher = C_lib.Hasher;
7
+ var C_algo = C.algo;
8
+
9
+ // Reusable object
10
+ var W = [];
11
+
12
+ /**
13
+ * SHA-1 hash algorithm.
14
+ */
15
+ var SHA1 = C_algo.SHA1 = Hasher.extend({
16
+ _doReset: function () {
17
+ this._hash = new WordArray.init([
18
+ 0x67452301, 0xefcdab89,
19
+ 0x98badcfe, 0x10325476,
20
+ 0xc3d2e1f0
21
+ ]);
22
+ },
23
+
24
+ _doProcessBlock: function (M, offset) {
25
+ // Shortcut
26
+ var H = this._hash.words;
27
+
28
+ // Working variables
29
+ var a = H[0];
30
+ var b = H[1];
31
+ var c = H[2];
32
+ var d = H[3];
33
+ var e = H[4];
34
+
35
+ // Computation
36
+ for (var i = 0; i < 80; i++) {
37
+ if (i < 16) {
38
+ W[i] = M[offset + i] | 0;
39
+ } else {
40
+ var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
41
+ W[i] = (n << 1) | (n >>> 31);
42
+ }
43
+
44
+ var t = ((a << 5) | (a >>> 27)) + e + W[i];
45
+ if (i < 20) {
46
+ t += ((b & c) | (~b & d)) + 0x5a827999;
47
+ } else if (i < 40) {
48
+ t += (b ^ c ^ d) + 0x6ed9eba1;
49
+ } else if (i < 60) {
50
+ t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
51
+ } else /* if (i < 80) */ {
52
+ t += (b ^ c ^ d) - 0x359d3e2a;
53
+ }
54
+
55
+ e = d;
56
+ d = c;
57
+ c = (b << 30) | (b >>> 2);
58
+ b = a;
59
+ a = t;
60
+ }
61
+
62
+ // Intermediate hash value
63
+ H[0] = (H[0] + a) | 0;
64
+ H[1] = (H[1] + b) | 0;
65
+ H[2] = (H[2] + c) | 0;
66
+ H[3] = (H[3] + d) | 0;
67
+ H[4] = (H[4] + e) | 0;
68
+ },
69
+
70
+ _doFinalize: function () {
71
+ // Shortcuts
72
+ var data = this._data;
73
+ var dataWords = data.words;
74
+
75
+ var nBitsTotal = this._nDataBytes * 8;
76
+ var nBitsLeft = data.sigBytes * 8;
77
+
78
+ // Add padding
79
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
80
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
81
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
82
+ data.sigBytes = dataWords.length * 4;
83
+
84
+ // Hash final blocks
85
+ this._process();
86
+
87
+ // Return final computed hash
88
+ return this._hash;
89
+ },
90
+
91
+ clone: function () {
92
+ var clone = Hasher.clone.call(this);
93
+ clone._hash = this._hash.clone();
94
+
95
+ return clone;
96
+ }
97
+ });
98
+
99
+ /**
100
+ * Shortcut function to the hasher's object interface.
101
+ *
102
+ * @param {WordArray|string} message The message to hash.
103
+ *
104
+ * @return {WordArray} The hash.
105
+ *
106
+ * @static
107
+ *
108
+ * @example
109
+ *
110
+ * var hash = CryptoJS.SHA1('message');
111
+ * var hash = CryptoJS.SHA1(wordArray);
112
+ */
113
+ C.SHA1 = Hasher._createHelper(SHA1);
114
+
115
+ /**
116
+ * Shortcut function to the HMAC's object interface.
117
+ *
118
+ * @param {WordArray|string} message The message to hash.
119
+ * @param {WordArray|string} key The secret key.
120
+ *
121
+ * @return {WordArray} The HMAC.
122
+ *
123
+ * @static
124
+ *
125
+ * @example
126
+ *
127
+ * var hmac = CryptoJS.HmacSHA1(message, key);
128
+ */
129
+ C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
130
+ }());
package/sha224.js ADDED
@@ -0,0 +1,60 @@
1
+ (function () {
2
+ // Shortcuts
3
+ var C = CryptoJS;
4
+ var C_lib = C.lib;
5
+ var WordArray = C_lib.WordArray;
6
+ var C_algo = C.algo;
7
+ var SHA256 = C_algo.SHA256;
8
+
9
+ /**
10
+ * SHA-224 hash algorithm.
11
+ */
12
+ var SHA224 = C_algo.SHA224 = SHA256.extend({
13
+ _doReset: function () {
14
+ this._hash = new WordArray.init([
15
+ 0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
16
+ 0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
17
+ ]);
18
+ },
19
+
20
+ _doFinalize: function () {
21
+ var hash = SHA256._doFinalize.call(this);
22
+
23
+ hash.sigBytes -= 4;
24
+
25
+ return hash;
26
+ }
27
+ });
28
+
29
+ /**
30
+ * Shortcut function to the hasher's object interface.
31
+ *
32
+ * @param {WordArray|string} message The message to hash.
33
+ *
34
+ * @return {WordArray} The hash.
35
+ *
36
+ * @static
37
+ *
38
+ * @example
39
+ *
40
+ * var hash = CryptoJS.SHA224('message');
41
+ * var hash = CryptoJS.SHA224(wordArray);
42
+ */
43
+ C.SHA224 = SHA256._createHelper(SHA224);
44
+
45
+ /**
46
+ * Shortcut function to the HMAC's object interface.
47
+ *
48
+ * @param {WordArray|string} message The message to hash.
49
+ * @param {WordArray|string} key The secret key.
50
+ *
51
+ * @return {WordArray} The HMAC.
52
+ *
53
+ * @static
54
+ *
55
+ * @example
56
+ *
57
+ * var hmac = CryptoJS.HmacSHA224(message, key);
58
+ */
59
+ C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
60
+ }());
package/sha256.js ADDED
@@ -0,0 +1,179 @@
1
+ (function (Math) {
2
+ // Shortcuts
3
+ var C = CryptoJS;
4
+ var C_lib = C.lib;
5
+ var WordArray = C_lib.WordArray;
6
+ var Hasher = C_lib.Hasher;
7
+ var C_algo = C.algo;
8
+
9
+ // Initialization and round constants tables
10
+ var H = [];
11
+ var K = [];
12
+
13
+ // Compute constants
14
+ (function () {
15
+ function isPrime(n) {
16
+ var sqrtN = Math.sqrt(n);
17
+ for (var factor = 2; factor <= sqrtN; factor++) {
18
+ if (!(n % factor)) {
19
+ return false;
20
+ }
21
+ }
22
+
23
+ return true;
24
+ }
25
+
26
+ function getFractionalBits(n) {
27
+ return ((n - (n | 0)) * 0x100000000) | 0;
28
+ }
29
+
30
+ var n = 2;
31
+ var nPrime = 0;
32
+ while (nPrime < 64) {
33
+ if (isPrime(n)) {
34
+ if (nPrime < 8) {
35
+ H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
36
+ }
37
+ K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
38
+
39
+ nPrime++;
40
+ }
41
+
42
+ n++;
43
+ }
44
+ }());
45
+
46
+ // Reusable object
47
+ var W = [];
48
+
49
+ /**
50
+ * SHA-256 hash algorithm.
51
+ */
52
+ var SHA256 = C_algo.SHA256 = Hasher.extend({
53
+ _doReset: function () {
54
+ this._hash = new WordArray.init(H.slice(0));
55
+ },
56
+
57
+ _doProcessBlock: function (M, offset) {
58
+ // Shortcut
59
+ var H = this._hash.words;
60
+
61
+ // Working variables
62
+ var a = H[0];
63
+ var b = H[1];
64
+ var c = H[2];
65
+ var d = H[3];
66
+ var e = H[4];
67
+ var f = H[5];
68
+ var g = H[6];
69
+ var h = H[7];
70
+
71
+ // Computation
72
+ for (var i = 0; i < 64; i++) {
73
+ if (i < 16) {
74
+ W[i] = M[offset + i] | 0;
75
+ } else {
76
+ var gamma0x = W[i - 15];
77
+ var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
78
+ ((gamma0x << 14) | (gamma0x >>> 18)) ^
79
+ (gamma0x >>> 3);
80
+
81
+ var gamma1x = W[i - 2];
82
+ var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
83
+ ((gamma1x << 13) | (gamma1x >>> 19)) ^
84
+ (gamma1x >>> 10);
85
+
86
+ W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
87
+ }
88
+
89
+ var ch = (e & f) ^ (~e & g);
90
+ var maj = (a & b) ^ (a & c) ^ (b & c);
91
+
92
+ var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
93
+ var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
94
+
95
+ var t1 = h + sigma1 + ch + K[i] + W[i];
96
+ var t2 = sigma0 + maj;
97
+
98
+ h = g;
99
+ g = f;
100
+ f = e;
101
+ e = (d + t1) | 0;
102
+ d = c;
103
+ c = b;
104
+ b = a;
105
+ a = (t1 + t2) | 0;
106
+ }
107
+
108
+ // Intermediate hash value
109
+ H[0] = (H[0] + a) | 0;
110
+ H[1] = (H[1] + b) | 0;
111
+ H[2] = (H[2] + c) | 0;
112
+ H[3] = (H[3] + d) | 0;
113
+ H[4] = (H[4] + e) | 0;
114
+ H[5] = (H[5] + f) | 0;
115
+ H[6] = (H[6] + g) | 0;
116
+ H[7] = (H[7] + h) | 0;
117
+ },
118
+
119
+ _doFinalize: function () {
120
+ // Shortcuts
121
+ var data = this._data;
122
+ var dataWords = data.words;
123
+
124
+ var nBitsTotal = this._nDataBytes * 8;
125
+ var nBitsLeft = data.sigBytes * 8;
126
+
127
+ // Add padding
128
+ dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
129
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
130
+ dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
131
+ data.sigBytes = dataWords.length * 4;
132
+
133
+ // Hash final blocks
134
+ this._process();
135
+
136
+ // Return final computed hash
137
+ return this._hash;
138
+ },
139
+
140
+ clone: function () {
141
+ var clone = Hasher.clone.call(this);
142
+ clone._hash = this._hash.clone();
143
+
144
+ return clone;
145
+ }
146
+ });
147
+
148
+ /**
149
+ * Shortcut function to the hasher's object interface.
150
+ *
151
+ * @param {WordArray|string} message The message to hash.
152
+ *
153
+ * @return {WordArray} The hash.
154
+ *
155
+ * @static
156
+ *
157
+ * @example
158
+ *
159
+ * var hash = CryptoJS.SHA256('message');
160
+ * var hash = CryptoJS.SHA256(wordArray);
161
+ */
162
+ C.SHA256 = Hasher._createHelper(SHA256);
163
+
164
+ /**
165
+ * Shortcut function to the HMAC's object interface.
166
+ *
167
+ * @param {WordArray|string} message The message to hash.
168
+ * @param {WordArray|string} key The secret key.
169
+ *
170
+ * @return {WordArray} The HMAC.
171
+ *
172
+ * @static
173
+ *
174
+ * @example
175
+ *
176
+ * var hmac = CryptoJS.HmacSHA256(message, key);
177
+ */
178
+ C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
179
+ }(Math));