Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
17mie32
GitHub Repository: 17mie32/17mie32.github.io
Path: blob/main/js/crypto-js.js
1317 views
1
;(function (root, factory) {
2
if (typeof exports === "object") {
3
// CommonJS
4
module.exports = exports = factory();
5
}
6
else if (typeof define === "function" && define.amd) {
7
// AMD
8
define([], factory);
9
}
10
else {
11
// Global (browser)
12
root.CryptoJS = factory();
13
}
14
}(this, function () {
15
16
/**
17
* CryptoJS core components.
18
*/
19
var CryptoJS = CryptoJS || (function (Math, undefined) {
20
/*
21
* Local polyfil of Object.create
22
*/
23
var create = Object.create || (function () {
24
function F() {};
25
26
return function (obj) {
27
var subtype;
28
29
F.prototype = obj;
30
31
subtype = new F();
32
33
F.prototype = null;
34
35
return subtype;
36
};
37
}())
38
39
/**
40
* CryptoJS namespace.
41
*/
42
var C = {};
43
44
/**
45
* Library namespace.
46
*/
47
var C_lib = C.lib = {};
48
49
/**
50
* Base object for prototypal inheritance.
51
*/
52
var Base = C_lib.Base = (function () {
53
54
55
return {
56
/**
57
* Creates a new object that inherits from this object.
58
*
59
* @param {Object} overrides Properties to copy into the new object.
60
*
61
* @return {Object} The new object.
62
*
63
* @static
64
*
65
* @example
66
*
67
* var MyType = CryptoJS.lib.Base.extend({
68
* field: 'value',
69
*
70
* method: function () {
71
* }
72
* });
73
*/
74
extend: function (overrides) {
75
// Spawn
76
var subtype = create(this);
77
78
// Augment
79
if (overrides) {
80
subtype.mixIn(overrides);
81
}
82
83
// Create default initializer
84
if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {
85
subtype.init = function () {
86
subtype.$super.init.apply(this, arguments);
87
};
88
}
89
90
// Initializer's prototype is the subtype object
91
subtype.init.prototype = subtype;
92
93
// Reference supertype
94
subtype.$super = this;
95
96
return subtype;
97
},
98
99
/**
100
* Extends this object and runs the init method.
101
* Arguments to create() will be passed to init().
102
*
103
* @return {Object} The new object.
104
*
105
* @static
106
*
107
* @example
108
*
109
* var instance = MyType.create();
110
*/
111
create: function () {
112
var instance = this.extend();
113
instance.init.apply(instance, arguments);
114
115
return instance;
116
},
117
118
/**
119
* Initializes a newly created object.
120
* Override this method to add some logic when your objects are created.
121
*
122
* @example
123
*
124
* var MyType = CryptoJS.lib.Base.extend({
125
* init: function () {
126
* // ...
127
* }
128
* });
129
*/
130
init: function () {
131
},
132
133
/**
134
* Copies properties into this object.
135
*
136
* @param {Object} properties The properties to mix in.
137
*
138
* @example
139
*
140
* MyType.mixIn({
141
* field: 'value'
142
* });
143
*/
144
mixIn: function (properties) {
145
for (var propertyName in properties) {
146
if (properties.hasOwnProperty(propertyName)) {
147
this[propertyName] = properties[propertyName];
148
}
149
}
150
151
// IE won't copy toString using the loop above
152
if (properties.hasOwnProperty('toString')) {
153
this.toString = properties.toString;
154
}
155
},
156
157
/**
158
* Creates a copy of this object.
159
*
160
* @return {Object} The clone.
161
*
162
* @example
163
*
164
* var clone = instance.clone();
165
*/
166
clone: function () {
167
return this.init.prototype.extend(this);
168
}
169
};
170
}());
171
172
/**
173
* An array of 32-bit words.
174
*
175
* @property {Array} words The array of 32-bit words.
176
* @property {number} sigBytes The number of significant bytes in this word array.
177
*/
178
var WordArray = C_lib.WordArray = Base.extend({
179
/**
180
* Initializes a newly created word array.
181
*
182
* @param {Array} words (Optional) An array of 32-bit words.
183
* @param {number} sigBytes (Optional) The number of significant bytes in the words.
184
*
185
* @example
186
*
187
* var wordArray = CryptoJS.lib.WordArray.create();
188
* var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);
189
* var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);
190
*/
191
init: function (words, sigBytes) {
192
words = this.words = words || [];
193
194
if (sigBytes != undefined) {
195
this.sigBytes = sigBytes;
196
} else {
197
this.sigBytes = words.length * 4;
198
}
199
},
200
201
/**
202
* Converts this word array to a string.
203
*
204
* @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex
205
*
206
* @return {string} The stringified word array.
207
*
208
* @example
209
*
210
* var string = wordArray + '';
211
* var string = wordArray.toString();
212
* var string = wordArray.toString(CryptoJS.enc.Utf8);
213
*/
214
toString: function (encoder) {
215
return (encoder || Hex).stringify(this);
216
},
217
218
/**
219
* Concatenates a word array to this word array.
220
*
221
* @param {WordArray} wordArray The word array to append.
222
*
223
* @return {WordArray} This word array.
224
*
225
* @example
226
*
227
* wordArray1.concat(wordArray2);
228
*/
229
concat: function (wordArray) {
230
// Shortcuts
231
var thisWords = this.words;
232
var thatWords = wordArray.words;
233
var thisSigBytes = this.sigBytes;
234
var thatSigBytes = wordArray.sigBytes;
235
236
// Clamp excess bits
237
this.clamp();
238
239
// Concat
240
if (thisSigBytes % 4) {
241
// Copy one byte at a time
242
for (var i = 0; i < thatSigBytes; i++) {
243
var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
244
thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);
245
}
246
} else {
247
// Copy one word at a time
248
for (var i = 0; i < thatSigBytes; i += 4) {
249
thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];
250
}
251
}
252
this.sigBytes += thatSigBytes;
253
254
// Chainable
255
return this;
256
},
257
258
/**
259
* Removes insignificant bits.
260
*
261
* @example
262
*
263
* wordArray.clamp();
264
*/
265
clamp: function () {
266
// Shortcuts
267
var words = this.words;
268
var sigBytes = this.sigBytes;
269
270
// Clamp
271
words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);
272
words.length = Math.ceil(sigBytes / 4);
273
},
274
275
/**
276
* Creates a copy of this word array.
277
*
278
* @return {WordArray} The clone.
279
*
280
* @example
281
*
282
* var clone = wordArray.clone();
283
*/
284
clone: function () {
285
var clone = Base.clone.call(this);
286
clone.words = this.words.slice(0);
287
288
return clone;
289
},
290
291
/**
292
* Creates a word array filled with random bytes.
293
*
294
* @param {number} nBytes The number of random bytes to generate.
295
*
296
* @return {WordArray} The random word array.
297
*
298
* @static
299
*
300
* @example
301
*
302
* var wordArray = CryptoJS.lib.WordArray.random(16);
303
*/
304
random: function (nBytes) {
305
var words = [];
306
307
var r = (function (m_w) {
308
var m_w = m_w;
309
var m_z = 0x3ade68b1;
310
var mask = 0xffffffff;
311
312
return function () {
313
m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;
314
m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;
315
var result = ((m_z << 0x10) + m_w) & mask;
316
result /= 0x100000000;
317
result += 0.5;
318
return result * (Math.random() > .5 ? 1 : -1);
319
}
320
});
321
322
for (var i = 0, rcache; i < nBytes; i += 4) {
323
var _r = r((rcache || Math.random()) * 0x100000000);
324
325
rcache = _r() * 0x3ade67b7;
326
words.push((_r() * 0x100000000) | 0);
327
}
328
329
return new WordArray.init(words, nBytes);
330
}
331
});
332
333
/**
334
* Encoder namespace.
335
*/
336
var C_enc = C.enc = {};
337
338
/**
339
* Hex encoding strategy.
340
*/
341
var Hex = C_enc.Hex = {
342
/**
343
* Converts a word array to a hex string.
344
*
345
* @param {WordArray} wordArray The word array.
346
*
347
* @return {string} The hex string.
348
*
349
* @static
350
*
351
* @example
352
*
353
* var hexString = CryptoJS.enc.Hex.stringify(wordArray);
354
*/
355
stringify: function (wordArray) {
356
// Shortcuts
357
var words = wordArray.words;
358
var sigBytes = wordArray.sigBytes;
359
360
// Convert
361
var hexChars = [];
362
for (var i = 0; i < sigBytes; i++) {
363
var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
364
hexChars.push((bite >>> 4).toString(16));
365
hexChars.push((bite & 0x0f).toString(16));
366
}
367
368
return hexChars.join('');
369
},
370
371
/**
372
* Converts a hex string to a word array.
373
*
374
* @param {string} hexStr The hex string.
375
*
376
* @return {WordArray} The word array.
377
*
378
* @static
379
*
380
* @example
381
*
382
* var wordArray = CryptoJS.enc.Hex.parse(hexString);
383
*/
384
parse: function (hexStr) {
385
// Shortcut
386
var hexStrLength = hexStr.length;
387
388
// Convert
389
var words = [];
390
for (var i = 0; i < hexStrLength; i += 2) {
391
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);
392
}
393
394
return new WordArray.init(words, hexStrLength / 2);
395
}
396
};
397
398
/**
399
* Latin1 encoding strategy.
400
*/
401
var Latin1 = C_enc.Latin1 = {
402
/**
403
* Converts a word array to a Latin1 string.
404
*
405
* @param {WordArray} wordArray The word array.
406
*
407
* @return {string} The Latin1 string.
408
*
409
* @static
410
*
411
* @example
412
*
413
* var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);
414
*/
415
stringify: function (wordArray) {
416
// Shortcuts
417
var words = wordArray.words;
418
var sigBytes = wordArray.sigBytes;
419
420
// Convert
421
var latin1Chars = [];
422
for (var i = 0; i < sigBytes; i++) {
423
var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
424
latin1Chars.push(String.fromCharCode(bite));
425
}
426
427
return latin1Chars.join('');
428
},
429
430
/**
431
* Converts a Latin1 string to a word array.
432
*
433
* @param {string} latin1Str The Latin1 string.
434
*
435
* @return {WordArray} The word array.
436
*
437
* @static
438
*
439
* @example
440
*
441
* var wordArray = CryptoJS.enc.Latin1.parse(latin1String);
442
*/
443
parse: function (latin1Str) {
444
// Shortcut
445
var latin1StrLength = latin1Str.length;
446
447
// Convert
448
var words = [];
449
for (var i = 0; i < latin1StrLength; i++) {
450
words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);
451
}
452
453
return new WordArray.init(words, latin1StrLength);
454
}
455
};
456
457
/**
458
* UTF-8 encoding strategy.
459
*/
460
var Utf8 = C_enc.Utf8 = {
461
/**
462
* Converts a word array to a UTF-8 string.
463
*
464
* @param {WordArray} wordArray The word array.
465
*
466
* @return {string} The UTF-8 string.
467
*
468
* @static
469
*
470
* @example
471
*
472
* var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);
473
*/
474
stringify: function (wordArray) {
475
try {
476
return decodeURIComponent(escape(Latin1.stringify(wordArray)));
477
} catch (e) {
478
throw new Error('Malformed UTF-8 data');
479
}
480
},
481
482
/**
483
* Converts a UTF-8 string to a word array.
484
*
485
* @param {string} utf8Str The UTF-8 string.
486
*
487
* @return {WordArray} The word array.
488
*
489
* @static
490
*
491
* @example
492
*
493
* var wordArray = CryptoJS.enc.Utf8.parse(utf8String);
494
*/
495
parse: function (utf8Str) {
496
return Latin1.parse(unescape(encodeURIComponent(utf8Str)));
497
}
498
};
499
500
/**
501
* Abstract buffered block algorithm template.
502
*
503
* The property blockSize must be implemented in a concrete subtype.
504
*
505
* @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0
506
*/
507
var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({
508
/**
509
* Resets this block algorithm's data buffer to its initial state.
510
*
511
* @example
512
*
513
* bufferedBlockAlgorithm.reset();
514
*/
515
reset: function () {
516
// Initial values
517
this._data = new WordArray.init();
518
this._nDataBytes = 0;
519
},
520
521
/**
522
* Adds new data to this block algorithm's buffer.
523
*
524
* @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.
525
*
526
* @example
527
*
528
* bufferedBlockAlgorithm._append('data');
529
* bufferedBlockAlgorithm._append(wordArray);
530
*/
531
_append: function (data) {
532
// Convert string to WordArray, else assume WordArray already
533
if (typeof data == 'string') {
534
data = Utf8.parse(data);
535
}
536
537
// Append
538
this._data.concat(data);
539
this._nDataBytes += data.sigBytes;
540
},
541
542
/**
543
* Processes available data blocks.
544
*
545
* This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.
546
*
547
* @param {boolean} doFlush Whether all blocks and partial blocks should be processed.
548
*
549
* @return {WordArray} The processed data.
550
*
551
* @example
552
*
553
* var processedData = bufferedBlockAlgorithm._process();
554
* var processedData = bufferedBlockAlgorithm._process(!!'flush');
555
*/
556
_process: function (doFlush) {
557
// Shortcuts
558
var data = this._data;
559
var dataWords = data.words;
560
var dataSigBytes = data.sigBytes;
561
var blockSize = this.blockSize;
562
var blockSizeBytes = blockSize * 4;
563
564
// Count blocks ready
565
var nBlocksReady = dataSigBytes / blockSizeBytes;
566
if (doFlush) {
567
// Round up to include partial blocks
568
nBlocksReady = Math.ceil(nBlocksReady);
569
} else {
570
// Round down to include only full blocks,
571
// less the number of blocks that must remain in the buffer
572
nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);
573
}
574
575
// Count words ready
576
var nWordsReady = nBlocksReady * blockSize;
577
578
// Count bytes ready
579
var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);
580
581
// Process blocks
582
if (nWordsReady) {
583
for (var offset = 0; offset < nWordsReady; offset += blockSize) {
584
// Perform concrete-algorithm logic
585
this._doProcessBlock(dataWords, offset);
586
}
587
588
// Remove processed words
589
var processedWords = dataWords.splice(0, nWordsReady);
590
data.sigBytes -= nBytesReady;
591
}
592
593
// Return processed words
594
return new WordArray.init(processedWords, nBytesReady);
595
},
596
597
/**
598
* Creates a copy of this object.
599
*
600
* @return {Object} The clone.
601
*
602
* @example
603
*
604
* var clone = bufferedBlockAlgorithm.clone();
605
*/
606
clone: function () {
607
var clone = Base.clone.call(this);
608
clone._data = this._data.clone();
609
610
return clone;
611
},
612
613
_minBufferSize: 0
614
});
615
616
/**
617
* Abstract hasher template.
618
*
619
* @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)
620
*/
621
var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({
622
/**
623
* Configuration options.
624
*/
625
cfg: Base.extend(),
626
627
/**
628
* Initializes a newly created hasher.
629
*
630
* @param {Object} cfg (Optional) The configuration options to use for this hash computation.
631
*
632
* @example
633
*
634
* var hasher = CryptoJS.algo.SHA256.create();
635
*/
636
init: function (cfg) {
637
// Apply config defaults
638
this.cfg = this.cfg.extend(cfg);
639
640
// Set initial values
641
this.reset();
642
},
643
644
/**
645
* Resets this hasher to its initial state.
646
*
647
* @example
648
*
649
* hasher.reset();
650
*/
651
reset: function () {
652
// Reset data buffer
653
BufferedBlockAlgorithm.reset.call(this);
654
655
// Perform concrete-hasher logic
656
this._doReset();
657
},
658
659
/**
660
* Updates this hasher with a message.
661
*
662
* @param {WordArray|string} messageUpdate The message to append.
663
*
664
* @return {Hasher} This hasher.
665
*
666
* @example
667
*
668
* hasher.update('message');
669
* hasher.update(wordArray);
670
*/
671
update: function (messageUpdate) {
672
// Append
673
this._append(messageUpdate);
674
675
// Update the hash
676
this._process();
677
678
// Chainable
679
return this;
680
},
681
682
/**
683
* Finalizes the hash computation.
684
* Note that the finalize operation is effectively a destructive, read-once operation.
685
*
686
* @param {WordArray|string} messageUpdate (Optional) A final message update.
687
*
688
* @return {WordArray} The hash.
689
*
690
* @example
691
*
692
* var hash = hasher.finalize();
693
* var hash = hasher.finalize('message');
694
* var hash = hasher.finalize(wordArray);
695
*/
696
finalize: function (messageUpdate) {
697
// Final message update
698
if (messageUpdate) {
699
this._append(messageUpdate);
700
}
701
702
// Perform concrete-hasher logic
703
var hash = this._doFinalize();
704
705
return hash;
706
},
707
708
blockSize: 512/32,
709
710
/**
711
* Creates a shortcut function to a hasher's object interface.
712
*
713
* @param {Hasher} hasher The hasher to create a helper for.
714
*
715
* @return {Function} The shortcut function.
716
*
717
* @static
718
*
719
* @example
720
*
721
* var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);
722
*/
723
_createHelper: function (hasher) {
724
return function (message, cfg) {
725
return new hasher.init(cfg).finalize(message);
726
};
727
},
728
729
/**
730
* Creates a shortcut function to the HMAC's object interface.
731
*
732
* @param {Hasher} hasher The hasher to use in this HMAC helper.
733
*
734
* @return {Function} The shortcut function.
735
*
736
* @static
737
*
738
* @example
739
*
740
* var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);
741
*/
742
_createHmacHelper: function (hasher) {
743
return function (message, key) {
744
return new C_algo.HMAC.init(hasher, key).finalize(message);
745
};
746
}
747
});
748
749
/**
750
* Algorithm namespace.
751
*/
752
var C_algo = C.algo = {};
753
754
return C;
755
}(Math));
756
757
758
(function () {
759
// Shortcuts
760
var C = CryptoJS;
761
var C_lib = C.lib;
762
var WordArray = C_lib.WordArray;
763
var C_enc = C.enc;
764
765
/**
766
* Base64 encoding strategy.
767
*/
768
var Base64 = C_enc.Base64 = {
769
/**
770
* Converts a word array to a Base64 string.
771
*
772
* @param {WordArray} wordArray The word array.
773
*
774
* @return {string} The Base64 string.
775
*
776
* @static
777
*
778
* @example
779
*
780
* var base64String = CryptoJS.enc.Base64.stringify(wordArray);
781
*/
782
stringify: function (wordArray) {
783
// Shortcuts
784
var words = wordArray.words;
785
var sigBytes = wordArray.sigBytes;
786
var map = this._map;
787
788
// Clamp excess bits
789
wordArray.clamp();
790
791
// Convert
792
var base64Chars = [];
793
for (var i = 0; i < sigBytes; i += 3) {
794
var byte1 = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;
795
var byte2 = (words[(i + 1) >>> 2] >>> (24 - ((i + 1) % 4) * 8)) & 0xff;
796
var byte3 = (words[(i + 2) >>> 2] >>> (24 - ((i + 2) % 4) * 8)) & 0xff;
797
798
var triplet = (byte1 << 16) | (byte2 << 8) | byte3;
799
800
for (var j = 0; (j < 4) && (i + j * 0.75 < sigBytes); j++) {
801
base64Chars.push(map.charAt((triplet >>> (6 * (3 - j))) & 0x3f));
802
}
803
}
804
805
// Add padding
806
var paddingChar = map.charAt(64);
807
if (paddingChar) {
808
while (base64Chars.length % 4) {
809
base64Chars.push(paddingChar);
810
}
811
}
812
813
return base64Chars.join('');
814
},
815
816
/**
817
* Converts a Base64 string to a word array.
818
*
819
* @param {string} base64Str The Base64 string.
820
*
821
* @return {WordArray} The word array.
822
*
823
* @static
824
*
825
* @example
826
*
827
* var wordArray = CryptoJS.enc.Base64.parse(base64String);
828
*/
829
parse: function (base64Str) {
830
// Shortcuts
831
var base64StrLength = base64Str.length;
832
var map = this._map;
833
var reverseMap = this._reverseMap;
834
835
if (!reverseMap) {
836
reverseMap = this._reverseMap = [];
837
for (var j = 0; j < map.length; j++) {
838
reverseMap[map.charCodeAt(j)] = j;
839
}
840
}
841
842
// Ignore padding
843
var paddingChar = map.charAt(64);
844
if (paddingChar) {
845
var paddingIndex = base64Str.indexOf(paddingChar);
846
if (paddingIndex !== -1) {
847
base64StrLength = paddingIndex;
848
}
849
}
850
851
// Convert
852
return parseLoop(base64Str, base64StrLength, reverseMap);
853
854
},
855
856
_map: 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='
857
};
858
859
function parseLoop(base64Str, base64StrLength, reverseMap) {
860
var words = [];
861
var nBytes = 0;
862
for (var i = 0; i < base64StrLength; i++) {
863
if (i % 4) {
864
var bits1 = reverseMap[base64Str.charCodeAt(i - 1)] << ((i % 4) * 2);
865
var bits2 = reverseMap[base64Str.charCodeAt(i)] >>> (6 - (i % 4) * 2);
866
words[nBytes >>> 2] |= (bits1 | bits2) << (24 - (nBytes % 4) * 8);
867
nBytes++;
868
}
869
}
870
return WordArray.create(words, nBytes);
871
}
872
}());
873
874
875
(function (Math) {
876
// Shortcuts
877
var C = CryptoJS;
878
var C_lib = C.lib;
879
var WordArray = C_lib.WordArray;
880
var Hasher = C_lib.Hasher;
881
var C_algo = C.algo;
882
883
// Constants table
884
var T = [];
885
886
// Compute constants
887
(function () {
888
for (var i = 0; i < 64; i++) {
889
T[i] = (Math.abs(Math.sin(i + 1)) * 0x100000000) | 0;
890
}
891
}());
892
893
/**
894
* MD5 hash algorithm.
895
*/
896
var MD5 = C_algo.MD5 = Hasher.extend({
897
_doReset: function () {
898
this._hash = new WordArray.init([
899
0x67452301, 0xefcdab89,
900
0x98badcfe, 0x10325476
901
]);
902
},
903
904
_doProcessBlock: function (M, offset) {
905
// Swap endian
906
for (var i = 0; i < 16; i++) {
907
// Shortcuts
908
var offset_i = offset + i;
909
var M_offset_i = M[offset_i];
910
911
M[offset_i] = (
912
(((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
913
(((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
914
);
915
}
916
917
// Shortcuts
918
var H = this._hash.words;
919
920
var M_offset_0 = M[offset + 0];
921
var M_offset_1 = M[offset + 1];
922
var M_offset_2 = M[offset + 2];
923
var M_offset_3 = M[offset + 3];
924
var M_offset_4 = M[offset + 4];
925
var M_offset_5 = M[offset + 5];
926
var M_offset_6 = M[offset + 6];
927
var M_offset_7 = M[offset + 7];
928
var M_offset_8 = M[offset + 8];
929
var M_offset_9 = M[offset + 9];
930
var M_offset_10 = M[offset + 10];
931
var M_offset_11 = M[offset + 11];
932
var M_offset_12 = M[offset + 12];
933
var M_offset_13 = M[offset + 13];
934
var M_offset_14 = M[offset + 14];
935
var M_offset_15 = M[offset + 15];
936
937
// Working varialbes
938
var a = H[0];
939
var b = H[1];
940
var c = H[2];
941
var d = H[3];
942
943
// Computation
944
a = FF(a, b, c, d, M_offset_0, 7, T[0]);
945
d = FF(d, a, b, c, M_offset_1, 12, T[1]);
946
c = FF(c, d, a, b, M_offset_2, 17, T[2]);
947
b = FF(b, c, d, a, M_offset_3, 22, T[3]);
948
a = FF(a, b, c, d, M_offset_4, 7, T[4]);
949
d = FF(d, a, b, c, M_offset_5, 12, T[5]);
950
c = FF(c, d, a, b, M_offset_6, 17, T[6]);
951
b = FF(b, c, d, a, M_offset_7, 22, T[7]);
952
a = FF(a, b, c, d, M_offset_8, 7, T[8]);
953
d = FF(d, a, b, c, M_offset_9, 12, T[9]);
954
c = FF(c, d, a, b, M_offset_10, 17, T[10]);
955
b = FF(b, c, d, a, M_offset_11, 22, T[11]);
956
a = FF(a, b, c, d, M_offset_12, 7, T[12]);
957
d = FF(d, a, b, c, M_offset_13, 12, T[13]);
958
c = FF(c, d, a, b, M_offset_14, 17, T[14]);
959
b = FF(b, c, d, a, M_offset_15, 22, T[15]);
960
961
a = GG(a, b, c, d, M_offset_1, 5, T[16]);
962
d = GG(d, a, b, c, M_offset_6, 9, T[17]);
963
c = GG(c, d, a, b, M_offset_11, 14, T[18]);
964
b = GG(b, c, d, a, M_offset_0, 20, T[19]);
965
a = GG(a, b, c, d, M_offset_5, 5, T[20]);
966
d = GG(d, a, b, c, M_offset_10, 9, T[21]);
967
c = GG(c, d, a, b, M_offset_15, 14, T[22]);
968
b = GG(b, c, d, a, M_offset_4, 20, T[23]);
969
a = GG(a, b, c, d, M_offset_9, 5, T[24]);
970
d = GG(d, a, b, c, M_offset_14, 9, T[25]);
971
c = GG(c, d, a, b, M_offset_3, 14, T[26]);
972
b = GG(b, c, d, a, M_offset_8, 20, T[27]);
973
a = GG(a, b, c, d, M_offset_13, 5, T[28]);
974
d = GG(d, a, b, c, M_offset_2, 9, T[29]);
975
c = GG(c, d, a, b, M_offset_7, 14, T[30]);
976
b = GG(b, c, d, a, M_offset_12, 20, T[31]);
977
978
a = HH(a, b, c, d, M_offset_5, 4, T[32]);
979
d = HH(d, a, b, c, M_offset_8, 11, T[33]);
980
c = HH(c, d, a, b, M_offset_11, 16, T[34]);
981
b = HH(b, c, d, a, M_offset_14, 23, T[35]);
982
a = HH(a, b, c, d, M_offset_1, 4, T[36]);
983
d = HH(d, a, b, c, M_offset_4, 11, T[37]);
984
c = HH(c, d, a, b, M_offset_7, 16, T[38]);
985
b = HH(b, c, d, a, M_offset_10, 23, T[39]);
986
a = HH(a, b, c, d, M_offset_13, 4, T[40]);
987
d = HH(d, a, b, c, M_offset_0, 11, T[41]);
988
c = HH(c, d, a, b, M_offset_3, 16, T[42]);
989
b = HH(b, c, d, a, M_offset_6, 23, T[43]);
990
a = HH(a, b, c, d, M_offset_9, 4, T[44]);
991
d = HH(d, a, b, c, M_offset_12, 11, T[45]);
992
c = HH(c, d, a, b, M_offset_15, 16, T[46]);
993
b = HH(b, c, d, a, M_offset_2, 23, T[47]);
994
995
a = II(a, b, c, d, M_offset_0, 6, T[48]);
996
d = II(d, a, b, c, M_offset_7, 10, T[49]);
997
c = II(c, d, a, b, M_offset_14, 15, T[50]);
998
b = II(b, c, d, a, M_offset_5, 21, T[51]);
999
a = II(a, b, c, d, M_offset_12, 6, T[52]);
1000
d = II(d, a, b, c, M_offset_3, 10, T[53]);
1001
c = II(c, d, a, b, M_offset_10, 15, T[54]);
1002
b = II(b, c, d, a, M_offset_1, 21, T[55]);
1003
a = II(a, b, c, d, M_offset_8, 6, T[56]);
1004
d = II(d, a, b, c, M_offset_15, 10, T[57]);
1005
c = II(c, d, a, b, M_offset_6, 15, T[58]);
1006
b = II(b, c, d, a, M_offset_13, 21, T[59]);
1007
a = II(a, b, c, d, M_offset_4, 6, T[60]);
1008
d = II(d, a, b, c, M_offset_11, 10, T[61]);
1009
c = II(c, d, a, b, M_offset_2, 15, T[62]);
1010
b = II(b, c, d, a, M_offset_9, 21, T[63]);
1011
1012
// Intermediate hash value
1013
H[0] = (H[0] + a) | 0;
1014
H[1] = (H[1] + b) | 0;
1015
H[2] = (H[2] + c) | 0;
1016
H[3] = (H[3] + d) | 0;
1017
},
1018
1019
_doFinalize: function () {
1020
// Shortcuts
1021
var data = this._data;
1022
var dataWords = data.words;
1023
1024
var nBitsTotal = this._nDataBytes * 8;
1025
var nBitsLeft = data.sigBytes * 8;
1026
1027
// Add padding
1028
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
1029
1030
var nBitsTotalH = Math.floor(nBitsTotal / 0x100000000);
1031
var nBitsTotalL = nBitsTotal;
1032
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = (
1033
(((nBitsTotalH << 8) | (nBitsTotalH >>> 24)) & 0x00ff00ff) |
1034
(((nBitsTotalH << 24) | (nBitsTotalH >>> 8)) & 0xff00ff00)
1035
);
1036
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
1037
(((nBitsTotalL << 8) | (nBitsTotalL >>> 24)) & 0x00ff00ff) |
1038
(((nBitsTotalL << 24) | (nBitsTotalL >>> 8)) & 0xff00ff00)
1039
);
1040
1041
data.sigBytes = (dataWords.length + 1) * 4;
1042
1043
// Hash final blocks
1044
this._process();
1045
1046
// Shortcuts
1047
var hash = this._hash;
1048
var H = hash.words;
1049
1050
// Swap endian
1051
for (var i = 0; i < 4; i++) {
1052
// Shortcut
1053
var H_i = H[i];
1054
1055
H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
1056
(((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
1057
}
1058
1059
// Return final computed hash
1060
return hash;
1061
},
1062
1063
clone: function () {
1064
var clone = Hasher.clone.call(this);
1065
clone._hash = this._hash.clone();
1066
1067
return clone;
1068
}
1069
});
1070
1071
function FF(a, b, c, d, x, s, t) {
1072
var n = a + ((b & c) | (~b & d)) + x + t;
1073
return ((n << s) | (n >>> (32 - s))) + b;
1074
}
1075
1076
function GG(a, b, c, d, x, s, t) {
1077
var n = a + ((b & d) | (c & ~d)) + x + t;
1078
return ((n << s) | (n >>> (32 - s))) + b;
1079
}
1080
1081
function HH(a, b, c, d, x, s, t) {
1082
var n = a + (b ^ c ^ d) + x + t;
1083
return ((n << s) | (n >>> (32 - s))) + b;
1084
}
1085
1086
function II(a, b, c, d, x, s, t) {
1087
var n = a + (c ^ (b | ~d)) + x + t;
1088
return ((n << s) | (n >>> (32 - s))) + b;
1089
}
1090
1091
/**
1092
* Shortcut function to the hasher's object interface.
1093
*
1094
* @param {WordArray|string} message The message to hash.
1095
*
1096
* @return {WordArray} The hash.
1097
*
1098
* @static
1099
*
1100
* @example
1101
*
1102
* var hash = CryptoJS.MD5('message');
1103
* var hash = CryptoJS.MD5(wordArray);
1104
*/
1105
C.MD5 = Hasher._createHelper(MD5);
1106
1107
/**
1108
* Shortcut function to the HMAC's object interface.
1109
*
1110
* @param {WordArray|string} message The message to hash.
1111
* @param {WordArray|string} key The secret key.
1112
*
1113
* @return {WordArray} The HMAC.
1114
*
1115
* @static
1116
*
1117
* @example
1118
*
1119
* var hmac = CryptoJS.HmacMD5(message, key);
1120
*/
1121
C.HmacMD5 = Hasher._createHmacHelper(MD5);
1122
}(Math));
1123
1124
1125
(function () {
1126
// Shortcuts
1127
var C = CryptoJS;
1128
var C_lib = C.lib;
1129
var WordArray = C_lib.WordArray;
1130
var Hasher = C_lib.Hasher;
1131
var C_algo = C.algo;
1132
1133
// Reusable object
1134
var W = [];
1135
1136
/**
1137
* SHA-1 hash algorithm.
1138
*/
1139
var SHA1 = C_algo.SHA1 = Hasher.extend({
1140
_doReset: function () {
1141
this._hash = new WordArray.init([
1142
0x67452301, 0xefcdab89,
1143
0x98badcfe, 0x10325476,
1144
0xc3d2e1f0
1145
]);
1146
},
1147
1148
_doProcessBlock: function (M, offset) {
1149
// Shortcut
1150
var H = this._hash.words;
1151
1152
// Working variables
1153
var a = H[0];
1154
var b = H[1];
1155
var c = H[2];
1156
var d = H[3];
1157
var e = H[4];
1158
1159
// Computation
1160
for (var i = 0; i < 80; i++) {
1161
if (i < 16) {
1162
W[i] = M[offset + i] | 0;
1163
} else {
1164
var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];
1165
W[i] = (n << 1) | (n >>> 31);
1166
}
1167
1168
var t = ((a << 5) | (a >>> 27)) + e + W[i];
1169
if (i < 20) {
1170
t += ((b & c) | (~b & d)) + 0x5a827999;
1171
} else if (i < 40) {
1172
t += (b ^ c ^ d) + 0x6ed9eba1;
1173
} else if (i < 60) {
1174
t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;
1175
} else /* if (i < 80) */ {
1176
t += (b ^ c ^ d) - 0x359d3e2a;
1177
}
1178
1179
e = d;
1180
d = c;
1181
c = (b << 30) | (b >>> 2);
1182
b = a;
1183
a = t;
1184
}
1185
1186
// Intermediate hash value
1187
H[0] = (H[0] + a) | 0;
1188
H[1] = (H[1] + b) | 0;
1189
H[2] = (H[2] + c) | 0;
1190
H[3] = (H[3] + d) | 0;
1191
H[4] = (H[4] + e) | 0;
1192
},
1193
1194
_doFinalize: function () {
1195
// Shortcuts
1196
var data = this._data;
1197
var dataWords = data.words;
1198
1199
var nBitsTotal = this._nDataBytes * 8;
1200
var nBitsLeft = data.sigBytes * 8;
1201
1202
// Add padding
1203
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
1204
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
1205
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
1206
data.sigBytes = dataWords.length * 4;
1207
1208
// Hash final blocks
1209
this._process();
1210
1211
// Return final computed hash
1212
return this._hash;
1213
},
1214
1215
clone: function () {
1216
var clone = Hasher.clone.call(this);
1217
clone._hash = this._hash.clone();
1218
1219
return clone;
1220
}
1221
});
1222
1223
/**
1224
* Shortcut function to the hasher's object interface.
1225
*
1226
* @param {WordArray|string} message The message to hash.
1227
*
1228
* @return {WordArray} The hash.
1229
*
1230
* @static
1231
*
1232
* @example
1233
*
1234
* var hash = CryptoJS.SHA1('message');
1235
* var hash = CryptoJS.SHA1(wordArray);
1236
*/
1237
C.SHA1 = Hasher._createHelper(SHA1);
1238
1239
/**
1240
* Shortcut function to the HMAC's object interface.
1241
*
1242
* @param {WordArray|string} message The message to hash.
1243
* @param {WordArray|string} key The secret key.
1244
*
1245
* @return {WordArray} The HMAC.
1246
*
1247
* @static
1248
*
1249
* @example
1250
*
1251
* var hmac = CryptoJS.HmacSHA1(message, key);
1252
*/
1253
C.HmacSHA1 = Hasher._createHmacHelper(SHA1);
1254
}());
1255
1256
1257
(function (Math) {
1258
// Shortcuts
1259
var C = CryptoJS;
1260
var C_lib = C.lib;
1261
var WordArray = C_lib.WordArray;
1262
var Hasher = C_lib.Hasher;
1263
var C_algo = C.algo;
1264
1265
// Initialization and round constants tables
1266
var H = [];
1267
var K = [];
1268
1269
// Compute constants
1270
(function () {
1271
function isPrime(n) {
1272
var sqrtN = Math.sqrt(n);
1273
for (var factor = 2; factor <= sqrtN; factor++) {
1274
if (!(n % factor)) {
1275
return false;
1276
}
1277
}
1278
1279
return true;
1280
}
1281
1282
function getFractionalBits(n) {
1283
return ((n - (n | 0)) * 0x100000000) | 0;
1284
}
1285
1286
var n = 2;
1287
var nPrime = 0;
1288
while (nPrime < 64) {
1289
if (isPrime(n)) {
1290
if (nPrime < 8) {
1291
H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));
1292
}
1293
K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));
1294
1295
nPrime++;
1296
}
1297
1298
n++;
1299
}
1300
}());
1301
1302
// Reusable object
1303
var W = [];
1304
1305
/**
1306
* SHA-256 hash algorithm.
1307
*/
1308
var SHA256 = C_algo.SHA256 = Hasher.extend({
1309
_doReset: function () {
1310
this._hash = new WordArray.init(H.slice(0));
1311
},
1312
1313
_doProcessBlock: function (M, offset) {
1314
// Shortcut
1315
var H = this._hash.words;
1316
1317
// Working variables
1318
var a = H[0];
1319
var b = H[1];
1320
var c = H[2];
1321
var d = H[3];
1322
var e = H[4];
1323
var f = H[5];
1324
var g = H[6];
1325
var h = H[7];
1326
1327
// Computation
1328
for (var i = 0; i < 64; i++) {
1329
if (i < 16) {
1330
W[i] = M[offset + i] | 0;
1331
} else {
1332
var gamma0x = W[i - 15];
1333
var gamma0 = ((gamma0x << 25) | (gamma0x >>> 7)) ^
1334
((gamma0x << 14) | (gamma0x >>> 18)) ^
1335
(gamma0x >>> 3);
1336
1337
var gamma1x = W[i - 2];
1338
var gamma1 = ((gamma1x << 15) | (gamma1x >>> 17)) ^
1339
((gamma1x << 13) | (gamma1x >>> 19)) ^
1340
(gamma1x >>> 10);
1341
1342
W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];
1343
}
1344
1345
var ch = (e & f) ^ (~e & g);
1346
var maj = (a & b) ^ (a & c) ^ (b & c);
1347
1348
var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));
1349
var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7) | (e >>> 25));
1350
1351
var t1 = h + sigma1 + ch + K[i] + W[i];
1352
var t2 = sigma0 + maj;
1353
1354
h = g;
1355
g = f;
1356
f = e;
1357
e = (d + t1) | 0;
1358
d = c;
1359
c = b;
1360
b = a;
1361
a = (t1 + t2) | 0;
1362
}
1363
1364
// Intermediate hash value
1365
H[0] = (H[0] + a) | 0;
1366
H[1] = (H[1] + b) | 0;
1367
H[2] = (H[2] + c) | 0;
1368
H[3] = (H[3] + d) | 0;
1369
H[4] = (H[4] + e) | 0;
1370
H[5] = (H[5] + f) | 0;
1371
H[6] = (H[6] + g) | 0;
1372
H[7] = (H[7] + h) | 0;
1373
},
1374
1375
_doFinalize: function () {
1376
// Shortcuts
1377
var data = this._data;
1378
var dataWords = data.words;
1379
1380
var nBitsTotal = this._nDataBytes * 8;
1381
var nBitsLeft = data.sigBytes * 8;
1382
1383
// Add padding
1384
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
1385
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);
1386
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;
1387
data.sigBytes = dataWords.length * 4;
1388
1389
// Hash final blocks
1390
this._process();
1391
1392
// Return final computed hash
1393
return this._hash;
1394
},
1395
1396
clone: function () {
1397
var clone = Hasher.clone.call(this);
1398
clone._hash = this._hash.clone();
1399
1400
return clone;
1401
}
1402
});
1403
1404
/**
1405
* Shortcut function to the hasher's object interface.
1406
*
1407
* @param {WordArray|string} message The message to hash.
1408
*
1409
* @return {WordArray} The hash.
1410
*
1411
* @static
1412
*
1413
* @example
1414
*
1415
* var hash = CryptoJS.SHA256('message');
1416
* var hash = CryptoJS.SHA256(wordArray);
1417
*/
1418
C.SHA256 = Hasher._createHelper(SHA256);
1419
1420
/**
1421
* Shortcut function to the HMAC's object interface.
1422
*
1423
* @param {WordArray|string} message The message to hash.
1424
* @param {WordArray|string} key The secret key.
1425
*
1426
* @return {WordArray} The HMAC.
1427
*
1428
* @static
1429
*
1430
* @example
1431
*
1432
* var hmac = CryptoJS.HmacSHA256(message, key);
1433
*/
1434
C.HmacSHA256 = Hasher._createHmacHelper(SHA256);
1435
}(Math));
1436
1437
1438
(function () {
1439
// Shortcuts
1440
var C = CryptoJS;
1441
var C_lib = C.lib;
1442
var WordArray = C_lib.WordArray;
1443
var C_enc = C.enc;
1444
1445
/**
1446
* UTF-16 BE encoding strategy.
1447
*/
1448
var Utf16BE = C_enc.Utf16 = C_enc.Utf16BE = {
1449
/**
1450
* Converts a word array to a UTF-16 BE string.
1451
*
1452
* @param {WordArray} wordArray The word array.
1453
*
1454
* @return {string} The UTF-16 BE string.
1455
*
1456
* @static
1457
*
1458
* @example
1459
*
1460
* var utf16String = CryptoJS.enc.Utf16.stringify(wordArray);
1461
*/
1462
stringify: function (wordArray) {
1463
// Shortcuts
1464
var words = wordArray.words;
1465
var sigBytes = wordArray.sigBytes;
1466
1467
// Convert
1468
var utf16Chars = [];
1469
for (var i = 0; i < sigBytes; i += 2) {
1470
var codePoint = (words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff;
1471
utf16Chars.push(String.fromCharCode(codePoint));
1472
}
1473
1474
return utf16Chars.join('');
1475
},
1476
1477
/**
1478
* Converts a UTF-16 BE string to a word array.
1479
*
1480
* @param {string} utf16Str The UTF-16 BE string.
1481
*
1482
* @return {WordArray} The word array.
1483
*
1484
* @static
1485
*
1486
* @example
1487
*
1488
* var wordArray = CryptoJS.enc.Utf16.parse(utf16String);
1489
*/
1490
parse: function (utf16Str) {
1491
// Shortcut
1492
var utf16StrLength = utf16Str.length;
1493
1494
// Convert
1495
var words = [];
1496
for (var i = 0; i < utf16StrLength; i++) {
1497
words[i >>> 1] |= utf16Str.charCodeAt(i) << (16 - (i % 2) * 16);
1498
}
1499
1500
return WordArray.create(words, utf16StrLength * 2);
1501
}
1502
};
1503
1504
/**
1505
* UTF-16 LE encoding strategy.
1506
*/
1507
C_enc.Utf16LE = {
1508
/**
1509
* Converts a word array to a UTF-16 LE string.
1510
*
1511
* @param {WordArray} wordArray The word array.
1512
*
1513
* @return {string} The UTF-16 LE string.
1514
*
1515
* @static
1516
*
1517
* @example
1518
*
1519
* var utf16Str = CryptoJS.enc.Utf16LE.stringify(wordArray);
1520
*/
1521
stringify: function (wordArray) {
1522
// Shortcuts
1523
var words = wordArray.words;
1524
var sigBytes = wordArray.sigBytes;
1525
1526
// Convert
1527
var utf16Chars = [];
1528
for (var i = 0; i < sigBytes; i += 2) {
1529
var codePoint = swapEndian((words[i >>> 2] >>> (16 - (i % 4) * 8)) & 0xffff);
1530
utf16Chars.push(String.fromCharCode(codePoint));
1531
}
1532
1533
return utf16Chars.join('');
1534
},
1535
1536
/**
1537
* Converts a UTF-16 LE string to a word array.
1538
*
1539
* @param {string} utf16Str The UTF-16 LE string.
1540
*
1541
* @return {WordArray} The word array.
1542
*
1543
* @static
1544
*
1545
* @example
1546
*
1547
* var wordArray = CryptoJS.enc.Utf16LE.parse(utf16Str);
1548
*/
1549
parse: function (utf16Str) {
1550
// Shortcut
1551
var utf16StrLength = utf16Str.length;
1552
1553
// Convert
1554
var words = [];
1555
for (var i = 0; i < utf16StrLength; i++) {
1556
words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16));
1557
}
1558
1559
return WordArray.create(words, utf16StrLength * 2);
1560
}
1561
};
1562
1563
function swapEndian(word) {
1564
return ((word << 8) & 0xff00ff00) | ((word >>> 8) & 0x00ff00ff);
1565
}
1566
}());
1567
1568
1569
(function () {
1570
// Check if typed arrays are supported
1571
if (typeof ArrayBuffer != 'function') {
1572
return;
1573
}
1574
1575
// Shortcuts
1576
var C = CryptoJS;
1577
var C_lib = C.lib;
1578
var WordArray = C_lib.WordArray;
1579
1580
// Reference original init
1581
var superInit = WordArray.init;
1582
1583
// Augment WordArray.init to handle typed arrays
1584
var subInit = WordArray.init = function (typedArray) {
1585
// Convert buffers to uint8
1586
if (typedArray instanceof ArrayBuffer) {
1587
typedArray = new Uint8Array(typedArray);
1588
}
1589
1590
// Convert other array views to uint8
1591
if (
1592
typedArray instanceof Int8Array ||
1593
(typeof Uint8ClampedArray !== "undefined" && typedArray instanceof Uint8ClampedArray) ||
1594
typedArray instanceof Int16Array ||
1595
typedArray instanceof Uint16Array ||
1596
typedArray instanceof Int32Array ||
1597
typedArray instanceof Uint32Array ||
1598
typedArray instanceof Float32Array ||
1599
typedArray instanceof Float64Array
1600
) {
1601
typedArray = new Uint8Array(typedArray.buffer, typedArray.byteOffset, typedArray.byteLength);
1602
}
1603
1604
// Handle Uint8Array
1605
if (typedArray instanceof Uint8Array) {
1606
// Shortcut
1607
var typedArrayByteLength = typedArray.byteLength;
1608
1609
// Extract bytes
1610
var words = [];
1611
for (var i = 0; i < typedArrayByteLength; i++) {
1612
words[i >>> 2] |= typedArray[i] << (24 - (i % 4) * 8);
1613
}
1614
1615
// Initialize this word array
1616
superInit.call(this, words, typedArrayByteLength);
1617
} else {
1618
// Else call normal init
1619
superInit.apply(this, arguments);
1620
}
1621
};
1622
1623
subInit.prototype = WordArray;
1624
}());
1625
1626
1627
/** @preserve
1628
(c) 2012 by Cédric Mesnil. All rights reserved.
1629
1630
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
1631
1632
- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
1633
- 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.
1634
1635
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.
1636
*/
1637
1638
(function (Math) {
1639
// Shortcuts
1640
var C = CryptoJS;
1641
var C_lib = C.lib;
1642
var WordArray = C_lib.WordArray;
1643
var Hasher = C_lib.Hasher;
1644
var C_algo = C.algo;
1645
1646
// Constants table
1647
var _zl = WordArray.create([
1648
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
1649
7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
1650
3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
1651
1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
1652
4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]);
1653
var _zr = WordArray.create([
1654
5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
1655
6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
1656
15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
1657
8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
1658
12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]);
1659
var _sl = WordArray.create([
1660
11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
1661
7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
1662
11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
1663
11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
1664
9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6 ]);
1665
var _sr = WordArray.create([
1666
8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
1667
9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
1668
9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
1669
15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
1670
8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11 ]);
1671
1672
var _hl = WordArray.create([ 0x00000000, 0x5A827999, 0x6ED9EBA1, 0x8F1BBCDC, 0xA953FD4E]);
1673
var _hr = WordArray.create([ 0x50A28BE6, 0x5C4DD124, 0x6D703EF3, 0x7A6D76E9, 0x00000000]);
1674
1675
/**
1676
* RIPEMD160 hash algorithm.
1677
*/
1678
var RIPEMD160 = C_algo.RIPEMD160 = Hasher.extend({
1679
_doReset: function () {
1680
this._hash = WordArray.create([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]);
1681
},
1682
1683
_doProcessBlock: function (M, offset) {
1684
1685
// Swap endian
1686
for (var i = 0; i < 16; i++) {
1687
// Shortcuts
1688
var offset_i = offset + i;
1689
var M_offset_i = M[offset_i];
1690
1691
// Swap
1692
M[offset_i] = (
1693
(((M_offset_i << 8) | (M_offset_i >>> 24)) & 0x00ff00ff) |
1694
(((M_offset_i << 24) | (M_offset_i >>> 8)) & 0xff00ff00)
1695
);
1696
}
1697
// Shortcut
1698
var H = this._hash.words;
1699
var hl = _hl.words;
1700
var hr = _hr.words;
1701
var zl = _zl.words;
1702
var zr = _zr.words;
1703
var sl = _sl.words;
1704
var sr = _sr.words;
1705
1706
// Working variables
1707
var al, bl, cl, dl, el;
1708
var ar, br, cr, dr, er;
1709
1710
ar = al = H[0];
1711
br = bl = H[1];
1712
cr = cl = H[2];
1713
dr = dl = H[3];
1714
er = el = H[4];
1715
// Computation
1716
var t;
1717
for (var i = 0; i < 80; i += 1) {
1718
t = (al + M[offset+zl[i]])|0;
1719
if (i<16){
1720
t += f1(bl,cl,dl) + hl[0];
1721
} else if (i<32) {
1722
t += f2(bl,cl,dl) + hl[1];
1723
} else if (i<48) {
1724
t += f3(bl,cl,dl) + hl[2];
1725
} else if (i<64) {
1726
t += f4(bl,cl,dl) + hl[3];
1727
} else {// if (i<80) {
1728
t += f5(bl,cl,dl) + hl[4];
1729
}
1730
t = t|0;
1731
t = rotl(t,sl[i]);
1732
t = (t+el)|0;
1733
al = el;
1734
el = dl;
1735
dl = rotl(cl, 10);
1736
cl = bl;
1737
bl = t;
1738
1739
t = (ar + M[offset+zr[i]])|0;
1740
if (i<16){
1741
t += f5(br,cr,dr) + hr[0];
1742
} else if (i<32) {
1743
t += f4(br,cr,dr) + hr[1];
1744
} else if (i<48) {
1745
t += f3(br,cr,dr) + hr[2];
1746
} else if (i<64) {
1747
t += f2(br,cr,dr) + hr[3];
1748
} else {// if (i<80) {
1749
t += f1(br,cr,dr) + hr[4];
1750
}
1751
t = t|0;
1752
t = rotl(t,sr[i]) ;
1753
t = (t+er)|0;
1754
ar = er;
1755
er = dr;
1756
dr = rotl(cr, 10);
1757
cr = br;
1758
br = t;
1759
}
1760
// Intermediate hash value
1761
t = (H[1] + cl + dr)|0;
1762
H[1] = (H[2] + dl + er)|0;
1763
H[2] = (H[3] + el + ar)|0;
1764
H[3] = (H[4] + al + br)|0;
1765
H[4] = (H[0] + bl + cr)|0;
1766
H[0] = t;
1767
},
1768
1769
_doFinalize: function () {
1770
// Shortcuts
1771
var data = this._data;
1772
var dataWords = data.words;
1773
1774
var nBitsTotal = this._nDataBytes * 8;
1775
var nBitsLeft = data.sigBytes * 8;
1776
1777
// Add padding
1778
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
1779
dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = (
1780
(((nBitsTotal << 8) | (nBitsTotal >>> 24)) & 0x00ff00ff) |
1781
(((nBitsTotal << 24) | (nBitsTotal >>> 8)) & 0xff00ff00)
1782
);
1783
data.sigBytes = (dataWords.length + 1) * 4;
1784
1785
// Hash final blocks
1786
this._process();
1787
1788
// Shortcuts
1789
var hash = this._hash;
1790
var H = hash.words;
1791
1792
// Swap endian
1793
for (var i = 0; i < 5; i++) {
1794
// Shortcut
1795
var H_i = H[i];
1796
1797
// Swap
1798
H[i] = (((H_i << 8) | (H_i >>> 24)) & 0x00ff00ff) |
1799
(((H_i << 24) | (H_i >>> 8)) & 0xff00ff00);
1800
}
1801
1802
// Return final computed hash
1803
return hash;
1804
},
1805
1806
clone: function () {
1807
var clone = Hasher.clone.call(this);
1808
clone._hash = this._hash.clone();
1809
1810
return clone;
1811
}
1812
});
1813
1814
1815
function f1(x, y, z) {
1816
return ((x) ^ (y) ^ (z));
1817
1818
}
1819
1820
function f2(x, y, z) {
1821
return (((x)&(y)) | ((~x)&(z)));
1822
}
1823
1824
function f3(x, y, z) {
1825
return (((x) | (~(y))) ^ (z));
1826
}
1827
1828
function f4(x, y, z) {
1829
return (((x) & (z)) | ((y)&(~(z))));
1830
}
1831
1832
function f5(x, y, z) {
1833
return ((x) ^ ((y) |(~(z))));
1834
1835
}
1836
1837
function rotl(x,n) {
1838
return (x<<n) | (x>>>(32-n));
1839
}
1840
1841
1842
/**
1843
* Shortcut function to the hasher's object interface.
1844
*
1845
* @param {WordArray|string} message The message to hash.
1846
*
1847
* @return {WordArray} The hash.
1848
*
1849
* @static
1850
*
1851
* @example
1852
*
1853
* var hash = CryptoJS.RIPEMD160('message');
1854
* var hash = CryptoJS.RIPEMD160(wordArray);
1855
*/
1856
C.RIPEMD160 = Hasher._createHelper(RIPEMD160);
1857
1858
/**
1859
* Shortcut function to the HMAC's object interface.
1860
*
1861
* @param {WordArray|string} message The message to hash.
1862
* @param {WordArray|string} key The secret key.
1863
*
1864
* @return {WordArray} The HMAC.
1865
*
1866
* @static
1867
*
1868
* @example
1869
*
1870
* var hmac = CryptoJS.HmacRIPEMD160(message, key);
1871
*/
1872
C.HmacRIPEMD160 = Hasher._createHmacHelper(RIPEMD160);
1873
}(Math));
1874
1875
1876
(function () {
1877
// Shortcuts
1878
var C = CryptoJS;
1879
var C_lib = C.lib;
1880
var Base = C_lib.Base;
1881
var C_enc = C.enc;
1882
var Utf8 = C_enc.Utf8;
1883
var C_algo = C.algo;
1884
1885
/**
1886
* HMAC algorithm.
1887
*/
1888
var HMAC = C_algo.HMAC = Base.extend({
1889
/**
1890
* Initializes a newly created HMAC.
1891
*
1892
* @param {Hasher} hasher The hash algorithm to use.
1893
* @param {WordArray|string} key The secret key.
1894
*
1895
* @example
1896
*
1897
* var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
1898
*/
1899
init: function (hasher, key) {
1900
// Init hasher
1901
hasher = this._hasher = new hasher.init();
1902
1903
// Convert string to WordArray, else assume WordArray already
1904
if (typeof key == 'string') {
1905
key = Utf8.parse(key);
1906
}
1907
1908
// Shortcuts
1909
var hasherBlockSize = hasher.blockSize;
1910
var hasherBlockSizeBytes = hasherBlockSize * 4;
1911
1912
// Allow arbitrary length keys
1913
if (key.sigBytes > hasherBlockSizeBytes) {
1914
key = hasher.finalize(key);
1915
}
1916
1917
// Clamp excess bits
1918
key.clamp();
1919
1920
// Clone key for inner and outer pads
1921
var oKey = this._oKey = key.clone();
1922
var iKey = this._iKey = key.clone();
1923
1924
// Shortcuts
1925
var oKeyWords = oKey.words;
1926
var iKeyWords = iKey.words;
1927
1928
// XOR keys with pad constants
1929
for (var i = 0; i < hasherBlockSize; i++) {
1930
oKeyWords[i] ^= 0x5c5c5c5c;
1931
iKeyWords[i] ^= 0x36363636;
1932
}
1933
oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;
1934
1935
// Set initial values
1936
this.reset();
1937
},
1938
1939
/**
1940
* Resets this HMAC to its initial state.
1941
*
1942
* @example
1943
*
1944
* hmacHasher.reset();
1945
*/
1946
reset: function () {
1947
// Shortcut
1948
var hasher = this._hasher;
1949
1950
// Reset
1951
hasher.reset();
1952
hasher.update(this._iKey);
1953
},
1954
1955
/**
1956
* Updates this HMAC with a message.
1957
*
1958
* @param {WordArray|string} messageUpdate The message to append.
1959
*
1960
* @return {HMAC} This HMAC instance.
1961
*
1962
* @example
1963
*
1964
* hmacHasher.update('message');
1965
* hmacHasher.update(wordArray);
1966
*/
1967
update: function (messageUpdate) {
1968
this._hasher.update(messageUpdate);
1969
1970
// Chainable
1971
return this;
1972
},
1973
1974
/**
1975
* Finalizes the HMAC computation.
1976
* Note that the finalize operation is effectively a destructive, read-once operation.
1977
*
1978
* @param {WordArray|string} messageUpdate (Optional) A final message update.
1979
*
1980
* @return {WordArray} The HMAC.
1981
*
1982
* @example
1983
*
1984
* var hmac = hmacHasher.finalize();
1985
* var hmac = hmacHasher.finalize('message');
1986
* var hmac = hmacHasher.finalize(wordArray);
1987
*/
1988
finalize: function (messageUpdate) {
1989
// Shortcut
1990
var hasher = this._hasher;
1991
1992
// Compute HMAC
1993
var innerHash = hasher.finalize(messageUpdate);
1994
hasher.reset();
1995
var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));
1996
1997
return hmac;
1998
}
1999
});
2000
}());
2001
2002
2003
(function () {
2004
// Shortcuts
2005
var C = CryptoJS;
2006
var C_lib = C.lib;
2007
var Base = C_lib.Base;
2008
var WordArray = C_lib.WordArray;
2009
var C_algo = C.algo;
2010
var SHA1 = C_algo.SHA1;
2011
var HMAC = C_algo.HMAC;
2012
2013
/**
2014
* Password-Based Key Derivation Function 2 algorithm.
2015
*/
2016
var PBKDF2 = C_algo.PBKDF2 = Base.extend({
2017
/**
2018
* Configuration options.
2019
*
2020
* @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
2021
* @property {Hasher} hasher The hasher to use. Default: SHA1
2022
* @property {number} iterations The number of iterations to perform. Default: 1
2023
*/
2024
cfg: Base.extend({
2025
keySize: 128/32,
2026
hasher: SHA1,
2027
iterations: 1
2028
}),
2029
2030
/**
2031
* Initializes a newly created key derivation function.
2032
*
2033
* @param {Object} cfg (Optional) The configuration options to use for the derivation.
2034
*
2035
* @example
2036
*
2037
* var kdf = CryptoJS.algo.PBKDF2.create();
2038
* var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8 });
2039
* var kdf = CryptoJS.algo.PBKDF2.create({ keySize: 8, iterations: 1000 });
2040
*/
2041
init: function (cfg) {
2042
this.cfg = this.cfg.extend(cfg);
2043
},
2044
2045
/**
2046
* Computes the Password-Based Key Derivation Function 2.
2047
*
2048
* @param {WordArray|string} password The password.
2049
* @param {WordArray|string} salt A salt.
2050
*
2051
* @return {WordArray} The derived key.
2052
*
2053
* @example
2054
*
2055
* var key = kdf.compute(password, salt);
2056
*/
2057
compute: function (password, salt) {
2058
// Shortcut
2059
var cfg = this.cfg;
2060
2061
// Init HMAC
2062
var hmac = HMAC.create(cfg.hasher, password);
2063
2064
// Initial values
2065
var derivedKey = WordArray.create();
2066
var blockIndex = WordArray.create([0x00000001]);
2067
2068
// Shortcuts
2069
var derivedKeyWords = derivedKey.words;
2070
var blockIndexWords = blockIndex.words;
2071
var keySize = cfg.keySize;
2072
var iterations = cfg.iterations;
2073
2074
// Generate key
2075
while (derivedKeyWords.length < keySize) {
2076
var block = hmac.update(salt).finalize(blockIndex);
2077
hmac.reset();
2078
2079
// Shortcuts
2080
var blockWords = block.words;
2081
var blockWordsLength = blockWords.length;
2082
2083
// Iterations
2084
var intermediate = block;
2085
for (var i = 1; i < iterations; i++) {
2086
intermediate = hmac.finalize(intermediate);
2087
hmac.reset();
2088
2089
// Shortcut
2090
var intermediateWords = intermediate.words;
2091
2092
// XOR intermediate with block
2093
for (var j = 0; j < blockWordsLength; j++) {
2094
blockWords[j] ^= intermediateWords[j];
2095
}
2096
}
2097
2098
derivedKey.concat(block);
2099
blockIndexWords[0]++;
2100
}
2101
derivedKey.sigBytes = keySize * 4;
2102
2103
return derivedKey;
2104
}
2105
});
2106
2107
/**
2108
* Computes the Password-Based Key Derivation Function 2.
2109
*
2110
* @param {WordArray|string} password The password.
2111
* @param {WordArray|string} salt A salt.
2112
* @param {Object} cfg (Optional) The configuration options to use for this computation.
2113
*
2114
* @return {WordArray} The derived key.
2115
*
2116
* @static
2117
*
2118
* @example
2119
*
2120
* var key = CryptoJS.PBKDF2(password, salt);
2121
* var key = CryptoJS.PBKDF2(password, salt, { keySize: 8 });
2122
* var key = CryptoJS.PBKDF2(password, salt, { keySize: 8, iterations: 1000 });
2123
*/
2124
C.PBKDF2 = function (password, salt, cfg) {
2125
return PBKDF2.create(cfg).compute(password, salt);
2126
};
2127
}());
2128
2129
2130
(function () {
2131
// Shortcuts
2132
var C = CryptoJS;
2133
var C_lib = C.lib;
2134
var Base = C_lib.Base;
2135
var WordArray = C_lib.WordArray;
2136
var C_algo = C.algo;
2137
var MD5 = C_algo.MD5;
2138
2139
/**
2140
* This key derivation function is meant to conform with EVP_BytesToKey.
2141
* www.openssl.org/docs/crypto/EVP_BytesToKey.html
2142
*/
2143
var EvpKDF = C_algo.EvpKDF = Base.extend({
2144
/**
2145
* Configuration options.
2146
*
2147
* @property {number} keySize The key size in words to generate. Default: 4 (128 bits)
2148
* @property {Hasher} hasher The hash algorithm to use. Default: MD5
2149
* @property {number} iterations The number of iterations to perform. Default: 1
2150
*/
2151
cfg: Base.extend({
2152
keySize: 128/32,
2153
hasher: MD5,
2154
iterations: 1
2155
}),
2156
2157
/**
2158
* Initializes a newly created key derivation function.
2159
*
2160
* @param {Object} cfg (Optional) The configuration options to use for the derivation.
2161
*
2162
* @example
2163
*
2164
* var kdf = CryptoJS.algo.EvpKDF.create();
2165
* var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8 });
2166
* var kdf = CryptoJS.algo.EvpKDF.create({ keySize: 8, iterations: 1000 });
2167
*/
2168
init: function (cfg) {
2169
this.cfg = this.cfg.extend(cfg);
2170
},
2171
2172
/**
2173
* Derives a key from a password.
2174
*
2175
* @param {WordArray|string} password The password.
2176
* @param {WordArray|string} salt A salt.
2177
*
2178
* @return {WordArray} The derived key.
2179
*
2180
* @example
2181
*
2182
* var key = kdf.compute(password, salt);
2183
*/
2184
compute: function (password, salt) {
2185
// Shortcut
2186
var cfg = this.cfg;
2187
2188
// Init hasher
2189
var hasher = cfg.hasher.create();
2190
2191
// Initial values
2192
var derivedKey = WordArray.create();
2193
2194
// Shortcuts
2195
var derivedKeyWords = derivedKey.words;
2196
var keySize = cfg.keySize;
2197
var iterations = cfg.iterations;
2198
2199
// Generate key
2200
while (derivedKeyWords.length < keySize) {
2201
if (block) {
2202
hasher.update(block);
2203
}
2204
var block = hasher.update(password).finalize(salt);
2205
hasher.reset();
2206
2207
// Iterations
2208
for (var i = 1; i < iterations; i++) {
2209
block = hasher.finalize(block);
2210
hasher.reset();
2211
}
2212
2213
derivedKey.concat(block);
2214
}
2215
derivedKey.sigBytes = keySize * 4;
2216
2217
return derivedKey;
2218
}
2219
});
2220
2221
/**
2222
* Derives a key from a password.
2223
*
2224
* @param {WordArray|string} password The password.
2225
* @param {WordArray|string} salt A salt.
2226
* @param {Object} cfg (Optional) The configuration options to use for this computation.
2227
*
2228
* @return {WordArray} The derived key.
2229
*
2230
* @static
2231
*
2232
* @example
2233
*
2234
* var key = CryptoJS.EvpKDF(password, salt);
2235
* var key = CryptoJS.EvpKDF(password, salt, { keySize: 8 });
2236
* var key = CryptoJS.EvpKDF(password, salt, { keySize: 8, iterations: 1000 });
2237
*/
2238
C.EvpKDF = function (password, salt, cfg) {
2239
return EvpKDF.create(cfg).compute(password, salt);
2240
};
2241
}());
2242
2243
2244
(function () {
2245
// Shortcuts
2246
var C = CryptoJS;
2247
var C_lib = C.lib;
2248
var WordArray = C_lib.WordArray;
2249
var C_algo = C.algo;
2250
var SHA256 = C_algo.SHA256;
2251
2252
/**
2253
* SHA-224 hash algorithm.
2254
*/
2255
var SHA224 = C_algo.SHA224 = SHA256.extend({
2256
_doReset: function () {
2257
this._hash = new WordArray.init([
2258
0xc1059ed8, 0x367cd507, 0x3070dd17, 0xf70e5939,
2259
0xffc00b31, 0x68581511, 0x64f98fa7, 0xbefa4fa4
2260
]);
2261
},
2262
2263
_doFinalize: function () {
2264
var hash = SHA256._doFinalize.call(this);
2265
2266
hash.sigBytes -= 4;
2267
2268
return hash;
2269
}
2270
});
2271
2272
/**
2273
* Shortcut function to the hasher's object interface.
2274
*
2275
* @param {WordArray|string} message The message to hash.
2276
*
2277
* @return {WordArray} The hash.
2278
*
2279
* @static
2280
*
2281
* @example
2282
*
2283
* var hash = CryptoJS.SHA224('message');
2284
* var hash = CryptoJS.SHA224(wordArray);
2285
*/
2286
C.SHA224 = SHA256._createHelper(SHA224);
2287
2288
/**
2289
* Shortcut function to the HMAC's object interface.
2290
*
2291
* @param {WordArray|string} message The message to hash.
2292
* @param {WordArray|string} key The secret key.
2293
*
2294
* @return {WordArray} The HMAC.
2295
*
2296
* @static
2297
*
2298
* @example
2299
*
2300
* var hmac = CryptoJS.HmacSHA224(message, key);
2301
*/
2302
C.HmacSHA224 = SHA256._createHmacHelper(SHA224);
2303
}());
2304
2305
2306
(function (undefined) {
2307
// Shortcuts
2308
var C = CryptoJS;
2309
var C_lib = C.lib;
2310
var Base = C_lib.Base;
2311
var X32WordArray = C_lib.WordArray;
2312
2313
/**
2314
* x64 namespace.
2315
*/
2316
var C_x64 = C.x64 = {};
2317
2318
/**
2319
* A 64-bit word.
2320
*/
2321
var X64Word = C_x64.Word = Base.extend({
2322
/**
2323
* Initializes a newly created 64-bit word.
2324
*
2325
* @param {number} high The high 32 bits.
2326
* @param {number} low The low 32 bits.
2327
*
2328
* @example
2329
*
2330
* var x64Word = CryptoJS.x64.Word.create(0x00010203, 0x04050607);
2331
*/
2332
init: function (high, low) {
2333
this.high = high;
2334
this.low = low;
2335
}
2336
2337
/**
2338
* Bitwise NOTs this word.
2339
*
2340
* @return {X64Word} A new x64-Word object after negating.
2341
*
2342
* @example
2343
*
2344
* var negated = x64Word.not();
2345
*/
2346
// not: function () {
2347
// var high = ~this.high;
2348
// var low = ~this.low;
2349
2350
// return X64Word.create(high, low);
2351
// },
2352
2353
/**
2354
* Bitwise ANDs this word with the passed word.
2355
*
2356
* @param {X64Word} word The x64-Word to AND with this word.
2357
*
2358
* @return {X64Word} A new x64-Word object after ANDing.
2359
*
2360
* @example
2361
*
2362
* var anded = x64Word.and(anotherX64Word);
2363
*/
2364
// and: function (word) {
2365
// var high = this.high & word.high;
2366
// var low = this.low & word.low;
2367
2368
// return X64Word.create(high, low);
2369
// },
2370
2371
/**
2372
* Bitwise ORs this word with the passed word.
2373
*
2374
* @param {X64Word} word The x64-Word to OR with this word.
2375
*
2376
* @return {X64Word} A new x64-Word object after ORing.
2377
*
2378
* @example
2379
*
2380
* var ored = x64Word.or(anotherX64Word);
2381
*/
2382
// or: function (word) {
2383
// var high = this.high | word.high;
2384
// var low = this.low | word.low;
2385
2386
// return X64Word.create(high, low);
2387
// },
2388
2389
/**
2390
* Bitwise XORs this word with the passed word.
2391
*
2392
* @param {X64Word} word The x64-Word to XOR with this word.
2393
*
2394
* @return {X64Word} A new x64-Word object after XORing.
2395
*
2396
* @example
2397
*
2398
* var xored = x64Word.xor(anotherX64Word);
2399
*/
2400
// xor: function (word) {
2401
// var high = this.high ^ word.high;
2402
// var low = this.low ^ word.low;
2403
2404
// return X64Word.create(high, low);
2405
// },
2406
2407
/**
2408
* Shifts this word n bits to the left.
2409
*
2410
* @param {number} n The number of bits to shift.
2411
*
2412
* @return {X64Word} A new x64-Word object after shifting.
2413
*
2414
* @example
2415
*
2416
* var shifted = x64Word.shiftL(25);
2417
*/
2418
// shiftL: function (n) {
2419
// if (n < 32) {
2420
// var high = (this.high << n) | (this.low >>> (32 - n));
2421
// var low = this.low << n;
2422
// } else {
2423
// var high = this.low << (n - 32);
2424
// var low = 0;
2425
// }
2426
2427
// return X64Word.create(high, low);
2428
// },
2429
2430
/**
2431
* Shifts this word n bits to the right.
2432
*
2433
* @param {number} n The number of bits to shift.
2434
*
2435
* @return {X64Word} A new x64-Word object after shifting.
2436
*
2437
* @example
2438
*
2439
* var shifted = x64Word.shiftR(7);
2440
*/
2441
// shiftR: function (n) {
2442
// if (n < 32) {
2443
// var low = (this.low >>> n) | (this.high << (32 - n));
2444
// var high = this.high >>> n;
2445
// } else {
2446
// var low = this.high >>> (n - 32);
2447
// var high = 0;
2448
// }
2449
2450
// return X64Word.create(high, low);
2451
// },
2452
2453
/**
2454
* Rotates this word n bits to the left.
2455
*
2456
* @param {number} n The number of bits to rotate.
2457
*
2458
* @return {X64Word} A new x64-Word object after rotating.
2459
*
2460
* @example
2461
*
2462
* var rotated = x64Word.rotL(25);
2463
*/
2464
// rotL: function (n) {
2465
// return this.shiftL(n).or(this.shiftR(64 - n));
2466
// },
2467
2468
/**
2469
* Rotates this word n bits to the right.
2470
*
2471
* @param {number} n The number of bits to rotate.
2472
*
2473
* @return {X64Word} A new x64-Word object after rotating.
2474
*
2475
* @example
2476
*
2477
* var rotated = x64Word.rotR(7);
2478
*/
2479
// rotR: function (n) {
2480
// return this.shiftR(n).or(this.shiftL(64 - n));
2481
// },
2482
2483
/**
2484
* Adds this word with the passed word.
2485
*
2486
* @param {X64Word} word The x64-Word to add with this word.
2487
*
2488
* @return {X64Word} A new x64-Word object after adding.
2489
*
2490
* @example
2491
*
2492
* var added = x64Word.add(anotherX64Word);
2493
*/
2494
// add: function (word) {
2495
// var low = (this.low + word.low) | 0;
2496
// var carry = (low >>> 0) < (this.low >>> 0) ? 1 : 0;
2497
// var high = (this.high + word.high + carry) | 0;
2498
2499
// return X64Word.create(high, low);
2500
// }
2501
});
2502
2503
/**
2504
* An array of 64-bit words.
2505
*
2506
* @property {Array} words The array of CryptoJS.x64.Word objects.
2507
* @property {number} sigBytes The number of significant bytes in this word array.
2508
*/
2509
var X64WordArray = C_x64.WordArray = Base.extend({
2510
/**
2511
* Initializes a newly created word array.
2512
*
2513
* @param {Array} words (Optional) An array of CryptoJS.x64.Word objects.
2514
* @param {number} sigBytes (Optional) The number of significant bytes in the words.
2515
*
2516
* @example
2517
*
2518
* var wordArray = CryptoJS.x64.WordArray.create();
2519
*
2520
* var wordArray = CryptoJS.x64.WordArray.create([
2521
* CryptoJS.x64.Word.create(0x00010203, 0x04050607),
2522
* CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
2523
* ]);
2524
*
2525
* var wordArray = CryptoJS.x64.WordArray.create([
2526
* CryptoJS.x64.Word.create(0x00010203, 0x04050607),
2527
* CryptoJS.x64.Word.create(0x18191a1b, 0x1c1d1e1f)
2528
* ], 10);
2529
*/
2530
init: function (words, sigBytes) {
2531
words = this.words = words || [];
2532
2533
if (sigBytes != undefined) {
2534
this.sigBytes = sigBytes;
2535
} else {
2536
this.sigBytes = words.length * 8;
2537
}
2538
},
2539
2540
/**
2541
* Converts this 64-bit word array to a 32-bit word array.
2542
*
2543
* @return {CryptoJS.lib.WordArray} This word array's data as a 32-bit word array.
2544
*
2545
* @example
2546
*
2547
* var x32WordArray = x64WordArray.toX32();
2548
*/
2549
toX32: function () {
2550
// Shortcuts
2551
var x64Words = this.words;
2552
var x64WordsLength = x64Words.length;
2553
2554
// Convert
2555
var x32Words = [];
2556
for (var i = 0; i < x64WordsLength; i++) {
2557
var x64Word = x64Words[i];
2558
x32Words.push(x64Word.high);
2559
x32Words.push(x64Word.low);
2560
}
2561
2562
return X32WordArray.create(x32Words, this.sigBytes);
2563
},
2564
2565
/**
2566
* Creates a copy of this word array.
2567
*
2568
* @return {X64WordArray} The clone.
2569
*
2570
* @example
2571
*
2572
* var clone = x64WordArray.clone();
2573
*/
2574
clone: function () {
2575
var clone = Base.clone.call(this);
2576
2577
// Clone "words" array
2578
var words = clone.words = this.words.slice(0);
2579
2580
// Clone each X64Word object
2581
var wordsLength = words.length;
2582
for (var i = 0; i < wordsLength; i++) {
2583
words[i] = words[i].clone();
2584
}
2585
2586
return clone;
2587
}
2588
});
2589
}());
2590
2591
2592
(function (Math) {
2593
// Shortcuts
2594
var C = CryptoJS;
2595
var C_lib = C.lib;
2596
var WordArray = C_lib.WordArray;
2597
var Hasher = C_lib.Hasher;
2598
var C_x64 = C.x64;
2599
var X64Word = C_x64.Word;
2600
var C_algo = C.algo;
2601
2602
// Constants tables
2603
var RHO_OFFSETS = [];
2604
var PI_INDEXES = [];
2605
var ROUND_CONSTANTS = [];
2606
2607
// Compute Constants
2608
(function () {
2609
// Compute rho offset constants
2610
var x = 1, y = 0;
2611
for (var t = 0; t < 24; t++) {
2612
RHO_OFFSETS[x + 5 * y] = ((t + 1) * (t + 2) / 2) % 64;
2613
2614
var newX = y % 5;
2615
var newY = (2 * x + 3 * y) % 5;
2616
x = newX;
2617
y = newY;
2618
}
2619
2620
// Compute pi index constants
2621
for (var x = 0; x < 5; x++) {
2622
for (var y = 0; y < 5; y++) {
2623
PI_INDEXES[x + 5 * y] = y + ((2 * x + 3 * y) % 5) * 5;
2624
}
2625
}
2626
2627
// Compute round constants
2628
var LFSR = 0x01;
2629
for (var i = 0; i < 24; i++) {
2630
var roundConstantMsw = 0;
2631
var roundConstantLsw = 0;
2632
2633
for (var j = 0; j < 7; j++) {
2634
if (LFSR & 0x01) {
2635
var bitPosition = (1 << j) - 1;
2636
if (bitPosition < 32) {
2637
roundConstantLsw ^= 1 << bitPosition;
2638
} else /* if (bitPosition >= 32) */ {
2639
roundConstantMsw ^= 1 << (bitPosition - 32);
2640
}
2641
}
2642
2643
// Compute next LFSR
2644
if (LFSR & 0x80) {
2645
// Primitive polynomial over GF(2): x^8 + x^6 + x^5 + x^4 + 1
2646
LFSR = (LFSR << 1) ^ 0x71;
2647
} else {
2648
LFSR <<= 1;
2649
}
2650
}
2651
2652
ROUND_CONSTANTS[i] = X64Word.create(roundConstantMsw, roundConstantLsw);
2653
}
2654
}());
2655
2656
// Reusable objects for temporary values
2657
var T = [];
2658
(function () {
2659
for (var i = 0; i < 25; i++) {
2660
T[i] = X64Word.create();
2661
}
2662
}());
2663
2664
/**
2665
* SHA-3 hash algorithm.
2666
*/
2667
var SHA3 = C_algo.SHA3 = Hasher.extend({
2668
/**
2669
* Configuration options.
2670
*
2671
* @property {number} outputLength
2672
* The desired number of bits in the output hash.
2673
* Only values permitted are: 224, 256, 384, 512.
2674
* Default: 512
2675
*/
2676
cfg: Hasher.cfg.extend({
2677
outputLength: 512
2678
}),
2679
2680
_doReset: function () {
2681
var state = this._state = []
2682
for (var i = 0; i < 25; i++) {
2683
state[i] = new X64Word.init();
2684
}
2685
2686
this.blockSize = (1600 - 2 * this.cfg.outputLength) / 32;
2687
},
2688
2689
_doProcessBlock: function (M, offset) {
2690
// Shortcuts
2691
var state = this._state;
2692
var nBlockSizeLanes = this.blockSize / 2;
2693
2694
// Absorb
2695
for (var i = 0; i < nBlockSizeLanes; i++) {
2696
// Shortcuts
2697
var M2i = M[offset + 2 * i];
2698
var M2i1 = M[offset + 2 * i + 1];
2699
2700
// Swap endian
2701
M2i = (
2702
(((M2i << 8) | (M2i >>> 24)) & 0x00ff00ff) |
2703
(((M2i << 24) | (M2i >>> 8)) & 0xff00ff00)
2704
);
2705
M2i1 = (
2706
(((M2i1 << 8) | (M2i1 >>> 24)) & 0x00ff00ff) |
2707
(((M2i1 << 24) | (M2i1 >>> 8)) & 0xff00ff00)
2708
);
2709
2710
// Absorb message into state
2711
var lane = state[i];
2712
lane.high ^= M2i1;
2713
lane.low ^= M2i;
2714
}
2715
2716
// Rounds
2717
for (var round = 0; round < 24; round++) {
2718
// Theta
2719
for (var x = 0; x < 5; x++) {
2720
// Mix column lanes
2721
var tMsw = 0, tLsw = 0;
2722
for (var y = 0; y < 5; y++) {
2723
var lane = state[x + 5 * y];
2724
tMsw ^= lane.high;
2725
tLsw ^= lane.low;
2726
}
2727
2728
// Temporary values
2729
var Tx = T[x];
2730
Tx.high = tMsw;
2731
Tx.low = tLsw;
2732
}
2733
for (var x = 0; x < 5; x++) {
2734
// Shortcuts
2735
var Tx4 = T[(x + 4) % 5];
2736
var Tx1 = T[(x + 1) % 5];
2737
var Tx1Msw = Tx1.high;
2738
var Tx1Lsw = Tx1.low;
2739
2740
// Mix surrounding columns
2741
var tMsw = Tx4.high ^ ((Tx1Msw << 1) | (Tx1Lsw >>> 31));
2742
var tLsw = Tx4.low ^ ((Tx1Lsw << 1) | (Tx1Msw >>> 31));
2743
for (var y = 0; y < 5; y++) {
2744
var lane = state[x + 5 * y];
2745
lane.high ^= tMsw;
2746
lane.low ^= tLsw;
2747
}
2748
}
2749
2750
// Rho Pi
2751
for (var laneIndex = 1; laneIndex < 25; laneIndex++) {
2752
// Shortcuts
2753
var lane = state[laneIndex];
2754
var laneMsw = lane.high;
2755
var laneLsw = lane.low;
2756
var rhoOffset = RHO_OFFSETS[laneIndex];
2757
2758
// Rotate lanes
2759
if (rhoOffset < 32) {
2760
var tMsw = (laneMsw << rhoOffset) | (laneLsw >>> (32 - rhoOffset));
2761
var tLsw = (laneLsw << rhoOffset) | (laneMsw >>> (32 - rhoOffset));
2762
} else /* if (rhoOffset >= 32) */ {
2763
var tMsw = (laneLsw << (rhoOffset - 32)) | (laneMsw >>> (64 - rhoOffset));
2764
var tLsw = (laneMsw << (rhoOffset - 32)) | (laneLsw >>> (64 - rhoOffset));
2765
}
2766
2767
// Transpose lanes
2768
var TPiLane = T[PI_INDEXES[laneIndex]];
2769
TPiLane.high = tMsw;
2770
TPiLane.low = tLsw;
2771
}
2772
2773
// Rho pi at x = y = 0
2774
var T0 = T[0];
2775
var state0 = state[0];
2776
T0.high = state0.high;
2777
T0.low = state0.low;
2778
2779
// Chi
2780
for (var x = 0; x < 5; x++) {
2781
for (var y = 0; y < 5; y++) {
2782
// Shortcuts
2783
var laneIndex = x + 5 * y;
2784
var lane = state[laneIndex];
2785
var TLane = T[laneIndex];
2786
var Tx1Lane = T[((x + 1) % 5) + 5 * y];
2787
var Tx2Lane = T[((x + 2) % 5) + 5 * y];
2788
2789
// Mix rows
2790
lane.high = TLane.high ^ (~Tx1Lane.high & Tx2Lane.high);
2791
lane.low = TLane.low ^ (~Tx1Lane.low & Tx2Lane.low);
2792
}
2793
}
2794
2795
// Iota
2796
var lane = state[0];
2797
var roundConstant = ROUND_CONSTANTS[round];
2798
lane.high ^= roundConstant.high;
2799
lane.low ^= roundConstant.low;;
2800
}
2801
},
2802
2803
_doFinalize: function () {
2804
// Shortcuts
2805
var data = this._data;
2806
var dataWords = data.words;
2807
var nBitsTotal = this._nDataBytes * 8;
2808
var nBitsLeft = data.sigBytes * 8;
2809
var blockSizeBits = this.blockSize * 32;
2810
2811
// Add padding
2812
dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32);
2813
dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80;
2814
data.sigBytes = dataWords.length * 4;
2815
2816
// Hash final blocks
2817
this._process();
2818
2819
// Shortcuts
2820
var state = this._state;
2821
var outputLengthBytes = this.cfg.outputLength / 8;
2822
var outputLengthLanes = outputLengthBytes / 8;
2823
2824
// Squeeze
2825
var hashWords = [];
2826
for (var i = 0; i < outputLengthLanes; i++) {
2827
// Shortcuts
2828
var lane = state[i];
2829
var laneMsw = lane.high;
2830
var laneLsw = lane.low;
2831
2832
// Swap endian
2833
laneMsw = (
2834
(((laneMsw << 8) | (laneMsw >>> 24)) & 0x00ff00ff) |
2835
(((laneMsw << 24) | (laneMsw >>> 8)) & 0xff00ff00)
2836
);
2837
laneLsw = (
2838
(((laneLsw << 8) | (laneLsw >>> 24)) & 0x00ff00ff) |
2839
(((laneLsw << 24) | (laneLsw >>> 8)) & 0xff00ff00)
2840
);
2841
2842
// Squeeze state to retrieve hash
2843
hashWords.push(laneLsw);
2844
hashWords.push(laneMsw);
2845
}
2846
2847
// Return final computed hash
2848
return new WordArray.init(hashWords, outputLengthBytes);
2849
},
2850
2851
clone: function () {
2852
var clone = Hasher.clone.call(this);
2853
2854
var state = clone._state = this._state.slice(0);
2855
for (var i = 0; i < 25; i++) {
2856
state[i] = state[i].clone();
2857
}
2858
2859
return clone;
2860
}
2861
});
2862
2863
/**
2864
* Shortcut function to the hasher's object interface.
2865
*
2866
* @param {WordArray|string} message The message to hash.
2867
*
2868
* @return {WordArray} The hash.
2869
*
2870
* @static
2871
*
2872
* @example
2873
*
2874
* var hash = CryptoJS.SHA3('message');
2875
* var hash = CryptoJS.SHA3(wordArray);
2876
*/
2877
C.SHA3 = Hasher._createHelper(SHA3);
2878
2879
/**
2880
* Shortcut function to the HMAC's object interface.
2881
*
2882
* @param {WordArray|string} message The message to hash.
2883
* @param {WordArray|string} key The secret key.
2884
*
2885
* @return {WordArray} The HMAC.
2886
*
2887
* @static
2888
*
2889
* @example
2890
*
2891
* var hmac = CryptoJS.HmacSHA3(message, key);
2892
*/
2893
C.HmacSHA3 = Hasher._createHmacHelper(SHA3);
2894
}(Math));
2895
2896
2897
(function () {
2898
// Shortcuts
2899
var C = CryptoJS;
2900
var C_lib = C.lib;
2901
var Hasher = C_lib.Hasher;
2902
var C_x64 = C.x64;
2903
var X64Word = C_x64.Word;
2904
var X64WordArray = C_x64.WordArray;
2905
var C_algo = C.algo;
2906
2907
function X64Word_create() {
2908
return X64Word.create.apply(X64Word, arguments);
2909
}
2910
2911
// Constants
2912
var K = [
2913
X64Word_create(0x428a2f98, 0xd728ae22), X64Word_create(0x71374491, 0x23ef65cd),
2914
X64Word_create(0xb5c0fbcf, 0xec4d3b2f), X64Word_create(0xe9b5dba5, 0x8189dbbc),
2915
X64Word_create(0x3956c25b, 0xf348b538), X64Word_create(0x59f111f1, 0xb605d019),
2916
X64Word_create(0x923f82a4, 0xaf194f9b), X64Word_create(0xab1c5ed5, 0xda6d8118),
2917
X64Word_create(0xd807aa98, 0xa3030242), X64Word_create(0x12835b01, 0x45706fbe),
2918
X64Word_create(0x243185be, 0x4ee4b28c), X64Word_create(0x550c7dc3, 0xd5ffb4e2),
2919
X64Word_create(0x72be5d74, 0xf27b896f), X64Word_create(0x80deb1fe, 0x3b1696b1),
2920
X64Word_create(0x9bdc06a7, 0x25c71235), X64Word_create(0xc19bf174, 0xcf692694),
2921
X64Word_create(0xe49b69c1, 0x9ef14ad2), X64Word_create(0xefbe4786, 0x384f25e3),
2922
X64Word_create(0x0fc19dc6, 0x8b8cd5b5), X64Word_create(0x240ca1cc, 0x77ac9c65),
2923
X64Word_create(0x2de92c6f, 0x592b0275), X64Word_create(0x4a7484aa, 0x6ea6e483),
2924
X64Word_create(0x5cb0a9dc, 0xbd41fbd4), X64Word_create(0x76f988da, 0x831153b5),
2925
X64Word_create(0x983e5152, 0xee66dfab), X64Word_create(0xa831c66d, 0x2db43210),
2926
X64Word_create(0xb00327c8, 0x98fb213f), X64Word_create(0xbf597fc7, 0xbeef0ee4),
2927
X64Word_create(0xc6e00bf3, 0x3da88fc2), X64Word_create(0xd5a79147, 0x930aa725),
2928
X64Word_create(0x06ca6351, 0xe003826f), X64Word_create(0x14292967, 0x0a0e6e70),
2929
X64Word_create(0x27b70a85, 0x46d22ffc), X64Word_create(0x2e1b2138, 0x5c26c926),
2930
X64Word_create(0x4d2c6dfc, 0x5ac42aed), X64Word_create(0x53380d13, 0x9d95b3df),
2931
X64Word_create(0x650a7354, 0x8baf63de), X64Word_create(0x766a0abb, 0x3c77b2a8),
2932
X64Word_create(0x81c2c92e, 0x47edaee6), X64Word_create(0x92722c85, 0x1482353b),
2933
X64Word_create(0xa2bfe8a1, 0x4cf10364), X64Word_create(0xa81a664b, 0xbc423001),
2934
X64Word_create(0xc24b8b70, 0xd0f89791), X64Word_create(0xc76c51a3, 0x0654be30),
2935
X64Word_create(0xd192e819, 0xd6ef5218), X64Word_create(0xd6990624, 0x5565a910),
2936
X64Word_create(0xf40e3585, 0x5771202a), X64Word_create(0x106aa070, 0x32bbd1b8),
2937
X64Word_create(0x19a4c116, 0xb8d2d0c8), X64Word_create(0x1e376c08, 0x5141ab53),
2938
X64Word_create(0x2748774c, 0xdf8eeb99), X64Word_create(0x34b0bcb5, 0xe19b48a8),
2939
X64Word_create(0x391c0cb3, 0xc5c95a63), X64Word_create(0x4ed8aa4a, 0xe3418acb),
2940
X64Word_create(0x5b9cca4f, 0x7763e373), X64Word_create(0x682e6ff3, 0xd6b2b8a3),
2941
X64Word_create(0x748f82ee, 0x5defb2fc), X64Word_create(0x78a5636f, 0x43172f60),
2942
X64Word_create(0x84c87814, 0xa1f0ab72), X64Word_create(0x8cc70208, 0x1a6439ec),
2943
X64Word_create(0x90befffa, 0x23631e28), X64Word_create(0xa4506ceb, 0xde82bde9),
2944
X64Word_create(0xbef9a3f7, 0xb2c67915), X64Word_create(0xc67178f2, 0xe372532b),
2945
X64Word_create(0xca273ece, 0xea26619c), X64Word_create(0xd186b8c7, 0x21c0c207),
2946
X64Word_create(0xeada7dd6, 0xcde0eb1e), X64Word_create(0xf57d4f7f, 0xee6ed178),
2947
X64Word_create(0x06f067aa, 0x72176fba), X64Word_create(0x0a637dc5, 0xa2c898a6),
2948
X64Word_create(0x113f9804, 0xbef90dae), X64Word_create(0x1b710b35, 0x131c471b),
2949
X64Word_create(0x28db77f5, 0x23047d84), X64Word_create(0x32caab7b, 0x40c72493),
2950
X64Word_create(0x3c9ebe0a, 0x15c9bebc), X64Word_create(0x431d67c4, 0x9c100d4c),
2951
X64Word_create(0x4cc5d4be, 0xcb3e42b6), X64Word_create(0x597f299c, 0xfc657e2a),
2952
X64Word_create(0x5fcb6fab, 0x3ad6faec), X64Word_create(0x6c44198c, 0x4a475817)
2953
];
2954
2955
// Reusable objects
2956
var W = [];
2957
(function () {
2958
for (var i = 0; i < 80; i++) {
2959
W[i] = X64Word_create();
2960
}
2961
}());
2962
2963
/**
2964
* SHA-512 hash algorithm.
2965
*/
2966
var SHA512 = C_algo.SHA512 = Hasher.extend({
2967
_doReset: function () {
2968
this._hash = new X64WordArray.init([
2969
new X64Word.init(0x6a09e667, 0xf3bcc908), new X64Word.init(0xbb67ae85, 0x84caa73b),
2970
new X64Word.init(0x3c6ef372, 0xfe94f82b), new X64Word.init(0xa54ff53a, 0x5f1d36f1),
2971
new X64Word.init(0x510e527f, 0xade682d1), new X64Word.init(0x9b05688c, 0x2b3e6c1f),
2972
new X64Word.init(0x1f83d9ab, 0xfb41bd6b), new X64Word.init(0x5be0cd19, 0x137e2179)
2973
]);
2974
},
2975
2976
_doProcessBlock: function (M, offset) {
2977
// Shortcuts
2978
var H = this._hash.words;
2979
2980
var H0 = H[0];
2981
var H1 = H[1];
2982
var H2 = H[2];
2983
var H3 = H[3];
2984
var H4 = H[4];
2985
var H5 = H[5];
2986
var H6 = H[6];
2987
var H7 = H[7];
2988
2989
var H0h = H0.high;
2990
var H0l = H0.low;
2991
var H1h = H1.high;
2992
var H1l = H1.low;
2993
var H2h = H2.high;
2994
var H2l = H2.low;
2995
var H3h = H3.high;
2996
var H3l = H3.low;
2997
var H4h = H4.high;
2998
var H4l = H4.low;
2999
var H5h = H5.high;
3000
var H5l = H5.low;
3001
var H6h = H6.high;
3002
var H6l = H6.low;
3003
var H7h = H7.high;
3004
var H7l = H7.low;
3005
3006
// Working variables
3007
var ah = H0h;
3008
var al = H0l;
3009
var bh = H1h;
3010
var bl = H1l;
3011
var ch = H2h;
3012
var cl = H2l;
3013
var dh = H3h;
3014
var dl = H3l;
3015
var eh = H4h;
3016
var el = H4l;
3017
var fh = H5h;
3018
var fl = H5l;
3019
var gh = H6h;
3020
var gl = H6l;
3021
var hh = H7h;
3022
var hl = H7l;
3023
3024
// Rounds
3025
for (var i = 0; i < 80; i++) {
3026
// Shortcut
3027
var Wi = W[i];
3028
3029
// Extend message
3030
if (i < 16) {
3031
var Wih = Wi.high = M[offset + i * 2] | 0;
3032
var Wil = Wi.low = M[offset + i * 2 + 1] | 0;
3033
} else {
3034
// Gamma0
3035
var gamma0x = W[i - 15];
3036
var gamma0xh = gamma0x.high;
3037
var gamma0xl = gamma0x.low;
3038
var gamma0h = ((gamma0xh >>> 1) | (gamma0xl << 31)) ^ ((gamma0xh >>> 8) | (gamma0xl << 24)) ^ (gamma0xh >>> 7);
3039
var gamma0l = ((gamma0xl >>> 1) | (gamma0xh << 31)) ^ ((gamma0xl >>> 8) | (gamma0xh << 24)) ^ ((gamma0xl >>> 7) | (gamma0xh << 25));
3040
3041
// Gamma1
3042
var gamma1x = W[i - 2];
3043
var gamma1xh = gamma1x.high;
3044
var gamma1xl = gamma1x.low;
3045
var gamma1h = ((gamma1xh >>> 19) | (gamma1xl << 13)) ^ ((gamma1xh << 3) | (gamma1xl >>> 29)) ^ (gamma1xh >>> 6);
3046
var gamma1l = ((gamma1xl >>> 19) | (gamma1xh << 13)) ^ ((gamma1xl << 3) | (gamma1xh >>> 29)) ^ ((gamma1xl >>> 6) | (gamma1xh << 26));
3047
3048
// W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16]
3049
var Wi7 = W[i - 7];
3050
var Wi7h = Wi7.high;
3051
var Wi7l = Wi7.low;
3052
3053
var Wi16 = W[i - 16];
3054
var Wi16h = Wi16.high;
3055
var Wi16l = Wi16.low;
3056
3057
var Wil = gamma0l + Wi7l;
3058
var Wih = gamma0h + Wi7h + ((Wil >>> 0) < (gamma0l >>> 0) ? 1 : 0);
3059
var Wil = Wil + gamma1l;
3060
var Wih = Wih + gamma1h + ((Wil >>> 0) < (gamma1l >>> 0) ? 1 : 0);
3061
var Wil = Wil + Wi16l;
3062
var Wih = Wih + Wi16h + ((Wil >>> 0) < (Wi16l >>> 0) ? 1 : 0);
3063
3064
Wi.high = Wih;
3065
Wi.low = Wil;
3066
}
3067
3068
var chh = (eh & fh) ^ (~eh & gh);
3069
var chl = (el & fl) ^ (~el & gl);
3070
var majh = (ah & bh) ^ (ah & ch) ^ (bh & ch);
3071
var majl = (al & bl) ^ (al & cl) ^ (bl & cl);
3072
3073
var sigma0h = ((ah >>> 28) | (al << 4)) ^ ((ah << 30) | (al >>> 2)) ^ ((ah << 25) | (al >>> 7));
3074
var sigma0l = ((al >>> 28) | (ah << 4)) ^ ((al << 30) | (ah >>> 2)) ^ ((al << 25) | (ah >>> 7));
3075
var sigma1h = ((eh >>> 14) | (el << 18)) ^ ((eh >>> 18) | (el << 14)) ^ ((eh << 23) | (el >>> 9));
3076
var sigma1l = ((el >>> 14) | (eh << 18)) ^ ((el >>> 18) | (eh << 14)) ^ ((el << 23) | (eh >>> 9));
3077
3078
// t1 = h + sigma1 + ch + K[i] + W[i]
3079
var Ki = K[i];
3080
var Kih = Ki.high;
3081
var Kil = Ki.low;
3082
3083
var t1l = hl + sigma1l;
3084
var t1h = hh + sigma1h + ((t1l >>> 0) < (hl >>> 0) ? 1 : 0);
3085
var t1l = t1l + chl;
3086
var t1h = t1h + chh + ((t1l >>> 0) < (chl >>> 0) ? 1 : 0);
3087
var t1l = t1l + Kil;
3088
var t1h = t1h + Kih + ((t1l >>> 0) < (Kil >>> 0) ? 1 : 0);
3089
var t1l = t1l + Wil;
3090
var t1h = t1h + Wih + ((t1l >>> 0) < (Wil >>> 0) ? 1 : 0);
3091
3092
// t2 = sigma0 + maj
3093
var t2l = sigma0l + majl;
3094
var t2h = sigma0h + majh + ((t2l >>> 0) < (sigma0l >>> 0) ? 1 : 0);
3095
3096
// Update working variables
3097
hh = gh;
3098
hl = gl;
3099
gh = fh;
3100
gl = fl;
3101
fh = eh;
3102
fl = el;
3103
el = (dl + t1l) | 0;
3104
eh = (dh + t1h + ((el >>> 0) < (dl >>> 0) ? 1 : 0)) | 0;
3105
dh = ch;
3106
dl = cl;
3107
ch = bh;
3108
cl = bl;
3109
bh = ah;
3110
bl = al;
3111
al = (t1l + t2l) | 0;
3112
ah = (t1h + t2h + ((al >>> 0) < (t1l >>> 0) ? 1 : 0)) | 0;
3113
}
3114
3115
// Intermediate hash value
3116
H0l = H0.low = (H0l + al);
3117
H0.high = (H0h + ah + ((H0l >>> 0) < (al >>> 0) ? 1 : 0));
3118
H1l = H1.low = (H1l + bl);
3119
H1.high = (H1h + bh + ((H1l >>> 0) < (bl >>> 0) ? 1 : 0));
3120
H2l = H2.low = (H2l + cl);
3121
H2.high = (H2h + ch + ((H2l >>> 0) < (cl >>> 0) ? 1 : 0));
3122
H3l = H3.low = (H3l + dl);
3123
H3.high = (H3h + dh + ((H3l >>> 0) < (dl >>> 0) ? 1 : 0));
3124
H4l = H4.low = (H4l + el);
3125
H4.high = (H4h + eh + ((H4l >>> 0) < (el >>> 0) ? 1 : 0));
3126
H5l = H5.low = (H5l + fl);
3127
H5.high = (H5h + fh + ((H5l >>> 0) < (fl >>> 0) ? 1 : 0));
3128
H6l = H6.low = (H6l + gl);
3129
H6.high = (H6h + gh + ((H6l >>> 0) < (gl >>> 0) ? 1 : 0));
3130
H7l = H7.low = (H7l + hl);
3131
H7.high = (H7h + hh + ((H7l >>> 0) < (hl >>> 0) ? 1 : 0));
3132
},
3133
3134
_doFinalize: function () {
3135
// Shortcuts
3136
var data = this._data;
3137
var dataWords = data.words;
3138
3139
var nBitsTotal = this._nDataBytes * 8;
3140
var nBitsLeft = data.sigBytes * 8;
3141
3142
// Add padding
3143
dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);
3144
dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);
3145
dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 31] = nBitsTotal;
3146
data.sigBytes = dataWords.length * 4;
3147
3148
// Hash final blocks
3149
this._process();
3150
3151
// Convert hash to 32-bit word array before returning
3152
var hash = this._hash.toX32();
3153
3154
// Return final computed hash
3155
return hash;
3156
},
3157
3158
clone: function () {
3159
var clone = Hasher.clone.call(this);
3160
clone._hash = this._hash.clone();
3161
3162
return clone;
3163
},
3164
3165
blockSize: 1024/32
3166
});
3167
3168
/**
3169
* Shortcut function to the hasher's object interface.
3170
*
3171
* @param {WordArray|string} message The message to hash.
3172
*
3173
* @return {WordArray} The hash.
3174
*
3175
* @static
3176
*
3177
* @example
3178
*
3179
* var hash = CryptoJS.SHA512('message');
3180
* var hash = CryptoJS.SHA512(wordArray);
3181
*/
3182
C.SHA512 = Hasher._createHelper(SHA512);
3183
3184
/**
3185
* Shortcut function to the HMAC's object interface.
3186
*
3187
* @param {WordArray|string} message The message to hash.
3188
* @param {WordArray|string} key The secret key.
3189
*
3190
* @return {WordArray} The HMAC.
3191
*
3192
* @static
3193
*
3194
* @example
3195
*
3196
* var hmac = CryptoJS.HmacSHA512(message, key);
3197
*/
3198
C.HmacSHA512 = Hasher._createHmacHelper(SHA512);
3199
}());
3200
3201
3202
(function () {
3203
// Shortcuts
3204
var C = CryptoJS;
3205
var C_x64 = C.x64;
3206
var X64Word = C_x64.Word;
3207
var X64WordArray = C_x64.WordArray;
3208
var C_algo = C.algo;
3209
var SHA512 = C_algo.SHA512;
3210
3211
/**
3212
* SHA-384 hash algorithm.
3213
*/
3214
var SHA384 = C_algo.SHA384 = SHA512.extend({
3215
_doReset: function () {
3216
this._hash = new X64WordArray.init([
3217
new X64Word.init(0xcbbb9d5d, 0xc1059ed8), new X64Word.init(0x629a292a, 0x367cd507),
3218
new X64Word.init(0x9159015a, 0x3070dd17), new X64Word.init(0x152fecd8, 0xf70e5939),
3219
new X64Word.init(0x67332667, 0xffc00b31), new X64Word.init(0x8eb44a87, 0x68581511),
3220
new X64Word.init(0xdb0c2e0d, 0x64f98fa7), new X64Word.init(0x47b5481d, 0xbefa4fa4)
3221
]);
3222
},
3223
3224
_doFinalize: function () {
3225
var hash = SHA512._doFinalize.call(this);
3226
3227
hash.sigBytes -= 16;
3228
3229
return hash;
3230
}
3231
});
3232
3233
/**
3234
* Shortcut function to the hasher's object interface.
3235
*
3236
* @param {WordArray|string} message The message to hash.
3237
*
3238
* @return {WordArray} The hash.
3239
*
3240
* @static
3241
*
3242
* @example
3243
*
3244
* var hash = CryptoJS.SHA384('message');
3245
* var hash = CryptoJS.SHA384(wordArray);
3246
*/
3247
C.SHA384 = SHA512._createHelper(SHA384);
3248
3249
/**
3250
* Shortcut function to the HMAC's object interface.
3251
*
3252
* @param {WordArray|string} message The message to hash.
3253
* @param {WordArray|string} key The secret key.
3254
*
3255
* @return {WordArray} The HMAC.
3256
*
3257
* @static
3258
*
3259
* @example
3260
*
3261
* var hmac = CryptoJS.HmacSHA384(message, key);
3262
*/
3263
C.HmacSHA384 = SHA512._createHmacHelper(SHA384);
3264
}());
3265
3266
3267
/**
3268
* Cipher core components.
3269
*/
3270
CryptoJS.lib.Cipher || (function (undefined) {
3271
// Shortcuts
3272
var C = CryptoJS;
3273
var C_lib = C.lib;
3274
var Base = C_lib.Base;
3275
var WordArray = C_lib.WordArray;
3276
var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm;
3277
var C_enc = C.enc;
3278
var Utf8 = C_enc.Utf8;
3279
var Base64 = C_enc.Base64;
3280
var C_algo = C.algo;
3281
var EvpKDF = C_algo.EvpKDF;
3282
3283
/**
3284
* Abstract base cipher template.
3285
*
3286
* @property {number} keySize This cipher's key size. Default: 4 (128 bits)
3287
* @property {number} ivSize This cipher's IV size. Default: 4 (128 bits)
3288
* @property {number} _ENC_XFORM_MODE A constant representing encryption mode.
3289
* @property {number} _DEC_XFORM_MODE A constant representing decryption mode.
3290
*/
3291
var Cipher = C_lib.Cipher = BufferedBlockAlgorithm.extend({
3292
/**
3293
* Configuration options.
3294
*
3295
* @property {WordArray} iv The IV to use for this operation.
3296
*/
3297
cfg: Base.extend(),
3298
3299
/**
3300
* Creates this cipher in encryption mode.
3301
*
3302
* @param {WordArray} key The key.
3303
* @param {Object} cfg (Optional) The configuration options to use for this operation.
3304
*
3305
* @return {Cipher} A cipher instance.
3306
*
3307
* @static
3308
*
3309
* @example
3310
*
3311
* var cipher = CryptoJS.algo.AES.createEncryptor(keyWordArray, { iv: ivWordArray });
3312
*/
3313
createEncryptor: function (key, cfg) {
3314
return this.create(this._ENC_XFORM_MODE, key, cfg);
3315
},
3316
3317
/**
3318
* Creates this cipher in decryption mode.
3319
*
3320
* @param {WordArray} key The key.
3321
* @param {Object} cfg (Optional) The configuration options to use for this operation.
3322
*
3323
* @return {Cipher} A cipher instance.
3324
*
3325
* @static
3326
*
3327
* @example
3328
*
3329
* var cipher = CryptoJS.algo.AES.createDecryptor(keyWordArray, { iv: ivWordArray });
3330
*/
3331
createDecryptor: function (key, cfg) {
3332
return this.create(this._DEC_XFORM_MODE, key, cfg);
3333
},
3334
3335
/**
3336
* Initializes a newly created cipher.
3337
*
3338
* @param {number} xformMode Either the encryption or decryption transormation mode constant.
3339
* @param {WordArray} key The key.
3340
* @param {Object} cfg (Optional) The configuration options to use for this operation.
3341
*
3342
* @example
3343
*
3344
* var cipher = CryptoJS.algo.AES.create(CryptoJS.algo.AES._ENC_XFORM_MODE, keyWordArray, { iv: ivWordArray });
3345
*/
3346
init: function (xformMode, key, cfg) {
3347
// Apply config defaults
3348
this.cfg = this.cfg.extend(cfg);
3349
3350
// Store transform mode and key
3351
this._xformMode = xformMode;
3352
this._key = key;
3353
3354
// Set initial values
3355
this.reset();
3356
},
3357
3358
/**
3359
* Resets this cipher to its initial state.
3360
*
3361
* @example
3362
*
3363
* cipher.reset();
3364
*/
3365
reset: function () {
3366
// Reset data buffer
3367
BufferedBlockAlgorithm.reset.call(this);
3368
3369
// Perform concrete-cipher logic
3370
this._doReset();
3371
},
3372
3373
/**
3374
* Adds data to be encrypted or decrypted.
3375
*
3376
* @param {WordArray|string} dataUpdate The data to encrypt or decrypt.
3377
*
3378
* @return {WordArray} The data after processing.
3379
*
3380
* @example
3381
*
3382
* var encrypted = cipher.process('data');
3383
* var encrypted = cipher.process(wordArray);
3384
*/
3385
process: function (dataUpdate) {
3386
// Append
3387
this._append(dataUpdate);
3388
3389
// Process available blocks
3390
return this._process();
3391
},
3392
3393
/**
3394
* Finalizes the encryption or decryption process.
3395
* Note that the finalize operation is effectively a destructive, read-once operation.
3396
*
3397
* @param {WordArray|string} dataUpdate The final data to encrypt or decrypt.
3398
*
3399
* @return {WordArray} The data after final processing.
3400
*
3401
* @example
3402
*
3403
* var encrypted = cipher.finalize();
3404
* var encrypted = cipher.finalize('data');
3405
* var encrypted = cipher.finalize(wordArray);
3406
*/
3407
finalize: function (dataUpdate) {
3408
// Final data update
3409
if (dataUpdate) {
3410
this._append(dataUpdate);
3411
}
3412
3413
// Perform concrete-cipher logic
3414
var finalProcessedData = this._doFinalize();
3415
3416
return finalProcessedData;
3417
},
3418
3419
keySize: 128/32,
3420
3421
ivSize: 128/32,
3422
3423
_ENC_XFORM_MODE: 1,
3424
3425
_DEC_XFORM_MODE: 2,
3426
3427
/**
3428
* Creates shortcut functions to a cipher's object interface.
3429
*
3430
* @param {Cipher} cipher The cipher to create a helper for.
3431
*
3432
* @return {Object} An object with encrypt and decrypt shortcut functions.
3433
*
3434
* @static
3435
*
3436
* @example
3437
*
3438
* var AES = CryptoJS.lib.Cipher._createHelper(CryptoJS.algo.AES);
3439
*/
3440
_createHelper: (function () {
3441
function selectCipherStrategy(key) {
3442
if (typeof key == 'string') {
3443
return PasswordBasedCipher;
3444
} else {
3445
return SerializableCipher;
3446
}
3447
}
3448
3449
return function (cipher) {
3450
return {
3451
encrypt: function (message, key, cfg) {
3452
return selectCipherStrategy(key).encrypt(cipher, message, key, cfg);
3453
},
3454
3455
decrypt: function (ciphertext, key, cfg) {
3456
return selectCipherStrategy(key).decrypt(cipher, ciphertext, key, cfg);
3457
}
3458
};
3459
};
3460
}())
3461
});
3462
3463
/**
3464
* Abstract base stream cipher template.
3465
*
3466
* @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 1 (32 bits)
3467
*/
3468
var StreamCipher = C_lib.StreamCipher = Cipher.extend({
3469
_doFinalize: function () {
3470
// Process partial blocks
3471
var finalProcessedBlocks = this._process(!!'flush');
3472
3473
return finalProcessedBlocks;
3474
},
3475
3476
blockSize: 1
3477
});
3478
3479
/**
3480
* Mode namespace.
3481
*/
3482
var C_mode = C.mode = {};
3483
3484
/**
3485
* Abstract base block cipher mode template.
3486
*/
3487
var BlockCipherMode = C_lib.BlockCipherMode = Base.extend({
3488
/**
3489
* Creates this mode for encryption.
3490
*
3491
* @param {Cipher} cipher A block cipher instance.
3492
* @param {Array} iv The IV words.
3493
*
3494
* @static
3495
*
3496
* @example
3497
*
3498
* var mode = CryptoJS.mode.CBC.createEncryptor(cipher, iv.words);
3499
*/
3500
createEncryptor: function (cipher, iv) {
3501
return this.Encryptor.create(cipher, iv);
3502
},
3503
3504
/**
3505
* Creates this mode for decryption.
3506
*
3507
* @param {Cipher} cipher A block cipher instance.
3508
* @param {Array} iv The IV words.
3509
*
3510
* @static
3511
*
3512
* @example
3513
*
3514
* var mode = CryptoJS.mode.CBC.createDecryptor(cipher, iv.words);
3515
*/
3516
createDecryptor: function (cipher, iv) {
3517
return this.Decryptor.create(cipher, iv);
3518
},
3519
3520
/**
3521
* Initializes a newly created mode.
3522
*
3523
* @param {Cipher} cipher A block cipher instance.
3524
* @param {Array} iv The IV words.
3525
*
3526
* @example
3527
*
3528
* var mode = CryptoJS.mode.CBC.Encryptor.create(cipher, iv.words);
3529
*/
3530
init: function (cipher, iv) {
3531
this._cipher = cipher;
3532
this._iv = iv;
3533
}
3534
});
3535
3536
/**
3537
* Cipher Block Chaining mode.
3538
*/
3539
var CBC = C_mode.CBC = (function () {
3540
/**
3541
* Abstract base CBC mode.
3542
*/
3543
var CBC = BlockCipherMode.extend();
3544
3545
/**
3546
* CBC encryptor.
3547
*/
3548
CBC.Encryptor = CBC.extend({
3549
/**
3550
* Processes the data block at offset.
3551
*
3552
* @param {Array} words The data words to operate on.
3553
* @param {number} offset The offset where the block starts.
3554
*
3555
* @example
3556
*
3557
* mode.processBlock(data.words, offset);
3558
*/
3559
processBlock: function (words, offset) {
3560
// Shortcuts
3561
var cipher = this._cipher;
3562
var blockSize = cipher.blockSize;
3563
3564
// XOR and encrypt
3565
xorBlock.call(this, words, offset, blockSize);
3566
cipher.encryptBlock(words, offset);
3567
3568
// Remember this block to use with next block
3569
this._prevBlock = words.slice(offset, offset + blockSize);
3570
}
3571
});
3572
3573
/**
3574
* CBC decryptor.
3575
*/
3576
CBC.Decryptor = CBC.extend({
3577
/**
3578
* Processes the data block at offset.
3579
*
3580
* @param {Array} words The data words to operate on.
3581
* @param {number} offset The offset where the block starts.
3582
*
3583
* @example
3584
*
3585
* mode.processBlock(data.words, offset);
3586
*/
3587
processBlock: function (words, offset) {
3588
// Shortcuts
3589
var cipher = this._cipher;
3590
var blockSize = cipher.blockSize;
3591
3592
// Remember this block to use with next block
3593
var thisBlock = words.slice(offset, offset + blockSize);
3594
3595
// Decrypt and XOR
3596
cipher.decryptBlock(words, offset);
3597
xorBlock.call(this, words, offset, blockSize);
3598
3599
// This block becomes the previous block
3600
this._prevBlock = thisBlock;
3601
}
3602
});
3603
3604
function xorBlock(words, offset, blockSize) {
3605
// Shortcut
3606
var iv = this._iv;
3607
3608
// Choose mixing block
3609
if (iv) {
3610
var block = iv;
3611
3612
// Remove IV for subsequent blocks
3613
this._iv = undefined;
3614
} else {
3615
var block = this._prevBlock;
3616
}
3617
3618
// XOR blocks
3619
for (var i = 0; i < blockSize; i++) {
3620
words[offset + i] ^= block[i];
3621
}
3622
}
3623
3624
return CBC;
3625
}());
3626
3627
/**
3628
* Padding namespace.
3629
*/
3630
var C_pad = C.pad = {};
3631
3632
/**
3633
* PKCS #5/7 padding strategy.
3634
*/
3635
var Pkcs7 = C_pad.Pkcs7 = {
3636
/**
3637
* Pads data using the algorithm defined in PKCS #5/7.
3638
*
3639
* @param {WordArray} data The data to pad.
3640
* @param {number} blockSize The multiple that the data should be padded to.
3641
*
3642
* @static
3643
*
3644
* @example
3645
*
3646
* CryptoJS.pad.Pkcs7.pad(wordArray, 4);
3647
*/
3648
pad: function (data, blockSize) {
3649
// Shortcut
3650
var blockSizeBytes = blockSize * 4;
3651
3652
// Count padding bytes
3653
var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
3654
3655
// Create padding word
3656
var paddingWord = (nPaddingBytes << 24) | (nPaddingBytes << 16) | (nPaddingBytes << 8) | nPaddingBytes;
3657
3658
// Create padding
3659
var paddingWords = [];
3660
for (var i = 0; i < nPaddingBytes; i += 4) {
3661
paddingWords.push(paddingWord);
3662
}
3663
var padding = WordArray.create(paddingWords, nPaddingBytes);
3664
3665
// Add padding
3666
data.concat(padding);
3667
},
3668
3669
/**
3670
* Unpads data that had been padded using the algorithm defined in PKCS #5/7.
3671
*
3672
* @param {WordArray} data The data to unpad.
3673
*
3674
* @static
3675
*
3676
* @example
3677
*
3678
* CryptoJS.pad.Pkcs7.unpad(wordArray);
3679
*/
3680
unpad: function (data) {
3681
// Get number of padding bytes from last byte
3682
var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
3683
3684
// Remove padding
3685
data.sigBytes -= nPaddingBytes;
3686
}
3687
};
3688
3689
/**
3690
* Abstract base block cipher template.
3691
*
3692
* @property {number} blockSize The number of 32-bit words this cipher operates on. Default: 4 (128 bits)
3693
*/
3694
var BlockCipher = C_lib.BlockCipher = Cipher.extend({
3695
/**
3696
* Configuration options.
3697
*
3698
* @property {Mode} mode The block mode to use. Default: CBC
3699
* @property {Padding} padding The padding strategy to use. Default: Pkcs7
3700
*/
3701
cfg: Cipher.cfg.extend({
3702
mode: CBC,
3703
padding: Pkcs7
3704
}),
3705
3706
reset: function () {
3707
// Reset cipher
3708
Cipher.reset.call(this);
3709
3710
// Shortcuts
3711
var cfg = this.cfg;
3712
var iv = cfg.iv;
3713
var mode = cfg.mode;
3714
3715
// Reset block mode
3716
if (this._xformMode == this._ENC_XFORM_MODE) {
3717
var modeCreator = mode.createEncryptor;
3718
} else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
3719
var modeCreator = mode.createDecryptor;
3720
// Keep at least one block in the buffer for unpadding
3721
this._minBufferSize = 1;
3722
}
3723
3724
if (this._mode && this._mode.__creator == modeCreator) {
3725
this._mode.init(this, iv && iv.words);
3726
} else {
3727
this._mode = modeCreator.call(mode, this, iv && iv.words);
3728
this._mode.__creator = modeCreator;
3729
}
3730
},
3731
3732
_doProcessBlock: function (words, offset) {
3733
this._mode.processBlock(words, offset);
3734
},
3735
3736
_doFinalize: function () {
3737
// Shortcut
3738
var padding = this.cfg.padding;
3739
3740
// Finalize
3741
if (this._xformMode == this._ENC_XFORM_MODE) {
3742
// Pad data
3743
padding.pad(this._data, this.blockSize);
3744
3745
// Process final blocks
3746
var finalProcessedBlocks = this._process(!!'flush');
3747
} else /* if (this._xformMode == this._DEC_XFORM_MODE) */ {
3748
// Process final blocks
3749
var finalProcessedBlocks = this._process(!!'flush');
3750
3751
// Unpad data
3752
padding.unpad(finalProcessedBlocks);
3753
}
3754
3755
return finalProcessedBlocks;
3756
},
3757
3758
blockSize: 128/32
3759
});
3760
3761
/**
3762
* A collection of cipher parameters.
3763
*
3764
* @property {WordArray} ciphertext The raw ciphertext.
3765
* @property {WordArray} key The key to this ciphertext.
3766
* @property {WordArray} iv The IV used in the ciphering operation.
3767
* @property {WordArray} salt The salt used with a key derivation function.
3768
* @property {Cipher} algorithm The cipher algorithm.
3769
* @property {Mode} mode The block mode used in the ciphering operation.
3770
* @property {Padding} padding The padding scheme used in the ciphering operation.
3771
* @property {number} blockSize The block size of the cipher.
3772
* @property {Format} formatter The default formatting strategy to convert this cipher params object to a string.
3773
*/
3774
var CipherParams = C_lib.CipherParams = Base.extend({
3775
/**
3776
* Initializes a newly created cipher params object.
3777
*
3778
* @param {Object} cipherParams An object with any of the possible cipher parameters.
3779
*
3780
* @example
3781
*
3782
* var cipherParams = CryptoJS.lib.CipherParams.create({
3783
* ciphertext: ciphertextWordArray,
3784
* key: keyWordArray,
3785
* iv: ivWordArray,
3786
* salt: saltWordArray,
3787
* algorithm: CryptoJS.algo.AES,
3788
* mode: CryptoJS.mode.CBC,
3789
* padding: CryptoJS.pad.PKCS7,
3790
* blockSize: 4,
3791
* formatter: CryptoJS.format.OpenSSL
3792
* });
3793
*/
3794
init: function (cipherParams) {
3795
this.mixIn(cipherParams);
3796
},
3797
3798
/**
3799
* Converts this cipher params object to a string.
3800
*
3801
* @param {Format} formatter (Optional) The formatting strategy to use.
3802
*
3803
* @return {string} The stringified cipher params.
3804
*
3805
* @throws Error If neither the formatter nor the default formatter is set.
3806
*
3807
* @example
3808
*
3809
* var string = cipherParams + '';
3810
* var string = cipherParams.toString();
3811
* var string = cipherParams.toString(CryptoJS.format.OpenSSL);
3812
*/
3813
toString: function (formatter) {
3814
return (formatter || this.formatter).stringify(this);
3815
}
3816
});
3817
3818
/**
3819
* Format namespace.
3820
*/
3821
var C_format = C.format = {};
3822
3823
/**
3824
* OpenSSL formatting strategy.
3825
*/
3826
var OpenSSLFormatter = C_format.OpenSSL = {
3827
/**
3828
* Converts a cipher params object to an OpenSSL-compatible string.
3829
*
3830
* @param {CipherParams} cipherParams The cipher params object.
3831
*
3832
* @return {string} The OpenSSL-compatible string.
3833
*
3834
* @static
3835
*
3836
* @example
3837
*
3838
* var openSSLString = CryptoJS.format.OpenSSL.stringify(cipherParams);
3839
*/
3840
stringify: function (cipherParams) {
3841
// Shortcuts
3842
var ciphertext = cipherParams.ciphertext;
3843
var salt = cipherParams.salt;
3844
3845
// Format
3846
if (salt) {
3847
var wordArray = WordArray.create([0x53616c74, 0x65645f5f]).concat(salt).concat(ciphertext);
3848
} else {
3849
var wordArray = ciphertext;
3850
}
3851
3852
return wordArray.toString(Base64);
3853
},
3854
3855
/**
3856
* Converts an OpenSSL-compatible string to a cipher params object.
3857
*
3858
* @param {string} openSSLStr The OpenSSL-compatible string.
3859
*
3860
* @return {CipherParams} The cipher params object.
3861
*
3862
* @static
3863
*
3864
* @example
3865
*
3866
* var cipherParams = CryptoJS.format.OpenSSL.parse(openSSLString);
3867
*/
3868
parse: function (openSSLStr) {
3869
// Parse base64
3870
var ciphertext = Base64.parse(openSSLStr);
3871
3872
// Shortcut
3873
var ciphertextWords = ciphertext.words;
3874
3875
// Test for salt
3876
if (ciphertextWords[0] == 0x53616c74 && ciphertextWords[1] == 0x65645f5f) {
3877
// Extract salt
3878
var salt = WordArray.create(ciphertextWords.slice(2, 4));
3879
3880
// Remove salt from ciphertext
3881
ciphertextWords.splice(0, 4);
3882
ciphertext.sigBytes -= 16;
3883
}
3884
3885
return CipherParams.create({ ciphertext: ciphertext, salt: salt });
3886
}
3887
};
3888
3889
/**
3890
* A cipher wrapper that returns ciphertext as a serializable cipher params object.
3891
*/
3892
var SerializableCipher = C_lib.SerializableCipher = Base.extend({
3893
/**
3894
* Configuration options.
3895
*
3896
* @property {Formatter} format The formatting strategy to convert cipher param objects to and from a string. Default: OpenSSL
3897
*/
3898
cfg: Base.extend({
3899
format: OpenSSLFormatter
3900
}),
3901
3902
/**
3903
* Encrypts a message.
3904
*
3905
* @param {Cipher} cipher The cipher algorithm to use.
3906
* @param {WordArray|string} message The message to encrypt.
3907
* @param {WordArray} key The key.
3908
* @param {Object} cfg (Optional) The configuration options to use for this operation.
3909
*
3910
* @return {CipherParams} A cipher params object.
3911
*
3912
* @static
3913
*
3914
* @example
3915
*
3916
* var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key);
3917
* var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv });
3918
* var ciphertextParams = CryptoJS.lib.SerializableCipher.encrypt(CryptoJS.algo.AES, message, key, { iv: iv, format: CryptoJS.format.OpenSSL });
3919
*/
3920
encrypt: function (cipher, message, key, cfg) {
3921
// Apply config defaults
3922
cfg = this.cfg.extend(cfg);
3923
3924
// Encrypt
3925
var encryptor = cipher.createEncryptor(key, cfg);
3926
var ciphertext = encryptor.finalize(message);
3927
3928
// Shortcut
3929
var cipherCfg = encryptor.cfg;
3930
3931
// Create and return serializable cipher params
3932
return CipherParams.create({
3933
ciphertext: ciphertext,
3934
key: key,
3935
iv: cipherCfg.iv,
3936
algorithm: cipher,
3937
mode: cipherCfg.mode,
3938
padding: cipherCfg.padding,
3939
blockSize: cipher.blockSize,
3940
formatter: cfg.format
3941
});
3942
},
3943
3944
/**
3945
* Decrypts serialized ciphertext.
3946
*
3947
* @param {Cipher} cipher The cipher algorithm to use.
3948
* @param {CipherParams|string} ciphertext The ciphertext to decrypt.
3949
* @param {WordArray} key The key.
3950
* @param {Object} cfg (Optional) The configuration options to use for this operation.
3951
*
3952
* @return {WordArray} The plaintext.
3953
*
3954
* @static
3955
*
3956
* @example
3957
*
3958
* var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, key, { iv: iv, format: CryptoJS.format.OpenSSL });
3959
* var plaintext = CryptoJS.lib.SerializableCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, key, { iv: iv, format: CryptoJS.format.OpenSSL });
3960
*/
3961
decrypt: function (cipher, ciphertext, key, cfg) {
3962
// Apply config defaults
3963
cfg = this.cfg.extend(cfg);
3964
3965
// Convert string to CipherParams
3966
ciphertext = this._parse(ciphertext, cfg.format);
3967
3968
// Decrypt
3969
var plaintext = cipher.createDecryptor(key, cfg).finalize(ciphertext.ciphertext);
3970
3971
return plaintext;
3972
},
3973
3974
/**
3975
* Converts serialized ciphertext to CipherParams,
3976
* else assumed CipherParams already and returns ciphertext unchanged.
3977
*
3978
* @param {CipherParams|string} ciphertext The ciphertext.
3979
* @param {Formatter} format The formatting strategy to use to parse serialized ciphertext.
3980
*
3981
* @return {CipherParams} The unserialized ciphertext.
3982
*
3983
* @static
3984
*
3985
* @example
3986
*
3987
* var ciphertextParams = CryptoJS.lib.SerializableCipher._parse(ciphertextStringOrParams, format);
3988
*/
3989
_parse: function (ciphertext, format) {
3990
if (typeof ciphertext == 'string') {
3991
return format.parse(ciphertext, this);
3992
} else {
3993
return ciphertext;
3994
}
3995
}
3996
});
3997
3998
/**
3999
* Key derivation function namespace.
4000
*/
4001
var C_kdf = C.kdf = {};
4002
4003
/**
4004
* OpenSSL key derivation function.
4005
*/
4006
var OpenSSLKdf = C_kdf.OpenSSL = {
4007
/**
4008
* Derives a key and IV from a password.
4009
*
4010
* @param {string} password The password to derive from.
4011
* @param {number} keySize The size in words of the key to generate.
4012
* @param {number} ivSize The size in words of the IV to generate.
4013
* @param {WordArray|string} salt (Optional) A 64-bit salt to use. If omitted, a salt will be generated randomly.
4014
*
4015
* @return {CipherParams} A cipher params object with the key, IV, and salt.
4016
*
4017
* @static
4018
*
4019
* @example
4020
*
4021
* var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32);
4022
* var derivedParams = CryptoJS.kdf.OpenSSL.execute('Password', 256/32, 128/32, 'saltsalt');
4023
*/
4024
execute: function (password, keySize, ivSize, salt) {
4025
// Generate random salt
4026
if (!salt) {
4027
salt = WordArray.random(64/8);
4028
}
4029
4030
// Derive key and IV
4031
var key = EvpKDF.create({ keySize: keySize + ivSize }).compute(password, salt);
4032
4033
// Separate key and IV
4034
var iv = WordArray.create(key.words.slice(keySize), ivSize * 4);
4035
key.sigBytes = keySize * 4;
4036
4037
// Return params
4038
return CipherParams.create({ key: key, iv: iv, salt: salt });
4039
}
4040
};
4041
4042
/**
4043
* A serializable cipher wrapper that derives the key from a password,
4044
* and returns ciphertext as a serializable cipher params object.
4045
*/
4046
var PasswordBasedCipher = C_lib.PasswordBasedCipher = SerializableCipher.extend({
4047
/**
4048
* Configuration options.
4049
*
4050
* @property {KDF} kdf The key derivation function to use to generate a key and IV from a password. Default: OpenSSL
4051
*/
4052
cfg: SerializableCipher.cfg.extend({
4053
kdf: OpenSSLKdf
4054
}),
4055
4056
/**
4057
* Encrypts a message using a password.
4058
*
4059
* @param {Cipher} cipher The cipher algorithm to use.
4060
* @param {WordArray|string} message The message to encrypt.
4061
* @param {string} password The password.
4062
* @param {Object} cfg (Optional) The configuration options to use for this operation.
4063
*
4064
* @return {CipherParams} A cipher params object.
4065
*
4066
* @static
4067
*
4068
* @example
4069
*
4070
* var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password');
4071
* var ciphertextParams = CryptoJS.lib.PasswordBasedCipher.encrypt(CryptoJS.algo.AES, message, 'password', { format: CryptoJS.format.OpenSSL });
4072
*/
4073
encrypt: function (cipher, message, password, cfg) {
4074
// Apply config defaults
4075
cfg = this.cfg.extend(cfg);
4076
4077
// Derive key and other params
4078
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize);
4079
4080
// Add IV to config
4081
cfg.iv = derivedParams.iv;
4082
4083
// Encrypt
4084
var ciphertext = SerializableCipher.encrypt.call(this, cipher, message, derivedParams.key, cfg);
4085
4086
// Mix in derived params
4087
ciphertext.mixIn(derivedParams);
4088
4089
return ciphertext;
4090
},
4091
4092
/**
4093
* Decrypts serialized ciphertext using a password.
4094
*
4095
* @param {Cipher} cipher The cipher algorithm to use.
4096
* @param {CipherParams|string} ciphertext The ciphertext to decrypt.
4097
* @param {string} password The password.
4098
* @param {Object} cfg (Optional) The configuration options to use for this operation.
4099
*
4100
* @return {WordArray} The plaintext.
4101
*
4102
* @static
4103
*
4104
* @example
4105
*
4106
* var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, formattedCiphertext, 'password', { format: CryptoJS.format.OpenSSL });
4107
* var plaintext = CryptoJS.lib.PasswordBasedCipher.decrypt(CryptoJS.algo.AES, ciphertextParams, 'password', { format: CryptoJS.format.OpenSSL });
4108
*/
4109
decrypt: function (cipher, ciphertext, password, cfg) {
4110
// Apply config defaults
4111
cfg = this.cfg.extend(cfg);
4112
4113
// Convert string to CipherParams
4114
ciphertext = this._parse(ciphertext, cfg.format);
4115
4116
// Derive key and other params
4117
var derivedParams = cfg.kdf.execute(password, cipher.keySize, cipher.ivSize, ciphertext.salt);
4118
4119
// Add IV to config
4120
cfg.iv = derivedParams.iv;
4121
4122
// Decrypt
4123
var plaintext = SerializableCipher.decrypt.call(this, cipher, ciphertext, derivedParams.key, cfg);
4124
4125
return plaintext;
4126
}
4127
});
4128
}());
4129
4130
4131
/**
4132
* Cipher Feedback block mode.
4133
*/
4134
CryptoJS.mode.CFB = (function () {
4135
var CFB = CryptoJS.lib.BlockCipherMode.extend();
4136
4137
CFB.Encryptor = CFB.extend({
4138
processBlock: function (words, offset) {
4139
// Shortcuts
4140
var cipher = this._cipher;
4141
var blockSize = cipher.blockSize;
4142
4143
generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
4144
4145
// Remember this block to use with next block
4146
this._prevBlock = words.slice(offset, offset + blockSize);
4147
}
4148
});
4149
4150
CFB.Decryptor = CFB.extend({
4151
processBlock: function (words, offset) {
4152
// Shortcuts
4153
var cipher = this._cipher;
4154
var blockSize = cipher.blockSize;
4155
4156
// Remember this block to use with next block
4157
var thisBlock = words.slice(offset, offset + blockSize);
4158
4159
generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);
4160
4161
// This block becomes the previous block
4162
this._prevBlock = thisBlock;
4163
}
4164
});
4165
4166
function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {
4167
// Shortcut
4168
var iv = this._iv;
4169
4170
// Generate keystream
4171
if (iv) {
4172
var keystream = iv.slice(0);
4173
4174
// Remove IV for subsequent blocks
4175
this._iv = undefined;
4176
} else {
4177
var keystream = this._prevBlock;
4178
}
4179
cipher.encryptBlock(keystream, 0);
4180
4181
// Encrypt
4182
for (var i = 0; i < blockSize; i++) {
4183
words[offset + i] ^= keystream[i];
4184
}
4185
}
4186
4187
return CFB;
4188
}());
4189
4190
4191
/**
4192
* Electronic Codebook block mode.
4193
*/
4194
CryptoJS.mode.ECB = (function () {
4195
var ECB = CryptoJS.lib.BlockCipherMode.extend();
4196
4197
ECB.Encryptor = ECB.extend({
4198
processBlock: function (words, offset) {
4199
this._cipher.encryptBlock(words, offset);
4200
}
4201
});
4202
4203
ECB.Decryptor = ECB.extend({
4204
processBlock: function (words, offset) {
4205
this._cipher.decryptBlock(words, offset);
4206
}
4207
});
4208
4209
return ECB;
4210
}());
4211
4212
4213
/**
4214
* ANSI X.923 padding strategy.
4215
*/
4216
CryptoJS.pad.AnsiX923 = {
4217
pad: function (data, blockSize) {
4218
// Shortcuts
4219
var dataSigBytes = data.sigBytes;
4220
var blockSizeBytes = blockSize * 4;
4221
4222
// Count padding bytes
4223
var nPaddingBytes = blockSizeBytes - dataSigBytes % blockSizeBytes;
4224
4225
// Compute last byte position
4226
var lastBytePos = dataSigBytes + nPaddingBytes - 1;
4227
4228
// Pad
4229
data.clamp();
4230
data.words[lastBytePos >>> 2] |= nPaddingBytes << (24 - (lastBytePos % 4) * 8);
4231
data.sigBytes += nPaddingBytes;
4232
},
4233
4234
unpad: function (data) {
4235
// Get number of padding bytes from last byte
4236
var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
4237
4238
// Remove padding
4239
data.sigBytes -= nPaddingBytes;
4240
}
4241
};
4242
4243
4244
/**
4245
* ISO 10126 padding strategy.
4246
*/
4247
CryptoJS.pad.Iso10126 = {
4248
pad: function (data, blockSize) {
4249
// Shortcut
4250
var blockSizeBytes = blockSize * 4;
4251
4252
// Count padding bytes
4253
var nPaddingBytes = blockSizeBytes - data.sigBytes % blockSizeBytes;
4254
4255
// Pad
4256
data.concat(CryptoJS.lib.WordArray.random(nPaddingBytes - 1)).
4257
concat(CryptoJS.lib.WordArray.create([nPaddingBytes << 24], 1));
4258
},
4259
4260
unpad: function (data) {
4261
// Get number of padding bytes from last byte
4262
var nPaddingBytes = data.words[(data.sigBytes - 1) >>> 2] & 0xff;
4263
4264
// Remove padding
4265
data.sigBytes -= nPaddingBytes;
4266
}
4267
};
4268
4269
4270
/**
4271
* ISO/IEC 9797-1 Padding Method 2.
4272
*/
4273
CryptoJS.pad.Iso97971 = {
4274
pad: function (data, blockSize) {
4275
// Add 0x80 byte
4276
data.concat(CryptoJS.lib.WordArray.create([0x80000000], 1));
4277
4278
// Zero pad the rest
4279
CryptoJS.pad.ZeroPadding.pad(data, blockSize);
4280
},
4281
4282
unpad: function (data) {
4283
// Remove zero padding
4284
CryptoJS.pad.ZeroPadding.unpad(data);
4285
4286
// Remove one more byte -- the 0x80 byte
4287
data.sigBytes--;
4288
}
4289
};
4290
4291
4292
/**
4293
* Output Feedback block mode.
4294
*/
4295
CryptoJS.mode.OFB = (function () {
4296
var OFB = CryptoJS.lib.BlockCipherMode.extend();
4297
4298
var Encryptor = OFB.Encryptor = OFB.extend({
4299
processBlock: function (words, offset) {
4300
// Shortcuts
4301
var cipher = this._cipher
4302
var blockSize = cipher.blockSize;
4303
var iv = this._iv;
4304
var keystream = this._keystream;
4305
4306
// Generate keystream
4307
if (iv) {
4308
keystream = this._keystream = iv.slice(0);
4309
4310
// Remove IV for subsequent blocks
4311
this._iv = undefined;
4312
}
4313
cipher.encryptBlock(keystream, 0);
4314
4315
// Encrypt
4316
for (var i = 0; i < blockSize; i++) {
4317
words[offset + i] ^= keystream[i];
4318
}
4319
}
4320
});
4321
4322
OFB.Decryptor = Encryptor;
4323
4324
return OFB;
4325
}());
4326
4327
4328
/**
4329
* A noop padding strategy.
4330
*/
4331
CryptoJS.pad.NoPadding = {
4332
pad: function () {
4333
},
4334
4335
unpad: function () {
4336
}
4337
};
4338
4339
4340
(function (undefined) {
4341
// Shortcuts
4342
var C = CryptoJS;
4343
var C_lib = C.lib;
4344
var CipherParams = C_lib.CipherParams;
4345
var C_enc = C.enc;
4346
var Hex = C_enc.Hex;
4347
var C_format = C.format;
4348
4349
var HexFormatter = C_format.Hex = {
4350
/**
4351
* Converts the ciphertext of a cipher params object to a hexadecimally encoded string.
4352
*
4353
* @param {CipherParams} cipherParams The cipher params object.
4354
*
4355
* @return {string} The hexadecimally encoded string.
4356
*
4357
* @static
4358
*
4359
* @example
4360
*
4361
* var hexString = CryptoJS.format.Hex.stringify(cipherParams);
4362
*/
4363
stringify: function (cipherParams) {
4364
return cipherParams.ciphertext.toString(Hex);
4365
},
4366
4367
/**
4368
* Converts a hexadecimally encoded ciphertext string to a cipher params object.
4369
*
4370
* @param {string} input The hexadecimally encoded string.
4371
*
4372
* @return {CipherParams} The cipher params object.
4373
*
4374
* @static
4375
*
4376
* @example
4377
*
4378
* var cipherParams = CryptoJS.format.Hex.parse(hexString);
4379
*/
4380
parse: function (input) {
4381
var ciphertext = Hex.parse(input);
4382
return CipherParams.create({ ciphertext: ciphertext });
4383
}
4384
};
4385
}());
4386
4387
4388
(function () {
4389
// Shortcuts
4390
var C = CryptoJS;
4391
var C_lib = C.lib;
4392
var BlockCipher = C_lib.BlockCipher;
4393
var C_algo = C.algo;
4394
4395
// Lookup tables
4396
var SBOX = [];
4397
var INV_SBOX = [];
4398
var SUB_MIX_0 = [];
4399
var SUB_MIX_1 = [];
4400
var SUB_MIX_2 = [];
4401
var SUB_MIX_3 = [];
4402
var INV_SUB_MIX_0 = [];
4403
var INV_SUB_MIX_1 = [];
4404
var INV_SUB_MIX_2 = [];
4405
var INV_SUB_MIX_3 = [];
4406
4407
// Compute lookup tables
4408
(function () {
4409
// Compute double table
4410
var d = [];
4411
for (var i = 0; i < 256; i++) {
4412
if (i < 128) {
4413
d[i] = i << 1;
4414
} else {
4415
d[i] = (i << 1) ^ 0x11b;
4416
}
4417
}
4418
4419
// Walk GF(2^8)
4420
var x = 0;
4421
var xi = 0;
4422
for (var i = 0; i < 256; i++) {
4423
// Compute sbox
4424
var sx = xi ^ (xi << 1) ^ (xi << 2) ^ (xi << 3) ^ (xi << 4);
4425
sx = (sx >>> 8) ^ (sx & 0xff) ^ 0x63;
4426
SBOX[x] = sx;
4427
INV_SBOX[sx] = x;
4428
4429
// Compute multiplication
4430
var x2 = d[x];
4431
var x4 = d[x2];
4432
var x8 = d[x4];
4433
4434
// Compute sub bytes, mix columns tables
4435
var t = (d[sx] * 0x101) ^ (sx * 0x1010100);
4436
SUB_MIX_0[x] = (t << 24) | (t >>> 8);
4437
SUB_MIX_1[x] = (t << 16) | (t >>> 16);
4438
SUB_MIX_2[x] = (t << 8) | (t >>> 24);
4439
SUB_MIX_3[x] = t;
4440
4441
// Compute inv sub bytes, inv mix columns tables
4442
var t = (x8 * 0x1010101) ^ (x4 * 0x10001) ^ (x2 * 0x101) ^ (x * 0x1010100);
4443
INV_SUB_MIX_0[sx] = (t << 24) | (t >>> 8);
4444
INV_SUB_MIX_1[sx] = (t << 16) | (t >>> 16);
4445
INV_SUB_MIX_2[sx] = (t << 8) | (t >>> 24);
4446
INV_SUB_MIX_3[sx] = t;
4447
4448
// Compute next counter
4449
if (!x) {
4450
x = xi = 1;
4451
} else {
4452
x = x2 ^ d[d[d[x8 ^ x2]]];
4453
xi ^= d[d[xi]];
4454
}
4455
}
4456
}());
4457
4458
// Precomputed Rcon lookup
4459
var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
4460
4461
/**
4462
* AES block cipher algorithm.
4463
*/
4464
var AES = C_algo.AES = BlockCipher.extend({
4465
_doReset: function () {
4466
// Skip reset of nRounds has been set before and key did not change
4467
if (this._nRounds && this._keyPriorReset === this._key) {
4468
return;
4469
}
4470
4471
// Shortcuts
4472
var key = this._keyPriorReset = this._key;
4473
var keyWords = key.words;
4474
var keySize = key.sigBytes / 4;
4475
4476
// Compute number of rounds
4477
var nRounds = this._nRounds = keySize + 6;
4478
4479
// Compute number of key schedule rows
4480
var ksRows = (nRounds + 1) * 4;
4481
4482
// Compute key schedule
4483
var keySchedule = this._keySchedule = [];
4484
for (var ksRow = 0; ksRow < ksRows; ksRow++) {
4485
if (ksRow < keySize) {
4486
keySchedule[ksRow] = keyWords[ksRow];
4487
} else {
4488
var t = keySchedule[ksRow - 1];
4489
4490
if (!(ksRow % keySize)) {
4491
// Rot word
4492
t = (t << 8) | (t >>> 24);
4493
4494
// Sub word
4495
t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
4496
4497
// Mix Rcon
4498
t ^= RCON[(ksRow / keySize) | 0] << 24;
4499
} else if (keySize > 6 && ksRow % keySize == 4) {
4500
// Sub word
4501
t = (SBOX[t >>> 24] << 24) | (SBOX[(t >>> 16) & 0xff] << 16) | (SBOX[(t >>> 8) & 0xff] << 8) | SBOX[t & 0xff];
4502
}
4503
4504
keySchedule[ksRow] = keySchedule[ksRow - keySize] ^ t;
4505
}
4506
}
4507
4508
// Compute inv key schedule
4509
var invKeySchedule = this._invKeySchedule = [];
4510
for (var invKsRow = 0; invKsRow < ksRows; invKsRow++) {
4511
var ksRow = ksRows - invKsRow;
4512
4513
if (invKsRow % 4) {
4514
var t = keySchedule[ksRow];
4515
} else {
4516
var t = keySchedule[ksRow - 4];
4517
}
4518
4519
if (invKsRow < 4 || ksRow <= 4) {
4520
invKeySchedule[invKsRow] = t;
4521
} else {
4522
invKeySchedule[invKsRow] = INV_SUB_MIX_0[SBOX[t >>> 24]] ^ INV_SUB_MIX_1[SBOX[(t >>> 16) & 0xff]] ^
4523
INV_SUB_MIX_2[SBOX[(t >>> 8) & 0xff]] ^ INV_SUB_MIX_3[SBOX[t & 0xff]];
4524
}
4525
}
4526
},
4527
4528
encryptBlock: function (M, offset) {
4529
this._doCryptBlock(M, offset, this._keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX);
4530
},
4531
4532
decryptBlock: function (M, offset) {
4533
// Swap 2nd and 4th rows
4534
var t = M[offset + 1];
4535
M[offset + 1] = M[offset + 3];
4536
M[offset + 3] = t;
4537
4538
this._doCryptBlock(M, offset, this._invKeySchedule, INV_SUB_MIX_0, INV_SUB_MIX_1, INV_SUB_MIX_2, INV_SUB_MIX_3, INV_SBOX);
4539
4540
// Inv swap 2nd and 4th rows
4541
var t = M[offset + 1];
4542
M[offset + 1] = M[offset + 3];
4543
M[offset + 3] = t;
4544
},
4545
4546
_doCryptBlock: function (M, offset, keySchedule, SUB_MIX_0, SUB_MIX_1, SUB_MIX_2, SUB_MIX_3, SBOX) {
4547
// Shortcut
4548
var nRounds = this._nRounds;
4549
4550
// Get input, add round key
4551
var s0 = M[offset] ^ keySchedule[0];
4552
var s1 = M[offset + 1] ^ keySchedule[1];
4553
var s2 = M[offset + 2] ^ keySchedule[2];
4554
var s3 = M[offset + 3] ^ keySchedule[3];
4555
4556
// Key schedule row counter
4557
var ksRow = 4;
4558
4559
// Rounds
4560
for (var round = 1; round < nRounds; round++) {
4561
// Shift rows, sub bytes, mix columns, add round key
4562
var t0 = SUB_MIX_0[s0 >>> 24] ^ SUB_MIX_1[(s1 >>> 16) & 0xff] ^ SUB_MIX_2[(s2 >>> 8) & 0xff] ^ SUB_MIX_3[s3 & 0xff] ^ keySchedule[ksRow++];
4563
var t1 = SUB_MIX_0[s1 >>> 24] ^ SUB_MIX_1[(s2 >>> 16) & 0xff] ^ SUB_MIX_2[(s3 >>> 8) & 0xff] ^ SUB_MIX_3[s0 & 0xff] ^ keySchedule[ksRow++];
4564
var t2 = SUB_MIX_0[s2 >>> 24] ^ SUB_MIX_1[(s3 >>> 16) & 0xff] ^ SUB_MIX_2[(s0 >>> 8) & 0xff] ^ SUB_MIX_3[s1 & 0xff] ^ keySchedule[ksRow++];
4565
var t3 = SUB_MIX_0[s3 >>> 24] ^ SUB_MIX_1[(s0 >>> 16) & 0xff] ^ SUB_MIX_2[(s1 >>> 8) & 0xff] ^ SUB_MIX_3[s2 & 0xff] ^ keySchedule[ksRow++];
4566
4567
// Update state
4568
s0 = t0;
4569
s1 = t1;
4570
s2 = t2;
4571
s3 = t3;
4572
}
4573
4574
// Shift rows, sub bytes, add round key
4575
var t0 = ((SBOX[s0 >>> 24] << 24) | (SBOX[(s1 >>> 16) & 0xff] << 16) | (SBOX[(s2 >>> 8) & 0xff] << 8) | SBOX[s3 & 0xff]) ^ keySchedule[ksRow++];
4576
var t1 = ((SBOX[s1 >>> 24] << 24) | (SBOX[(s2 >>> 16) & 0xff] << 16) | (SBOX[(s3 >>> 8) & 0xff] << 8) | SBOX[s0 & 0xff]) ^ keySchedule[ksRow++];
4577
var t2 = ((SBOX[s2 >>> 24] << 24) | (SBOX[(s3 >>> 16) & 0xff] << 16) | (SBOX[(s0 >>> 8) & 0xff] << 8) | SBOX[s1 & 0xff]) ^ keySchedule[ksRow++];
4578
var t3 = ((SBOX[s3 >>> 24] << 24) | (SBOX[(s0 >>> 16) & 0xff] << 16) | (SBOX[(s1 >>> 8) & 0xff] << 8) | SBOX[s2 & 0xff]) ^ keySchedule[ksRow++];
4579
4580
// Set output
4581
M[offset] = t0;
4582
M[offset + 1] = t1;
4583
M[offset + 2] = t2;
4584
M[offset + 3] = t3;
4585
},
4586
4587
keySize: 256/32
4588
});
4589
4590
/**
4591
* Shortcut functions to the cipher's object interface.
4592
*
4593
* @example
4594
*
4595
* var ciphertext = CryptoJS.AES.encrypt(message, key, cfg);
4596
* var plaintext = CryptoJS.AES.decrypt(ciphertext, key, cfg);
4597
*/
4598
C.AES = BlockCipher._createHelper(AES);
4599
}());
4600
4601
4602
(function () {
4603
// Shortcuts
4604
var C = CryptoJS;
4605
var C_lib = C.lib;
4606
var WordArray = C_lib.WordArray;
4607
var BlockCipher = C_lib.BlockCipher;
4608
var C_algo = C.algo;
4609
4610
// Permuted Choice 1 constants
4611
var PC1 = [
4612
57, 49, 41, 33, 25, 17, 9, 1,
4613
58, 50, 42, 34, 26, 18, 10, 2,
4614
59, 51, 43, 35, 27, 19, 11, 3,
4615
60, 52, 44, 36, 63, 55, 47, 39,
4616
31, 23, 15, 7, 62, 54, 46, 38,
4617
30, 22, 14, 6, 61, 53, 45, 37,
4618
29, 21, 13, 5, 28, 20, 12, 4
4619
];
4620
4621
// Permuted Choice 2 constants
4622
var PC2 = [
4623
14, 17, 11, 24, 1, 5,
4624
3, 28, 15, 6, 21, 10,
4625
23, 19, 12, 4, 26, 8,
4626
16, 7, 27, 20, 13, 2,
4627
41, 52, 31, 37, 47, 55,
4628
30, 40, 51, 45, 33, 48,
4629
44, 49, 39, 56, 34, 53,
4630
46, 42, 50, 36, 29, 32
4631
];
4632
4633
// Cumulative bit shift constants
4634
var BIT_SHIFTS = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28];
4635
4636
// SBOXes and round permutation constants
4637
var SBOX_P = [
4638
{
4639
0x0: 0x808200,
4640
0x10000000: 0x8000,
4641
0x20000000: 0x808002,
4642
0x30000000: 0x2,
4643
0x40000000: 0x200,
4644
0x50000000: 0x808202,
4645
0x60000000: 0x800202,
4646
0x70000000: 0x800000,
4647
0x80000000: 0x202,
4648
0x90000000: 0x800200,
4649
0xa0000000: 0x8200,
4650
0xb0000000: 0x808000,
4651
0xc0000000: 0x8002,
4652
0xd0000000: 0x800002,
4653
0xe0000000: 0x0,
4654
0xf0000000: 0x8202,
4655
0x8000000: 0x0,
4656
0x18000000: 0x808202,
4657
0x28000000: 0x8202,
4658
0x38000000: 0x8000,
4659
0x48000000: 0x808200,
4660
0x58000000: 0x200,
4661
0x68000000: 0x808002,
4662
0x78000000: 0x2,
4663
0x88000000: 0x800200,
4664
0x98000000: 0x8200,
4665
0xa8000000: 0x808000,
4666
0xb8000000: 0x800202,
4667
0xc8000000: 0x800002,
4668
0xd8000000: 0x8002,
4669
0xe8000000: 0x202,
4670
0xf8000000: 0x800000,
4671
0x1: 0x8000,
4672
0x10000001: 0x2,
4673
0x20000001: 0x808200,
4674
0x30000001: 0x800000,
4675
0x40000001: 0x808002,
4676
0x50000001: 0x8200,
4677
0x60000001: 0x200,
4678
0x70000001: 0x800202,
4679
0x80000001: 0x808202,
4680
0x90000001: 0x808000,
4681
0xa0000001: 0x800002,
4682
0xb0000001: 0x8202,
4683
0xc0000001: 0x202,
4684
0xd0000001: 0x800200,
4685
0xe0000001: 0x8002,
4686
0xf0000001: 0x0,
4687
0x8000001: 0x808202,
4688
0x18000001: 0x808000,
4689
0x28000001: 0x800000,
4690
0x38000001: 0x200,
4691
0x48000001: 0x8000,
4692
0x58000001: 0x800002,
4693
0x68000001: 0x2,
4694
0x78000001: 0x8202,
4695
0x88000001: 0x8002,
4696
0x98000001: 0x800202,
4697
0xa8000001: 0x202,
4698
0xb8000001: 0x808200,
4699
0xc8000001: 0x800200,
4700
0xd8000001: 0x0,
4701
0xe8000001: 0x8200,
4702
0xf8000001: 0x808002
4703
},
4704
{
4705
0x0: 0x40084010,
4706
0x1000000: 0x4000,
4707
0x2000000: 0x80000,
4708
0x3000000: 0x40080010,
4709
0x4000000: 0x40000010,
4710
0x5000000: 0x40084000,
4711
0x6000000: 0x40004000,
4712
0x7000000: 0x10,
4713
0x8000000: 0x84000,
4714
0x9000000: 0x40004010,
4715
0xa000000: 0x40000000,
4716
0xb000000: 0x84010,
4717
0xc000000: 0x80010,
4718
0xd000000: 0x0,
4719
0xe000000: 0x4010,
4720
0xf000000: 0x40080000,
4721
0x800000: 0x40004000,
4722
0x1800000: 0x84010,
4723
0x2800000: 0x10,
4724
0x3800000: 0x40004010,
4725
0x4800000: 0x40084010,
4726
0x5800000: 0x40000000,
4727
0x6800000: 0x80000,
4728
0x7800000: 0x40080010,
4729
0x8800000: 0x80010,
4730
0x9800000: 0x0,
4731
0xa800000: 0x4000,
4732
0xb800000: 0x40080000,
4733
0xc800000: 0x40000010,
4734
0xd800000: 0x84000,
4735
0xe800000: 0x40084000,
4736
0xf800000: 0x4010,
4737
0x10000000: 0x0,
4738
0x11000000: 0x40080010,
4739
0x12000000: 0x40004010,
4740
0x13000000: 0x40084000,
4741
0x14000000: 0x40080000,
4742
0x15000000: 0x10,
4743
0x16000000: 0x84010,
4744
0x17000000: 0x4000,
4745
0x18000000: 0x4010,
4746
0x19000000: 0x80000,
4747
0x1a000000: 0x80010,
4748
0x1b000000: 0x40000010,
4749
0x1c000000: 0x84000,
4750
0x1d000000: 0x40004000,
4751
0x1e000000: 0x40000000,
4752
0x1f000000: 0x40084010,
4753
0x10800000: 0x84010,
4754
0x11800000: 0x80000,
4755
0x12800000: 0x40080000,
4756
0x13800000: 0x4000,
4757
0x14800000: 0x40004000,
4758
0x15800000: 0x40084010,
4759
0x16800000: 0x10,
4760
0x17800000: 0x40000000,
4761
0x18800000: 0x40084000,
4762
0x19800000: 0x40000010,
4763
0x1a800000: 0x40004010,
4764
0x1b800000: 0x80010,
4765
0x1c800000: 0x0,
4766
0x1d800000: 0x4010,
4767
0x1e800000: 0x40080010,
4768
0x1f800000: 0x84000
4769
},
4770
{
4771
0x0: 0x104,
4772
0x100000: 0x0,
4773
0x200000: 0x4000100,
4774
0x300000: 0x10104,
4775
0x400000: 0x10004,
4776
0x500000: 0x4000004,
4777
0x600000: 0x4010104,
4778
0x700000: 0x4010000,
4779
0x800000: 0x4000000,
4780
0x900000: 0x4010100,
4781
0xa00000: 0x10100,
4782
0xb00000: 0x4010004,
4783
0xc00000: 0x4000104,
4784
0xd00000: 0x10000,
4785
0xe00000: 0x4,
4786
0xf00000: 0x100,
4787
0x80000: 0x4010100,
4788
0x180000: 0x4010004,
4789
0x280000: 0x0,
4790
0x380000: 0x4000100,
4791
0x480000: 0x4000004,
4792
0x580000: 0x10000,
4793
0x680000: 0x10004,
4794
0x780000: 0x104,
4795
0x880000: 0x4,
4796
0x980000: 0x100,
4797
0xa80000: 0x4010000,
4798
0xb80000: 0x10104,
4799
0xc80000: 0x10100,
4800
0xd80000: 0x4000104,
4801
0xe80000: 0x4010104,
4802
0xf80000: 0x4000000,
4803
0x1000000: 0x4010100,
4804
0x1100000: 0x10004,
4805
0x1200000: 0x10000,
4806
0x1300000: 0x4000100,
4807
0x1400000: 0x100,
4808
0x1500000: 0x4010104,
4809
0x1600000: 0x4000004,
4810
0x1700000: 0x0,
4811
0x1800000: 0x4000104,
4812
0x1900000: 0x4000000,
4813
0x1a00000: 0x4,
4814
0x1b00000: 0x10100,
4815
0x1c00000: 0x4010000,
4816
0x1d00000: 0x104,
4817
0x1e00000: 0x10104,
4818
0x1f00000: 0x4010004,
4819
0x1080000: 0x4000000,
4820
0x1180000: 0x104,
4821
0x1280000: 0x4010100,
4822
0x1380000: 0x0,
4823
0x1480000: 0x10004,
4824
0x1580000: 0x4000100,
4825
0x1680000: 0x100,
4826
0x1780000: 0x4010004,
4827
0x1880000: 0x10000,
4828
0x1980000: 0x4010104,
4829
0x1a80000: 0x10104,
4830
0x1b80000: 0x4000004,
4831
0x1c80000: 0x4000104,
4832
0x1d80000: 0x4010000,
4833
0x1e80000: 0x4,
4834
0x1f80000: 0x10100
4835
},
4836
{
4837
0x0: 0x80401000,
4838
0x10000: 0x80001040,
4839
0x20000: 0x401040,
4840
0x30000: 0x80400000,
4841
0x40000: 0x0,
4842
0x50000: 0x401000,
4843
0x60000: 0x80000040,
4844
0x70000: 0x400040,
4845
0x80000: 0x80000000,
4846
0x90000: 0x400000,
4847
0xa0000: 0x40,
4848
0xb0000: 0x80001000,
4849
0xc0000: 0x80400040,
4850
0xd0000: 0x1040,
4851
0xe0000: 0x1000,
4852
0xf0000: 0x80401040,
4853
0x8000: 0x80001040,
4854
0x18000: 0x40,
4855
0x28000: 0x80400040,
4856
0x38000: 0x80001000,
4857
0x48000: 0x401000,
4858
0x58000: 0x80401040,
4859
0x68000: 0x0,
4860
0x78000: 0x80400000,
4861
0x88000: 0x1000,
4862
0x98000: 0x80401000,
4863
0xa8000: 0x400000,
4864
0xb8000: 0x1040,
4865
0xc8000: 0x80000000,
4866
0xd8000: 0x400040,
4867
0xe8000: 0x401040,
4868
0xf8000: 0x80000040,
4869
0x100000: 0x400040,
4870
0x110000: 0x401000,
4871
0x120000: 0x80000040,
4872
0x130000: 0x0,
4873
0x140000: 0x1040,
4874
0x150000: 0x80400040,
4875
0x160000: 0x80401000,
4876
0x170000: 0x80001040,
4877
0x180000: 0x80401040,
4878
0x190000: 0x80000000,
4879
0x1a0000: 0x80400000,
4880
0x1b0000: 0x401040,
4881
0x1c0000: 0x80001000,
4882
0x1d0000: 0x400000,
4883
0x1e0000: 0x40,
4884
0x1f0000: 0x1000,
4885
0x108000: 0x80400000,
4886
0x118000: 0x80401040,
4887
0x128000: 0x0,
4888
0x138000: 0x401000,
4889
0x148000: 0x400040,
4890
0x158000: 0x80000000,
4891
0x168000: 0x80001040,
4892
0x178000: 0x40,
4893
0x188000: 0x80000040,
4894
0x198000: 0x1000,
4895
0x1a8000: 0x80001000,
4896
0x1b8000: 0x80400040,
4897
0x1c8000: 0x1040,
4898
0x1d8000: 0x80401000,
4899
0x1e8000: 0x400000,
4900
0x1f8000: 0x401040
4901
},
4902
{
4903
0x0: 0x80,
4904
0x1000: 0x1040000,
4905
0x2000: 0x40000,
4906
0x3000: 0x20000000,
4907
0x4000: 0x20040080,
4908
0x5000: 0x1000080,
4909
0x6000: 0x21000080,
4910
0x7000: 0x40080,
4911
0x8000: 0x1000000,
4912
0x9000: 0x20040000,
4913
0xa000: 0x20000080,
4914
0xb000: 0x21040080,
4915
0xc000: 0x21040000,
4916
0xd000: 0x0,
4917
0xe000: 0x1040080,
4918
0xf000: 0x21000000,
4919
0x800: 0x1040080,
4920
0x1800: 0x21000080,
4921
0x2800: 0x80,
4922
0x3800: 0x1040000,
4923
0x4800: 0x40000,
4924
0x5800: 0x20040080,
4925
0x6800: 0x21040000,
4926
0x7800: 0x20000000,
4927
0x8800: 0x20040000,
4928
0x9800: 0x0,
4929
0xa800: 0x21040080,
4930
0xb800: 0x1000080,
4931
0xc800: 0x20000080,
4932
0xd800: 0x21000000,
4933
0xe800: 0x1000000,
4934
0xf800: 0x40080,
4935
0x10000: 0x40000,
4936
0x11000: 0x80,
4937
0x12000: 0x20000000,
4938
0x13000: 0x21000080,
4939
0x14000: 0x1000080,
4940
0x15000: 0x21040000,
4941
0x16000: 0x20040080,
4942
0x17000: 0x1000000,
4943
0x18000: 0x21040080,
4944
0x19000: 0x21000000,
4945
0x1a000: 0x1040000,
4946
0x1b000: 0x20040000,
4947
0x1c000: 0x40080,
4948
0x1d000: 0x20000080,
4949
0x1e000: 0x0,
4950
0x1f000: 0x1040080,
4951
0x10800: 0x21000080,
4952
0x11800: 0x1000000,
4953
0x12800: 0x1040000,
4954
0x13800: 0x20040080,
4955
0x14800: 0x20000000,
4956
0x15800: 0x1040080,
4957
0x16800: 0x80,
4958
0x17800: 0x21040000,
4959
0x18800: 0x40080,
4960
0x19800: 0x21040080,
4961
0x1a800: 0x0,
4962
0x1b800: 0x21000000,
4963
0x1c800: 0x1000080,
4964
0x1d800: 0x40000,
4965
0x1e800: 0x20040000,
4966
0x1f800: 0x20000080
4967
},
4968
{
4969
0x0: 0x10000008,
4970
0x100: 0x2000,
4971
0x200: 0x10200000,
4972
0x300: 0x10202008,
4973
0x400: 0x10002000,
4974
0x500: 0x200000,
4975
0x600: 0x200008,
4976
0x700: 0x10000000,
4977
0x800: 0x0,
4978
0x900: 0x10002008,
4979
0xa00: 0x202000,
4980
0xb00: 0x8,
4981
0xc00: 0x10200008,
4982
0xd00: 0x202008,
4983
0xe00: 0x2008,
4984
0xf00: 0x10202000,
4985
0x80: 0x10200000,
4986
0x180: 0x10202008,
4987
0x280: 0x8,
4988
0x380: 0x200000,
4989
0x480: 0x202008,
4990
0x580: 0x10000008,
4991
0x680: 0x10002000,
4992
0x780: 0x2008,
4993
0x880: 0x200008,
4994
0x980: 0x2000,
4995
0xa80: 0x10002008,
4996
0xb80: 0x10200008,
4997
0xc80: 0x0,
4998
0xd80: 0x10202000,
4999
0xe80: 0x202000,
5000
0xf80: 0x10000000,
5001
0x1000: 0x10002000,
5002
0x1100: 0x10200008,
5003
0x1200: 0x10202008,
5004
0x1300: 0x2008,
5005
0x1400: 0x200000,
5006
0x1500: 0x10000000,
5007
0x1600: 0x10000008,
5008
0x1700: 0x202000,
5009
0x1800: 0x202008,
5010
0x1900: 0x0,
5011
0x1a00: 0x8,
5012
0x1b00: 0x10200000,
5013
0x1c00: 0x2000,
5014
0x1d00: 0x10002008,
5015
0x1e00: 0x10202000,
5016
0x1f00: 0x200008,
5017
0x1080: 0x8,
5018
0x1180: 0x202000,
5019
0x1280: 0x200000,
5020
0x1380: 0x10000008,
5021
0x1480: 0x10002000,
5022
0x1580: 0x2008,
5023
0x1680: 0x10202008,
5024
0x1780: 0x10200000,
5025
0x1880: 0x10202000,
5026
0x1980: 0x10200008,
5027
0x1a80: 0x2000,
5028
0x1b80: 0x202008,
5029
0x1c80: 0x200008,
5030
0x1d80: 0x0,
5031
0x1e80: 0x10000000,
5032
0x1f80: 0x10002008
5033
},
5034
{
5035
0x0: 0x100000,
5036
0x10: 0x2000401,
5037
0x20: 0x400,
5038
0x30: 0x100401,
5039
0x40: 0x2100401,
5040
0x50: 0x0,
5041
0x60: 0x1,
5042
0x70: 0x2100001,
5043
0x80: 0x2000400,
5044
0x90: 0x100001,
5045
0xa0: 0x2000001,
5046
0xb0: 0x2100400,
5047
0xc0: 0x2100000,
5048
0xd0: 0x401,
5049
0xe0: 0x100400,
5050
0xf0: 0x2000000,
5051
0x8: 0x2100001,
5052
0x18: 0x0,
5053
0x28: 0x2000401,
5054
0x38: 0x2100400,
5055
0x48: 0x100000,
5056
0x58: 0x2000001,
5057
0x68: 0x2000000,
5058
0x78: 0x401,
5059
0x88: 0x100401,
5060
0x98: 0x2000400,
5061
0xa8: 0x2100000,
5062
0xb8: 0x100001,
5063
0xc8: 0x400,
5064
0xd8: 0x2100401,
5065
0xe8: 0x1,
5066
0xf8: 0x100400,
5067
0x100: 0x2000000,
5068
0x110: 0x100000,
5069
0x120: 0x2000401,
5070
0x130: 0x2100001,
5071
0x140: 0x100001,
5072
0x150: 0x2000400,
5073
0x160: 0x2100400,
5074
0x170: 0x100401,
5075
0x180: 0x401,
5076
0x190: 0x2100401,
5077
0x1a0: 0x100400,
5078
0x1b0: 0x1,
5079
0x1c0: 0x0,
5080
0x1d0: 0x2100000,
5081
0x1e0: 0x2000001,
5082
0x1f0: 0x400,
5083
0x108: 0x100400,
5084
0x118: 0x2000401,
5085
0x128: 0x2100001,
5086
0x138: 0x1,
5087
0x148: 0x2000000,
5088
0x158: 0x100000,
5089
0x168: 0x401,
5090
0x178: 0x2100400,
5091
0x188: 0x2000001,
5092
0x198: 0x2100000,
5093
0x1a8: 0x0,
5094
0x1b8: 0x2100401,
5095
0x1c8: 0x100401,
5096
0x1d8: 0x400,
5097
0x1e8: 0x2000400,
5098
0x1f8: 0x100001
5099
},
5100
{
5101
0x0: 0x8000820,
5102
0x1: 0x20000,
5103
0x2: 0x8000000,
5104
0x3: 0x20,
5105
0x4: 0x20020,
5106
0x5: 0x8020820,
5107
0x6: 0x8020800,
5108
0x7: 0x800,
5109
0x8: 0x8020000,
5110
0x9: 0x8000800,
5111
0xa: 0x20800,
5112
0xb: 0x8020020,
5113
0xc: 0x820,
5114
0xd: 0x0,
5115
0xe: 0x8000020,
5116
0xf: 0x20820,
5117
0x80000000: 0x800,
5118
0x80000001: 0x8020820,
5119
0x80000002: 0x8000820,
5120
0x80000003: 0x8000000,
5121
0x80000004: 0x8020000,
5122
0x80000005: 0x20800,
5123
0x80000006: 0x20820,
5124
0x80000007: 0x20,
5125
0x80000008: 0x8000020,
5126
0x80000009: 0x820,
5127
0x8000000a: 0x20020,
5128
0x8000000b: 0x8020800,
5129
0x8000000c: 0x0,
5130
0x8000000d: 0x8020020,
5131
0x8000000e: 0x8000800,
5132
0x8000000f: 0x20000,
5133
0x10: 0x20820,
5134
0x11: 0x8020800,
5135
0x12: 0x20,
5136
0x13: 0x800,
5137
0x14: 0x8000800,
5138
0x15: 0x8000020,
5139
0x16: 0x8020020,
5140
0x17: 0x20000,
5141
0x18: 0x0,
5142
0x19: 0x20020,
5143
0x1a: 0x8020000,
5144
0x1b: 0x8000820,
5145
0x1c: 0x8020820,
5146
0x1d: 0x20800,
5147
0x1e: 0x820,
5148
0x1f: 0x8000000,
5149
0x80000010: 0x20000,
5150
0x80000011: 0x800,
5151
0x80000012: 0x8020020,
5152
0x80000013: 0x20820,
5153
0x80000014: 0x20,
5154
0x80000015: 0x8020000,
5155
0x80000016: 0x8000000,
5156
0x80000017: 0x8000820,
5157
0x80000018: 0x8020820,
5158
0x80000019: 0x8000020,
5159
0x8000001a: 0x8000800,
5160
0x8000001b: 0x0,
5161
0x8000001c: 0x20800,
5162
0x8000001d: 0x820,
5163
0x8000001e: 0x20020,
5164
0x8000001f: 0x8020800
5165
}
5166
];
5167
5168
// Masks that select the SBOX input
5169
var SBOX_MASK = [
5170
0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
5171
0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f
5172
];
5173
5174
/**
5175
* DES block cipher algorithm.
5176
*/
5177
var DES = C_algo.DES = BlockCipher.extend({
5178
_doReset: function () {
5179
// Shortcuts
5180
var key = this._key;
5181
var keyWords = key.words;
5182
5183
// Select 56 bits according to PC1
5184
var keyBits = [];
5185
for (var i = 0; i < 56; i++) {
5186
var keyBitPos = PC1[i] - 1;
5187
keyBits[i] = (keyWords[keyBitPos >>> 5] >>> (31 - keyBitPos % 32)) & 1;
5188
}
5189
5190
// Assemble 16 subkeys
5191
var subKeys = this._subKeys = [];
5192
for (var nSubKey = 0; nSubKey < 16; nSubKey++) {
5193
// Create subkey
5194
var subKey = subKeys[nSubKey] = [];
5195
5196
// Shortcut
5197
var bitShift = BIT_SHIFTS[nSubKey];
5198
5199
// Select 48 bits according to PC2
5200
for (var i = 0; i < 24; i++) {
5201
// Select from the left 28 key bits
5202
subKey[(i / 6) | 0] |= keyBits[((PC2[i] - 1) + bitShift) % 28] << (31 - i % 6);
5203
5204
// Select from the right 28 key bits
5205
subKey[4 + ((i / 6) | 0)] |= keyBits[28 + (((PC2[i + 24] - 1) + bitShift) % 28)] << (31 - i % 6);
5206
}
5207
5208
// Since each subkey is applied to an expanded 32-bit input,
5209
// the subkey can be broken into 8 values scaled to 32-bits,
5210
// which allows the key to be used without expansion
5211
subKey[0] = (subKey[0] << 1) | (subKey[0] >>> 31);
5212
for (var i = 1; i < 7; i++) {
5213
subKey[i] = subKey[i] >>> ((i - 1) * 4 + 3);
5214
}
5215
subKey[7] = (subKey[7] << 5) | (subKey[7] >>> 27);
5216
}
5217
5218
// Compute inverse subkeys
5219
var invSubKeys = this._invSubKeys = [];
5220
for (var i = 0; i < 16; i++) {
5221
invSubKeys[i] = subKeys[15 - i];
5222
}
5223
},
5224
5225
encryptBlock: function (M, offset) {
5226
this._doCryptBlock(M, offset, this._subKeys);
5227
},
5228
5229
decryptBlock: function (M, offset) {
5230
this._doCryptBlock(M, offset, this._invSubKeys);
5231
},
5232
5233
_doCryptBlock: function (M, offset, subKeys) {
5234
// Get input
5235
this._lBlock = M[offset];
5236
this._rBlock = M[offset + 1];
5237
5238
// Initial permutation
5239
exchangeLR.call(this, 4, 0x0f0f0f0f);
5240
exchangeLR.call(this, 16, 0x0000ffff);
5241
exchangeRL.call(this, 2, 0x33333333);
5242
exchangeRL.call(this, 8, 0x00ff00ff);
5243
exchangeLR.call(this, 1, 0x55555555);
5244
5245
// Rounds
5246
for (var round = 0; round < 16; round++) {
5247
// Shortcuts
5248
var subKey = subKeys[round];
5249
var lBlock = this._lBlock;
5250
var rBlock = this._rBlock;
5251
5252
// Feistel function
5253
var f = 0;
5254
for (var i = 0; i < 8; i++) {
5255
f |= SBOX_P[i][((rBlock ^ subKey[i]) & SBOX_MASK[i]) >>> 0];
5256
}
5257
this._lBlock = rBlock;
5258
this._rBlock = lBlock ^ f;
5259
}
5260
5261
// Undo swap from last round
5262
var t = this._lBlock;
5263
this._lBlock = this._rBlock;
5264
this._rBlock = t;
5265
5266
// Final permutation
5267
exchangeLR.call(this, 1, 0x55555555);
5268
exchangeRL.call(this, 8, 0x00ff00ff);
5269
exchangeRL.call(this, 2, 0x33333333);
5270
exchangeLR.call(this, 16, 0x0000ffff);
5271
exchangeLR.call(this, 4, 0x0f0f0f0f);
5272
5273
// Set output
5274
M[offset] = this._lBlock;
5275
M[offset + 1] = this._rBlock;
5276
},
5277
5278
keySize: 64/32,
5279
5280
ivSize: 64/32,
5281
5282
blockSize: 64/32
5283
});
5284
5285
// Swap bits across the left and right words
5286
function exchangeLR(offset, mask) {
5287
var t = ((this._lBlock >>> offset) ^ this._rBlock) & mask;
5288
this._rBlock ^= t;
5289
this._lBlock ^= t << offset;
5290
}
5291
5292
function exchangeRL(offset, mask) {
5293
var t = ((this._rBlock >>> offset) ^ this._lBlock) & mask;
5294
this._lBlock ^= t;
5295
this._rBlock ^= t << offset;
5296
}
5297
5298
/**
5299
* Shortcut functions to the cipher's object interface.
5300
*
5301
* @example
5302
*
5303
* var ciphertext = CryptoJS.DES.encrypt(message, key, cfg);
5304
* var plaintext = CryptoJS.DES.decrypt(ciphertext, key, cfg);
5305
*/
5306
C.DES = BlockCipher._createHelper(DES);
5307
5308
/**
5309
* Triple-DES block cipher algorithm.
5310
*/
5311
var TripleDES = C_algo.TripleDES = BlockCipher.extend({
5312
_doReset: function () {
5313
// Shortcuts
5314
var key = this._key;
5315
var keyWords = key.words;
5316
5317
// Create DES instances
5318
this._des1 = DES.createEncryptor(WordArray.create(keyWords.slice(0, 2)));
5319
this._des2 = DES.createEncryptor(WordArray.create(keyWords.slice(2, 4)));
5320
this._des3 = DES.createEncryptor(WordArray.create(keyWords.slice(4, 6)));
5321
},
5322
5323
encryptBlock: function (M, offset) {
5324
this._des1.encryptBlock(M, offset);
5325
this._des2.decryptBlock(M, offset);
5326
this._des3.encryptBlock(M, offset);
5327
},
5328
5329
decryptBlock: function (M, offset) {
5330
this._des3.decryptBlock(M, offset);
5331
this._des2.encryptBlock(M, offset);
5332
this._des1.decryptBlock(M, offset);
5333
},
5334
5335
keySize: 192/32,
5336
5337
ivSize: 64/32,
5338
5339
blockSize: 64/32
5340
});
5341
5342
/**
5343
* Shortcut functions to the cipher's object interface.
5344
*
5345
* @example
5346
*
5347
* var ciphertext = CryptoJS.TripleDES.encrypt(message, key, cfg);
5348
* var plaintext = CryptoJS.TripleDES.decrypt(ciphertext, key, cfg);
5349
*/
5350
C.TripleDES = BlockCipher._createHelper(TripleDES);
5351
}());
5352
5353
5354
(function () {
5355
// Shortcuts
5356
var C = CryptoJS;
5357
var C_lib = C.lib;
5358
var StreamCipher = C_lib.StreamCipher;
5359
var C_algo = C.algo;
5360
5361
/**
5362
* RC4 stream cipher algorithm.
5363
*/
5364
var RC4 = C_algo.RC4 = StreamCipher.extend({
5365
_doReset: function () {
5366
// Shortcuts
5367
var key = this._key;
5368
var keyWords = key.words;
5369
var keySigBytes = key.sigBytes;
5370
5371
// Init sbox
5372
var S = this._S = [];
5373
for (var i = 0; i < 256; i++) {
5374
S[i] = i;
5375
}
5376
5377
// Key setup
5378
for (var i = 0, j = 0; i < 256; i++) {
5379
var keyByteIndex = i % keySigBytes;
5380
var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
5381
5382
j = (j + S[i] + keyByte) % 256;
5383
5384
// Swap
5385
var t = S[i];
5386
S[i] = S[j];
5387
S[j] = t;
5388
}
5389
5390
// Counters
5391
this._i = this._j = 0;
5392
},
5393
5394
_doProcessBlock: function (M, offset) {
5395
M[offset] ^= generateKeystreamWord.call(this);
5396
},
5397
5398
keySize: 256/32,
5399
5400
ivSize: 0
5401
});
5402
5403
function generateKeystreamWord() {
5404
// Shortcuts
5405
var S = this._S;
5406
var i = this._i;
5407
var j = this._j;
5408
5409
// Generate keystream word
5410
var keystreamWord = 0;
5411
for (var n = 0; n < 4; n++) {
5412
i = (i + 1) % 256;
5413
j = (j + S[i]) % 256;
5414
5415
// Swap
5416
var t = S[i];
5417
S[i] = S[j];
5418
S[j] = t;
5419
5420
keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
5421
}
5422
5423
// Update counters
5424
this._i = i;
5425
this._j = j;
5426
5427
return keystreamWord;
5428
}
5429
5430
/**
5431
* Shortcut functions to the cipher's object interface.
5432
*
5433
* @example
5434
*
5435
* var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
5436
* var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
5437
*/
5438
C.RC4 = StreamCipher._createHelper(RC4);
5439
5440
/**
5441
* Modified RC4 stream cipher algorithm.
5442
*/
5443
var RC4Drop = C_algo.RC4Drop = RC4.extend({
5444
/**
5445
* Configuration options.
5446
*
5447
* @property {number} drop The number of keystream words to drop. Default 192
5448
*/
5449
cfg: RC4.cfg.extend({
5450
drop: 192
5451
}),
5452
5453
_doReset: function () {
5454
RC4._doReset.call(this);
5455
5456
// Drop
5457
for (var i = this.cfg.drop; i > 0; i--) {
5458
generateKeystreamWord.call(this);
5459
}
5460
}
5461
});
5462
5463
/**
5464
* Shortcut functions to the cipher's object interface.
5465
*
5466
* @example
5467
*
5468
* var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
5469
* var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
5470
*/
5471
C.RC4Drop = StreamCipher._createHelper(RC4Drop);
5472
}());
5473
5474
5475
/** @preserve
5476
* Counter block mode compatible with Dr Brian Gladman fileenc.c
5477
* derived from CryptoJS.mode.CTR
5478
* Jan Hruby [email protected]
5479
*/
5480
CryptoJS.mode.CTRGladman = (function () {
5481
var CTRGladman = CryptoJS.lib.BlockCipherMode.extend();
5482
5483
function incWord(word)
5484
{
5485
if (((word >> 24) & 0xff) === 0xff) { //overflow
5486
var b1 = (word >> 16)&0xff;
5487
var b2 = (word >> 8)&0xff;
5488
var b3 = word & 0xff;
5489
5490
if (b1 === 0xff) // overflow b1
5491
{
5492
b1 = 0;
5493
if (b2 === 0xff)
5494
{
5495
b2 = 0;
5496
if (b3 === 0xff)
5497
{
5498
b3 = 0;
5499
}
5500
else
5501
{
5502
++b3;
5503
}
5504
}
5505
else
5506
{
5507
++b2;
5508
}
5509
}
5510
else
5511
{
5512
++b1;
5513
}
5514
5515
word = 0;
5516
word += (b1 << 16);
5517
word += (b2 << 8);
5518
word += b3;
5519
}
5520
else
5521
{
5522
word += (0x01 << 24);
5523
}
5524
return word;
5525
}
5526
5527
function incCounter(counter)
5528
{
5529
if ((counter[0] = incWord(counter[0])) === 0)
5530
{
5531
// encr_data in fileenc.c from Dr Brian Gladman's counts only with DWORD j < 8
5532
counter[1] = incWord(counter[1]);
5533
}
5534
return counter;
5535
}
5536
5537
var Encryptor = CTRGladman.Encryptor = CTRGladman.extend({
5538
processBlock: function (words, offset) {
5539
// Shortcuts
5540
var cipher = this._cipher
5541
var blockSize = cipher.blockSize;
5542
var iv = this._iv;
5543
var counter = this._counter;
5544
5545
// Generate keystream
5546
if (iv) {
5547
counter = this._counter = iv.slice(0);
5548
5549
// Remove IV for subsequent blocks
5550
this._iv = undefined;
5551
}
5552
5553
incCounter(counter);
5554
5555
var keystream = counter.slice(0);
5556
cipher.encryptBlock(keystream, 0);
5557
5558
// Encrypt
5559
for (var i = 0; i < blockSize; i++) {
5560
words[offset + i] ^= keystream[i];
5561
}
5562
}
5563
});
5564
5565
CTRGladman.Decryptor = Encryptor;
5566
5567
return CTRGladman;
5568
}());
5569
5570
5571
5572
5573
(function () {
5574
// Shortcuts
5575
var C = CryptoJS;
5576
var C_lib = C.lib;
5577
var StreamCipher = C_lib.StreamCipher;
5578
var C_algo = C.algo;
5579
5580
// Reusable objects
5581
var S = [];
5582
var C_ = [];
5583
var G = [];
5584
5585
/**
5586
* Rabbit stream cipher algorithm
5587
*/
5588
var Rabbit = C_algo.Rabbit = StreamCipher.extend({
5589
_doReset: function () {
5590
// Shortcuts
5591
var K = this._key.words;
5592
var iv = this.cfg.iv;
5593
5594
// Swap endian
5595
for (var i = 0; i < 4; i++) {
5596
K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |
5597
(((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);
5598
}
5599
5600
// Generate initial state values
5601
var X = this._X = [
5602
K[0], (K[3] << 16) | (K[2] >>> 16),
5603
K[1], (K[0] << 16) | (K[3] >>> 16),
5604
K[2], (K[1] << 16) | (K[0] >>> 16),
5605
K[3], (K[2] << 16) | (K[1] >>> 16)
5606
];
5607
5608
// Generate initial counter values
5609
var C = this._C = [
5610
(K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
5611
(K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
5612
(K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
5613
(K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
5614
];
5615
5616
// Carry bit
5617
this._b = 0;
5618
5619
// Iterate the system four times
5620
for (var i = 0; i < 4; i++) {
5621
nextState.call(this);
5622
}
5623
5624
// Modify the counters
5625
for (var i = 0; i < 8; i++) {
5626
C[i] ^= X[(i + 4) & 7];
5627
}
5628
5629
// IV setup
5630
if (iv) {
5631
// Shortcuts
5632
var IV = iv.words;
5633
var IV_0 = IV[0];
5634
var IV_1 = IV[1];
5635
5636
// Generate four subvectors
5637
var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
5638
var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
5639
var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
5640
var i3 = (i2 << 16) | (i0 & 0x0000ffff);
5641
5642
// Modify counter values
5643
C[0] ^= i0;
5644
C[1] ^= i1;
5645
C[2] ^= i2;
5646
C[3] ^= i3;
5647
C[4] ^= i0;
5648
C[5] ^= i1;
5649
C[6] ^= i2;
5650
C[7] ^= i3;
5651
5652
// Iterate the system four times
5653
for (var i = 0; i < 4; i++) {
5654
nextState.call(this);
5655
}
5656
}
5657
},
5658
5659
_doProcessBlock: function (M, offset) {
5660
// Shortcut
5661
var X = this._X;
5662
5663
// Iterate the system
5664
nextState.call(this);
5665
5666
// Generate four keystream words
5667
S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
5668
S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
5669
S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
5670
S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
5671
5672
for (var i = 0; i < 4; i++) {
5673
// Swap endian
5674
S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
5675
(((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
5676
5677
// Encrypt
5678
M[offset + i] ^= S[i];
5679
}
5680
},
5681
5682
blockSize: 128/32,
5683
5684
ivSize: 64/32
5685
});
5686
5687
function nextState() {
5688
// Shortcuts
5689
var X = this._X;
5690
var C = this._C;
5691
5692
// Save old counter values
5693
for (var i = 0; i < 8; i++) {
5694
C_[i] = C[i];
5695
}
5696
5697
// Calculate new counter values
5698
C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
5699
C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
5700
C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
5701
C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
5702
C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
5703
C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
5704
C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
5705
C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
5706
this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
5707
5708
// Calculate the g-values
5709
for (var i = 0; i < 8; i++) {
5710
var gx = X[i] + C[i];
5711
5712
// Construct high and low argument for squaring
5713
var ga = gx & 0xffff;
5714
var gb = gx >>> 16;
5715
5716
// Calculate high and low result of squaring
5717
var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
5718
var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
5719
5720
// High XOR low
5721
G[i] = gh ^ gl;
5722
}
5723
5724
// Calculate new state values
5725
X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
5726
X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
5727
X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
5728
X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
5729
X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
5730
X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
5731
X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
5732
X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
5733
}
5734
5735
/**
5736
* Shortcut functions to the cipher's object interface.
5737
*
5738
* @example
5739
*
5740
* var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
5741
* var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
5742
*/
5743
C.Rabbit = StreamCipher._createHelper(Rabbit);
5744
}());
5745
5746
5747
/**
5748
* Counter block mode.
5749
*/
5750
CryptoJS.mode.CTR = (function () {
5751
var CTR = CryptoJS.lib.BlockCipherMode.extend();
5752
5753
var Encryptor = CTR.Encryptor = CTR.extend({
5754
processBlock: function (words, offset) {
5755
// Shortcuts
5756
var cipher = this._cipher
5757
var blockSize = cipher.blockSize;
5758
var iv = this._iv;
5759
var counter = this._counter;
5760
5761
// Generate keystream
5762
if (iv) {
5763
counter = this._counter = iv.slice(0);
5764
5765
// Remove IV for subsequent blocks
5766
this._iv = undefined;
5767
}
5768
var keystream = counter.slice(0);
5769
cipher.encryptBlock(keystream, 0);
5770
5771
// Increment counter
5772
counter[blockSize - 1] = (counter[blockSize - 1] + 1) | 0
5773
5774
// Encrypt
5775
for (var i = 0; i < blockSize; i++) {
5776
words[offset + i] ^= keystream[i];
5777
}
5778
}
5779
});
5780
5781
CTR.Decryptor = Encryptor;
5782
5783
return CTR;
5784
}());
5785
5786
5787
(function () {
5788
// Shortcuts
5789
var C = CryptoJS;
5790
var C_lib = C.lib;
5791
var StreamCipher = C_lib.StreamCipher;
5792
var C_algo = C.algo;
5793
5794
// Reusable objects
5795
var S = [];
5796
var C_ = [];
5797
var G = [];
5798
5799
/**
5800
* Rabbit stream cipher algorithm.
5801
*
5802
* This is a legacy version that neglected to convert the key to little-endian.
5803
* This error doesn't affect the cipher's security,
5804
* but it does affect its compatibility with other implementations.
5805
*/
5806
var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
5807
_doReset: function () {
5808
// Shortcuts
5809
var K = this._key.words;
5810
var iv = this.cfg.iv;
5811
5812
// Generate initial state values
5813
var X = this._X = [
5814
K[0], (K[3] << 16) | (K[2] >>> 16),
5815
K[1], (K[0] << 16) | (K[3] >>> 16),
5816
K[2], (K[1] << 16) | (K[0] >>> 16),
5817
K[3], (K[2] << 16) | (K[1] >>> 16)
5818
];
5819
5820
// Generate initial counter values
5821
var C = this._C = [
5822
(K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
5823
(K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
5824
(K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
5825
(K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
5826
];
5827
5828
// Carry bit
5829
this._b = 0;
5830
5831
// Iterate the system four times
5832
for (var i = 0; i < 4; i++) {
5833
nextState.call(this);
5834
}
5835
5836
// Modify the counters
5837
for (var i = 0; i < 8; i++) {
5838
C[i] ^= X[(i + 4) & 7];
5839
}
5840
5841
// IV setup
5842
if (iv) {
5843
// Shortcuts
5844
var IV = iv.words;
5845
var IV_0 = IV[0];
5846
var IV_1 = IV[1];
5847
5848
// Generate four subvectors
5849
var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
5850
var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
5851
var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
5852
var i3 = (i2 << 16) | (i0 & 0x0000ffff);
5853
5854
// Modify counter values
5855
C[0] ^= i0;
5856
C[1] ^= i1;
5857
C[2] ^= i2;
5858
C[3] ^= i3;
5859
C[4] ^= i0;
5860
C[5] ^= i1;
5861
C[6] ^= i2;
5862
C[7] ^= i3;
5863
5864
// Iterate the system four times
5865
for (var i = 0; i < 4; i++) {
5866
nextState.call(this);
5867
}
5868
}
5869
},
5870
5871
_doProcessBlock: function (M, offset) {
5872
// Shortcut
5873
var X = this._X;
5874
5875
// Iterate the system
5876
nextState.call(this);
5877
5878
// Generate four keystream words
5879
S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
5880
S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
5881
S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
5882
S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
5883
5884
for (var i = 0; i < 4; i++) {
5885
// Swap endian
5886
S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
5887
(((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
5888
5889
// Encrypt
5890
M[offset + i] ^= S[i];
5891
}
5892
},
5893
5894
blockSize: 128/32,
5895
5896
ivSize: 64/32
5897
});
5898
5899
function nextState() {
5900
// Shortcuts
5901
var X = this._X;
5902
var C = this._C;
5903
5904
// Save old counter values
5905
for (var i = 0; i < 8; i++) {
5906
C_[i] = C[i];
5907
}
5908
5909
// Calculate new counter values
5910
C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
5911
C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
5912
C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
5913
C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
5914
C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
5915
C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
5916
C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
5917
C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
5918
this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
5919
5920
// Calculate the g-values
5921
for (var i = 0; i < 8; i++) {
5922
var gx = X[i] + C[i];
5923
5924
// Construct high and low argument for squaring
5925
var ga = gx & 0xffff;
5926
var gb = gx >>> 16;
5927
5928
// Calculate high and low result of squaring
5929
var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
5930
var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
5931
5932
// High XOR low
5933
G[i] = gh ^ gl;
5934
}
5935
5936
// Calculate new state values
5937
X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
5938
X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
5939
X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
5940
X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
5941
X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
5942
X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
5943
X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
5944
X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
5945
}
5946
5947
/**
5948
* Shortcut functions to the cipher's object interface.
5949
*
5950
* @example
5951
*
5952
* var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
5953
* var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
5954
*/
5955
C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
5956
}());
5957
5958
5959
/**
5960
* Zero padding strategy.
5961
*/
5962
CryptoJS.pad.ZeroPadding = {
5963
pad: function (data, blockSize) {
5964
// Shortcut
5965
var blockSizeBytes = blockSize * 4;
5966
5967
// Pad
5968
data.clamp();
5969
data.sigBytes += blockSizeBytes - ((data.sigBytes % blockSizeBytes) || blockSizeBytes);
5970
},
5971
5972
unpad: function (data) {
5973
// Shortcut
5974
var dataWords = data.words;
5975
5976
// Unpad
5977
var i = data.sigBytes - 1;
5978
while (!((dataWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff)) {
5979
i--;
5980
}
5981
data.sigBytes = i + 1;
5982
}
5983
};
5984
5985
5986
return CryptoJS;
5987
5988
}));
5989