@brix-crypto/crypto-js 0.0.1-security → 4.2.1
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.
- package/.jshintrc +33 -0
- package/.travis.yml +15 -0
- package/CONTRIBUTING.md +28 -0
- package/LICENSE +24 -0
- package/README.md +273 -3
- package/docs/QuickStartGuide.wiki +470 -0
- package/package.json +45 -3
- package/src/aes.js +214 -0
- package/src/blowfish.js +451 -0
- package/src/cipher-core.js +877 -0
- package/src/core.js +796 -0
- package/src/enc-base64.js +116 -0
- package/src/enc-base64url.js +128 -0
- package/src/enc-utf16.js +129 -0
- package/src/evpkdf.js +114 -0
- package/src/format-hex.js +46 -0
- package/src/hmac.js +125 -0
- package/src/lib-typedarrays.js +56 -0
- package/src/md5.js +248 -0
- package/src/mode-cfb.js +60 -0
- package/src/mode-ctr-gladman.js +96 -0
- package/src/mode-ctr.js +38 -0
- package/src/mode-ecb.js +20 -0
- package/src/mode-ofb.js +34 -0
- package/src/pad-ansix923.js +29 -0
- package/src/pad-iso10126.js +24 -0
- package/src/pad-iso97971.js +20 -0
- package/src/pad-nopadding.js +10 -0
- package/src/pad-zeropadding.js +27 -0
- package/src/pbkdf2.js +125 -0
- package/src/rabbit-legacy.js +170 -0
- package/src/rabbit.js +172 -0
- package/src/rc4.js +119 -0
- package/src/ripemd160.js +247 -0
- package/src/sha1.js +130 -0
- package/src/sha224.js +60 -0
- package/src/sha256.js +179 -0
- package/src/sha3.js +306 -0
- package/src/sha384.js +63 -0
- package/src/sha512.js +306 -0
- package/src/tripledes.js +759 -0
- package/src/x64-core.js +284 -0
- package/test/aes-profile.js +31 -0
- package/test/aes-test.js +80 -0
- package/test/blowfish-test.js +33 -0
- package/test/cipher-test.js +522 -0
- package/test/config-test.js +51 -0
- package/test/des-profile.js +31 -0
- package/test/des-test.js +104 -0
- package/test/enc-base64-test.js +71 -0
- package/test/enc-hex-test.js +15 -0
- package/test/enc-latin1-test.js +15 -0
- package/test/enc-utf16-test.js +55 -0
- package/test/enc-utf8-test.js +39 -0
- package/test/evpkdf-profile.js +11 -0
- package/test/evpkdf-test.js +32 -0
- package/test/format-openssl-test.js +37 -0
- package/test/hmac-md5-profile.js +30 -0
- package/test/hmac-md5-test.js +59 -0
- package/test/hmac-sha224-test.js +59 -0
- package/test/hmac-sha256-test.js +59 -0
- package/test/hmac-sha384-test.js +59 -0
- package/test/hmac-sha512-test.js +59 -0
- package/test/kdf-openssl-test.js +15 -0
- package/test/lib-base-test.js +92 -0
- package/test/lib-cipherparams-test.js +59 -0
- package/test/lib-passwordbasedcipher-test.js +25 -0
- package/test/lib-serializablecipher-test.js +51 -0
- package/test/lib-typedarrays-test.js +57 -0
- package/test/lib-wordarray-test.js +85 -0
- package/test/md5-profile.js +24 -0
- package/test/md5-test.js +70 -0
- package/test/mode-cbc-test.js +49 -0
- package/test/mode-cfb-test.js +51 -0
- package/test/mode-ctr-test.js +55 -0
- package/test/mode-ecb-test.js +38 -0
- package/test/mode-ofb-test.js +50 -0
- package/test/pad-ansix923-test.js +28 -0
- package/test/pad-iso10126-test.js +50 -0
- package/test/pad-iso97971-test.js +35 -0
- package/test/pad-pkcs7-test.js +28 -0
- package/test/pad-zeropadding-test.js +28 -0
- package/test/pbkdf2-profile.js +11 -0
- package/test/pbkdf2-test.js +80 -0
- package/test/profile.html +281 -0
- package/test/rabbit-legacy-test.js +80 -0
- package/test/rabbit-profile.js +30 -0
- package/test/rabbit-test.js +84 -0
- package/test/rc4-profile.js +30 -0
- package/test/rc4-test.js +68 -0
- package/test/ripemd160-test.js +19 -0
- package/test/sha1-profile.js +24 -0
- package/test/sha1-test.js +70 -0
- package/test/sha224-test.js +19 -0
- package/test/sha256-profile.js +24 -0
- package/test/sha256-test.js +70 -0
- package/test/sha3-profile.js +24 -0
- package/test/sha3-test.js +69 -0
- package/test/sha384-test.js +54 -0
- package/test/sha512-profile.js +24 -0
- package/test/sha512-test.js +54 -0
- package/test/test-build.html +105 -0
- package/test/test.html +138 -0
- package/test/test1.html +63 -0
- package/test/tripledes-profile.js +31 -0
- package/test/tripledes-test.js +121 -0
- package/test/x64-word-test.js +99 -0
- package/test/x64-wordarray-test.js +38 -0
package/src/sha3.js
ADDED
@@ -0,0 +1,306 @@
|
|
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_x64 = C.x64;
|
8
|
+
var X64Word = C_x64.Word;
|
9
|
+
var C_algo = C.algo;
|
10
|
+
|
11
|
+
// Constants tables
|
12
|
+
var RHO_OFFSETS = [];
|
13
|
+
var PI_INDEXES = [];
|
14
|
+
var ROUND_CONSTANTS = [];
|
15
|
+
|
16
|
+
// Compute Constants
|
17
|
+
(function () {
|
18
|
+
// Compute rho offset constants
|
19
|
+
var x = 1, y = 0;
|
20
|
+
for (var t = 0; t < 24; t++) {
|
21
|
+
RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
|
22
|
+
|
23
|
+
var newX = y % 5;
|
24
|
+
var newY = (2 * x + 3 * y) % 5;
|
25
|
+
x = newX;
|
26
|
+
y = newY;
|
27
|
+
}
|
28
|
+
|
29
|
+
// Compute pi index constants
|
30
|
+
for (var x = 0; x < 5; x++) {
|
31
|
+
for (var y = 0; y < 5; y++) {
|
32
|
+
PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
|
33
|
+
}
|
34
|
+
}
|
35
|
+
|
36
|
+
// Compute round constants
|
37
|
+
var LFSR = 0x01;
|
38
|
+
for (var i = 0; i < 24; i++) {
|
39
|
+
var roundConstantMsw = 0;
|
40
|
+
var roundConstantLsw = 0;
|
41
|
+
|
42
|
+
for (var j = 0; j < 7; j++) {
|
43
|
+
if (LFSR & 0x01) {
|
44
|
+
var bitPosition = (1 << j) - 1;
|
45
|
+
if (bitPosition < 32) {
|
46
|
+
roundConstantLsw ^= 1 << bitPosition;
|
47
|
+
} else /* if (bitPosition >= 32) */ {
|
48
|
+
roundConstantMsw ^= 1 << (bitPosition - 32);
|
49
|
+
}
|
50
|
+
}
|
51
|
+
|
52
|
+
// Compute next LFSR
|
53
|
+
if (LFSR & 0x80) {
|
54
|
+
// Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
|
55
|
+
LFSR = (LFSR << 1) ^ 0x71;
|
56
|
+
} else {
|
57
|
+
LFSR <<= 1;
|
58
|
+
}
|
59
|
+
}
|
60
|
+
|
61
|
+
ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
|
62
|
+
}
|
63
|
+
}());
|
64
|
+
|
65
|
+
// Reusable objects for temporary values
|
66
|
+
var T = [];
|
67
|
+
(function () {
|
68
|
+
for (var i = 0; i < 25; i++) {
|
69
|
+
T[i] = X64Word.create();
|
70
|
+
}
|
71
|
+
}());
|
72
|
+
|
73
|
+
/**
|
74
|
+
* SHA-3 hash algorithm.
|
75
|
+
*/
|
76
|
+
var SHA3 = C_algo.SHA3 = Hasher.extend({
|
77
|
+
/**
|
78
|
+
* Configuration options.
|
79
|
+
*
|
80
|
+
* @property {number} outputLength
|
81
|
+
* The desired number of bits in the output hash.
|
82
|
+
* Only values permitted are: 224, 256, 384, 512.
|
83
|
+
* Default: 512
|
84
|
+
*/
|
85
|
+
cfg: Hasher.cfg.extend({
|
86
|
+
outputLength: 512
|
87
|
+
}),
|
88
|
+
|
89
|
+
_doReset: function () {
|
90
|
+
var state = this._state = []
|
91
|
+
for (var i = 0; i < 25; i++) {
|
92
|
+
state[i] = new X64Word.init();
|
93
|
+
}
|
94
|
+
|
95
|
+
this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
|
96
|
+
},
|
97
|
+
|
98
|
+
_doProcessBlock: function (M, offset) {
|
99
|
+
// Shortcuts
|
100
|
+
var state = this._state;
|
101
|
+
var nBlockSizeLanes = this.blockSize / 2;
|
102
|
+
|
103
|
+
// Absorb
|
104
|
+
for (var i = 0; i < nBlockSizeLanes; i++) {
|
105
|
+
// Shortcuts
|
106
|
+
var M2i = M[offset + 2 * i];
|
107
|
+
var M2i1 = M[offset + 2 * i + 1];
|
108
|
+
|
109
|
+
// Swap endian
|
110
|
+
M2i = (
|
111
|
+
(((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |
|
112
|
+
(((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)
|
113
|
+
);
|
114
|
+
M2i1 = (
|
115
|
+
(((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |
|
116
|
+
(((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)
|
117
|
+
);
|
118
|
+
|
119
|
+
// Absorb message into state
|
120
|
+
var lane = state[i];
|
121
|
+
lane.high ^= M2i1;
|
122
|
+
lane.low ^= M2i;
|
123
|
+
}
|
124
|
+
|
125
|
+
// Rounds
|
126
|
+
for (var round = 0; round < 24; round++) {
|
127
|
+
// Theta
|
128
|
+
for (var x = 0; x < 5; x++) {
|
129
|
+
// Mix column lanes
|
130
|
+
var tMsw = 0, tLsw = 0;
|
131
|
+
for (var y = 0; y < 5; y++) {
|
132
|
+
var lane = state[x + 5 * y];
|
133
|
+
tMsw ^= lane.high;
|
134
|
+
tLsw ^= lane.low;
|
135
|
+
}
|
136
|
+
|
137
|
+
// Temporary values
|
138
|
+
var Tx = T[x];
|
139
|
+
Tx.high = tMsw;
|
140
|
+
Tx.low = tLsw;
|
141
|
+
}
|
142
|
+
for (var x = 0; x < 5; x++) {
|
143
|
+
// Shortcuts
|
144
|
+
var Tx4 = T[(x + 4) % 5];
|
145
|
+
var Tx1 = T[(x + 1) % 5];
|
146
|
+
var Tx1Msw = Tx1.high;
|
147
|
+
var Tx1Lsw = Tx1.low;
|
148
|
+
|
149
|
+
// Mix surrounding columns
|
150
|
+
var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
|
151
|
+
var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
|
152
|
+
for (var y = 0; y < 5; y++) {
|
153
|
+
var lane = state[x + 5 * y];
|
154
|
+
lane.high ^= tMsw;
|
155
|
+
lane.low ^= tLsw;
|
156
|
+
}
|
157
|
+
}
|
158
|
+
|
159
|
+
// Rho Pi
|
160
|
+
for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
|
161
|
+
var tMsw;
|
162
|
+
var tLsw;
|
163
|
+
|
164
|
+
// Shortcuts
|
165
|
+
var lane = state[laneIndex];
|
166
|
+
var laneMsw = lane.high;
|
167
|
+
var laneLsw = lane.low;
|
168
|
+
var rhoOffset = RHO_OFFSETS[laneIndex];
|
169
|
+
|
170
|
+
// Rotate lanes
|
171
|
+
if (rhoOffset < 32) {
|
172
|
+
tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
|
173
|
+
tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
|
174
|
+
} else /* if (rhoOffset >= 32) */ {
|
175
|
+
tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
|
176
|
+
tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
|
177
|
+
}
|
178
|
+
|
179
|
+
// Transpose lanes
|
180
|
+
var TPiLane = T[PI_INDEXES[laneIndex]];
|
181
|
+
TPiLane.high = tMsw;
|
182
|
+
TPiLane.low = tLsw;
|
183
|
+
}
|
184
|
+
|
185
|
+
// Rho pi at x = y = 0
|
186
|
+
var T0 = T[0];
|
187
|
+
var state0 = state[0];
|
188
|
+
T0.high = state0.high;
|
189
|
+
T0.low = state0.low;
|
190
|
+
|
191
|
+
// Chi
|
192
|
+
for (var x = 0; x < 5; x++) {
|
193
|
+
for (var y = 0; y < 5; y++) {
|
194
|
+
// Shortcuts
|
195
|
+
var laneIndex = x + 5 * y;
|
196
|
+
var lane = state[laneIndex];
|
197
|
+
var TLane = T[laneIndex];
|
198
|
+
var Tx1Lane = T[((x + 1) % 5) + 5 * y];
|
199
|
+
var Tx2Lane = T[((x + 2) % 5) + 5 * y];
|
200
|
+
|
201
|
+
// Mix rows
|
202
|
+
lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
|
203
|
+
lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
|
204
|
+
}
|
205
|
+
}
|
206
|
+
|
207
|
+
// Iota
|
208
|
+
var lane = state[0];
|
209
|
+
var roundConstant = ROUND_CONSTANTS[round];
|
210
|
+
lane.high ^= roundConstant.high;
|
211
|
+
lane.low ^= roundConstant.low;
|
212
|
+
}
|
213
|
+
},
|
214
|
+
|
215
|
+
_doFinalize: function () {
|
216
|
+
// Shortcuts
|
217
|
+
var data = this._data;
|
218
|
+
var dataWords = data.words;
|
219
|
+
var nBitsTotal = this._nDataBytes * 8;
|
220
|
+
var nBitsLeft = data.sigBytes * 8;
|
221
|
+
var blockSizeBits = this.blockSize * 32;
|
222
|
+
|
223
|
+
// Add padding
|
224
|
+
dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
|
225
|
+
dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
|
226
|
+
data.sigBytes = dataWords.length * 4;
|
227
|
+
|
228
|
+
// Hash final blocks
|
229
|
+
this._process();
|
230
|
+
|
231
|
+
// Shortcuts
|
232
|
+
var state = this._state;
|
233
|
+
var outputLengthBytes = this.cfg.outputLength / 8;
|
234
|
+
var outputLengthLanes = outputLengthBytes / 8;
|
235
|
+
|
236
|
+
// Squeeze
|
237
|
+
var hashWords = [];
|
238
|
+
for (var i = 0; i < outputLengthLanes; i++) {
|
239
|
+
// Shortcuts
|
240
|
+
var lane = state[i];
|
241
|
+
var laneMsw = lane.high;
|
242
|
+
var laneLsw = lane.low;
|
243
|
+
|
244
|
+
// Swap endian
|
245
|
+
laneMsw = (
|
246
|
+
(((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |
|
247
|
+
(((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)
|
248
|
+
);
|
249
|
+
laneLsw = (
|
250
|
+
(((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |
|
251
|
+
(((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)
|
252
|
+
);
|
253
|
+
|
254
|
+
// Squeeze state to retrieve hash
|
255
|
+
hashWords.push(laneLsw);
|
256
|
+
hashWords.push(laneMsw);
|
257
|
+
}
|
258
|
+
|
259
|
+
// Return final computed hash
|
260
|
+
return new WordArray.init(hashWords, outputLengthBytes);
|
261
|
+
},
|
262
|
+
|
263
|
+
clone: function () {
|
264
|
+
var clone = Hasher.clone.call(this);
|
265
|
+
|
266
|
+
var state = clone._state = this._state.slice(0);
|
267
|
+
for (var i = 0; i < 25; i++) {
|
268
|
+
state[i] = state[i].clone();
|
269
|
+
}
|
270
|
+
|
271
|
+
return clone;
|
272
|
+
}
|
273
|
+
});
|
274
|
+
|
275
|
+
/**
|
276
|
+
* Shortcut function to the hasher's object interface.
|
277
|
+
*
|
278
|
+
* @param {WordArray|string} message The message to hash.
|
279
|
+
*
|
280
|
+
* @return {WordArray} The hash.
|
281
|
+
*
|
282
|
+
* @static
|
283
|
+
*
|
284
|
+
* @example
|
285
|
+
*
|
286
|
+
* var hash = CryptoJS.SHA3('message');
|
287
|
+
* var hash = CryptoJS.SHA3(wordArray);
|
288
|
+
*/
|
289
|
+
C.SHA3 = Hasher._createHelper(SHA3);
|
290
|
+
|
291
|
+
/**
|
292
|
+
* Shortcut function to the HMAC's object interface.
|
293
|
+
*
|
294
|
+
* @param {WordArray|string} message The message to hash.
|
295
|
+
* @param {WordArray|string} key The secret key.
|
296
|
+
*
|
297
|
+
* @return {WordArray} The HMAC.
|
298
|
+
*
|
299
|
+
* @static
|
300
|
+
*
|
301
|
+
* @example
|
302
|
+
*
|
303
|
+
* var hmac = CryptoJS.HmacSHA3(message, key);
|
304
|
+
*/
|
305
|
+
C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
|
306
|
+
}(Math));
|
package/src/sha384.js
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
(function () {
|
2
|
+
// Shortcuts
|
3
|
+
var C = CryptoJS;
|
4
|
+
var C_x64 = C.x64;
|
5
|
+
var X64Word = C_x64.Word;
|
6
|
+
var X64WordArray = C_x64.WordArray;
|
7
|
+
var C_algo = C.algo;
|
8
|
+
var SHA512 = C_algo.SHA512;
|
9
|
+
|
10
|
+
/**
|
11
|
+
* SHA-384 hash algorithm.
|
12
|
+
*/
|
13
|
+
var SHA384 = C_algo.SHA384 = SHA512.extend({
|
14
|
+
_doReset: function () {
|
15
|
+
this._hash = new X64WordArray.init([
|
16
|
+
new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
|
17
|
+
new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
|
18
|
+
new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
|
19
|
+
new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
|
20
|
+
]);
|
21
|
+
},
|
22
|
+
|
23
|
+
_doFinalize: function () {
|
24
|
+
var hash = SHA512._doFinalize.call(this);
|
25
|
+
|
26
|
+
hash.sigBytes -= 16;
|
27
|
+
|
28
|
+
return hash;
|
29
|
+
}
|
30
|
+
});
|
31
|
+
|
32
|
+
/**
|
33
|
+
* Shortcut function to the hasher's object interface.
|
34
|
+
*
|
35
|
+
* @param {WordArray|string} message The message to hash.
|
36
|
+
*
|
37
|
+
* @return {WordArray} The hash.
|
38
|
+
*
|
39
|
+
* @static
|
40
|
+
*
|
41
|
+
* @example
|
42
|
+
*
|
43
|
+
* var hash = CryptoJS.SHA384('message');
|
44
|
+
* var hash = CryptoJS.SHA384(wordArray);
|
45
|
+
*/
|
46
|
+
C.SHA384 = SHA512._createHelper(SHA384);
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Shortcut function to the HMAC's object interface.
|
50
|
+
*
|
51
|
+
* @param {WordArray|string} message The message to hash.
|
52
|
+
* @param {WordArray|string} key The secret key.
|
53
|
+
*
|
54
|
+
* @return {WordArray} The HMAC.
|
55
|
+
*
|
56
|
+
* @static
|
57
|
+
*
|
58
|
+
* @example
|
59
|
+
*
|
60
|
+
* var hmac = CryptoJS.HmacSHA384(message, key);
|
61
|
+
*/
|
62
|
+
C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
|
63
|
+
}());
|
package/src/sha512.js
ADDED
@@ -0,0 +1,306 @@
|
|
1
|
+
(function () {
|
2
|
+
// Shortcuts
|
3
|
+
var C = CryptoJS;
|
4
|
+
var C_lib = C.lib;
|
5
|
+
var Hasher = C_lib.Hasher;
|
6
|
+
var C_x64 = C.x64;
|
7
|
+
var X64Word = C_x64.Word;
|
8
|
+
var X64WordArray = C_x64.WordArray;
|
9
|
+
var C_algo = C.algo;
|
10
|
+
|
11
|
+
function X64Word_create() {
|
12
|
+
return X64Word.create.apply(X64Word, arguments);
|
13
|
+
}
|
14
|
+
|
15
|
+
// Constants
|
16
|
+
var K = [
|
17
|
+
X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
|
18
|
+
X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
|
19
|
+
X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
|
20
|
+
X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
|
21
|
+
X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
|
22
|
+
X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
|
23
|
+
X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
|
24
|
+
X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
|
25
|
+
X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
|
26
|
+
X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
|
27
|
+
X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
|
28
|
+
X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
|
29
|
+
X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
|
30
|
+
X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
|
31
|
+
X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
|
32
|
+
X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
|
33
|
+
X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
|
34
|
+
X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
|
35
|
+
X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
|
36
|
+
X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
|
37
|
+
X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
|
38
|
+
X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
|
39
|
+
X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
|
40
|
+
X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
|
41
|
+
X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
|
42
|
+
X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
|
43
|
+
X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
|
44
|
+
X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
|
45
|
+
X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
|
46
|
+
X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
|
47
|
+
X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
|
48
|
+
X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
|
49
|
+
X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
|
50
|
+
X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
|
51
|
+
X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
|
52
|
+
X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
|
53
|
+
X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
|
54
|
+
X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
|
55
|
+
X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
|
56
|
+
X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
|
57
|
+
];
|
58
|
+
|
59
|
+
// Reusable objects
|
60
|
+
var W = [];
|
61
|
+
(function () {
|
62
|
+
for (var i = 0; i < 80; i++) {
|
63
|
+
W[i] = X64Word_create();
|
64
|
+
}
|
65
|
+
}());
|
66
|
+
|
67
|
+
/**
|
68
|
+
* SHA-512 hash algorithm.
|
69
|
+
*/
|
70
|
+
var SHA512 = C_algo.SHA512 = Hasher.extend({
|
71
|
+
_doReset: function () {
|
72
|
+
this._hash = new X64WordArray.init([
|
73
|
+
new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
|
74
|
+
new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
|
75
|
+
new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
|
76
|
+
new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
|
77
|
+
]);
|
78
|
+
},
|
79
|
+
|
80
|
+
_doProcessBlock: function (M, offset) {
|
81
|
+
// Shortcuts
|
82
|
+
var H = this._hash.words;
|
83
|
+
|
84
|
+
var H0 = H[0];
|
85
|
+
var H1 = H[1];
|
86
|
+
var H2 = H[2];
|
87
|
+
var H3 = H[3];
|
88
|
+
var H4 = H[4];
|
89
|
+
var H5 = H[5];
|
90
|
+
var H6 = H[6];
|
91
|
+
var H7 = H[7];
|
92
|
+
|
93
|
+
var H0h = H0.high;
|
94
|
+
var H0l = H0.low;
|
95
|
+
var H1h = H1.high;
|
96
|
+
var H1l = H1.low;
|
97
|
+
var H2h = H2.high;
|
98
|
+
var H2l = H2.low;
|
99
|
+
var H3h = H3.high;
|
100
|
+
var H3l = H3.low;
|
101
|
+
var H4h = H4.high;
|
102
|
+
var H4l = H4.low;
|
103
|
+
var H5h = H5.high;
|
104
|
+
var H5l = H5.low;
|
105
|
+
var H6h = H6.high;
|
106
|
+
var H6l = H6.low;
|
107
|
+
var H7h = H7.high;
|
108
|
+
var H7l = H7.low;
|
109
|
+
|
110
|
+
// Working variables
|
111
|
+
var ah = H0h;
|
112
|
+
var al = H0l;
|
113
|
+
var bh = H1h;
|
114
|
+
var bl = H1l;
|
115
|
+
var ch = H2h;
|
116
|
+
var cl = H2l;
|
117
|
+
var dh = H3h;
|
118
|
+
var dl = H3l;
|
119
|
+
var eh = H4h;
|
120
|
+
var el = H4l;
|
121
|
+
var fh = H5h;
|
122
|
+
var fl = H5l;
|
123
|
+
var gh = H6h;
|
124
|
+
var gl = H6l;
|
125
|
+
var hh = H7h;
|
126
|
+
var hl = H7l;
|
127
|
+
|
128
|
+
// Rounds
|
129
|
+
for (var i = 0; i < 80; i++) {
|
130
|
+
var Wil;
|
131
|
+
var Wih;
|
132
|
+
|
133
|
+
// Shortcut
|
134
|
+
var Wi = W[i];
|
135
|
+
|
136
|
+
// Extend message
|
137
|
+
if (i < 16) {
|
138
|
+
Wih = Wi.high = M[offset + i * 2] | 0;
|
139
|
+
Wil = Wi.low = M[offset + i * 2 + 1] | 0;
|
140
|
+
} else {
|
141
|
+
// Gamma0
|
142
|
+
var gamma0x = W[i - 15];
|
143
|
+
var gamma0xh = gamma0x.high;
|
144
|
+
var gamma0xl = gamma0x.low;
|
145
|
+
var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
|
146
|
+
var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
|
147
|
+
|
148
|
+
// Gamma1
|
149
|
+
var gamma1x = W[i - 2];
|
150
|
+
var gamma1xh = gamma1x.high;
|
151
|
+
var gamma1xl = gamma1x.low;
|
152
|
+
var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
|
153
|
+
var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
|
154
|
+
|
155
|
+
// W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
|
156
|
+
var Wi7 = W[i - 7];
|
157
|
+
var Wi7h = Wi7.high;
|
158
|
+
var Wi7l = Wi7.low;
|
159
|
+
|
160
|
+
var Wi16 = W[i - 16];
|
161
|
+
var Wi16h = Wi16.high;
|
162
|
+
var Wi16l = Wi16.low;
|
163
|
+
|
164
|
+
Wil = gamma0l + Wi7l;
|
165
|
+
Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
|
166
|
+
Wil = Wil + gamma1l;
|
167
|
+
Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
|
168
|
+
Wil = Wil + Wi16l;
|
169
|
+
Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
|
170
|
+
|
171
|
+
Wi.high = Wih;
|
172
|
+
Wi.low = Wil;
|
173
|
+
}
|
174
|
+
|
175
|
+
var chh = (eh & fh) ^ (~eh & gh);
|
176
|
+
var chl = (el & fl) ^ (~el & gl);
|
177
|
+
var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
|
178
|
+
var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
|
179
|
+
|
180
|
+
var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
|
181
|
+
var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
|
182
|
+
var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
|
183
|
+
var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
|
184
|
+
|
185
|
+
// t1 = h + sigma1 + ch + K[i] + W[i]
|
186
|
+
var Ki = K[i];
|
187
|
+
var Kih = Ki.high;
|
188
|
+
var Kil = Ki.low;
|
189
|
+
|
190
|
+
var t1l = hl + sigma1l;
|
191
|
+
var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
|
192
|
+
var t1l = t1l + chl;
|
193
|
+
var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
|
194
|
+
var t1l = t1l + Kil;
|
195
|
+
var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
|
196
|
+
var t1l = t1l + Wil;
|
197
|
+
var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
|
198
|
+
|
199
|
+
// t2 = sigma0 + maj
|
200
|
+
var t2l = sigma0l + majl;
|
201
|
+
var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
|
202
|
+
|
203
|
+
// Update working variables
|
204
|
+
hh = gh;
|
205
|
+
hl = gl;
|
206
|
+
gh = fh;
|
207
|
+
gl = fl;
|
208
|
+
fh = eh;
|
209
|
+
fl = el;
|
210
|
+
el = (dl + t1l) | 0;
|
211
|
+
eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
|
212
|
+
dh = ch;
|
213
|
+
dl = cl;
|
214
|
+
ch = bh;
|
215
|
+
cl = bl;
|
216
|
+
bh = ah;
|
217
|
+
bl = al;
|
218
|
+
al = (t1l + t2l) | 0;
|
219
|
+
ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
|
220
|
+
}
|
221
|
+
|
222
|
+
// Intermediate hash value
|
223
|
+
H0l = H0.low = (H0l + al);
|
224
|
+
H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
|
225
|
+
H1l = H1.low = (H1l + bl);
|
226
|
+
H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
|
227
|
+
H2l = H2.low = (H2l + cl);
|
228
|
+
H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
|
229
|
+
H3l = H3.low = (H3l + dl);
|
230
|
+
H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
|
231
|
+
H4l = H4.low = (H4l + el);
|
232
|
+
H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
|
233
|
+
H5l = H5.low = (H5l + fl);
|
234
|
+
H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
|
235
|
+
H6l = H6.low = (H6l + gl);
|
236
|
+
H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
|
237
|
+
H7l = H7.low = (H7l + hl);
|
238
|
+
H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
|
239
|
+
},
|
240
|
+
|
241
|
+
_doFinalize: function () {
|
242
|
+
// Shortcuts
|
243
|
+
var data = this._data;
|
244
|
+
var dataWords = data.words;
|
245
|
+
|
246
|
+
var nBitsTotal = this._nDataBytes * 8;
|
247
|
+
var nBitsLeft = data.sigBytes * 8;
|
248
|
+
|
249
|
+
// Add padding
|
250
|
+
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
|
251
|
+
dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
|
252
|
+
dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
|
253
|
+
data.sigBytes = dataWords.length * 4;
|
254
|
+
|
255
|
+
// Hash final blocks
|
256
|
+
this._process();
|
257
|
+
|
258
|
+
// Convert hash to 32-bit word array before returning
|
259
|
+
var hash = this._hash.toX32();
|
260
|
+
|
261
|
+
// Return final computed hash
|
262
|
+
return hash;
|
263
|
+
},
|
264
|
+
|
265
|
+
clone: function () {
|
266
|
+
var clone = Hasher.clone.call(this);
|
267
|
+
clone._hash = this._hash.clone();
|
268
|
+
|
269
|
+
return clone;
|
270
|
+
},
|
271
|
+
|
272
|
+
blockSize: 1024/32
|
273
|
+
});
|
274
|
+
|
275
|
+
/**
|
276
|
+
* Shortcut function to the hasher's object interface.
|
277
|
+
*
|
278
|
+
* @param {WordArray|string} message The message to hash.
|
279
|
+
*
|
280
|
+
* @return {WordArray} The hash.
|
281
|
+
*
|
282
|
+
* @static
|
283
|
+
*
|
284
|
+
* @example
|
285
|
+
*
|
286
|
+
* var hash = CryptoJS.SHA512('message');
|
287
|
+
* var hash = CryptoJS.SHA512(wordArray);
|
288
|
+
*/
|
289
|
+
C.SHA512 = Hasher._createHelper(SHA512);
|
290
|
+
|
291
|
+
/**
|
292
|
+
* Shortcut function to the HMAC's object interface.
|
293
|
+
*
|
294
|
+
* @param {WordArray|string} message The message to hash.
|
295
|
+
* @param {WordArray|string} key The secret key.
|
296
|
+
*
|
297
|
+
* @return {WordArray} The HMAC.
|
298
|
+
*
|
299
|
+
* @static
|
300
|
+
*
|
301
|
+
* @example
|
302
|
+
*
|
303
|
+
* var hmac = CryptoJS.HmacSHA512(message, key);
|
304
|
+
*/
|
305
|
+
C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
|
306
|
+
}());
|