@brix-crypto/crypto-js 0.0.1-security → 4.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @brix-crypto/crypto-js might be problematic. Click here for more details.
- package/.jshintrc +33 -0
- package/.travis.yml +15 -0
- package/CONTRIBUTING.md +28 -0
- package/LICENSE +24 -0
- package/README.md +273 -3
- package/aes.js +234 -0
- package/blowfish.js +471 -0
- package/bower.json +39 -0
- package/cipher-core.js +895 -0
- package/core.js +813 -0
- package/crypto-js.js +6657 -0
- package/docs/QuickStartGuide.wiki +470 -0
- package/enc-base64.js +136 -0
- package/enc-base64url.js +148 -0
- package/enc-hex.js +18 -0
- package/enc-latin1.js +18 -0
- package/enc-utf16.js +149 -0
- package/enc-utf8.js +18 -0
- package/evpkdf.js +134 -0
- package/format-hex.js +66 -0
- package/format-openssl.js +18 -0
- package/hmac-md5.js +18 -0
- package/hmac-ripemd160.js +18 -0
- package/hmac-sha1.js +18 -0
- package/hmac-sha224.js +18 -0
- package/hmac-sha256.js +18 -0
- package/hmac-sha3.js +18 -0
- package/hmac-sha384.js +18 -0
- package/hmac-sha512.js +18 -0
- package/hmac.js +143 -0
- package/index.js +18 -0
- package/lib-typedarrays.js +76 -0
- package/md5.js +268 -0
- package/mode-cfb.js +80 -0
- package/mode-ctr-gladman.js +116 -0
- package/mode-ctr.js +58 -0
- package/mode-ecb.js +40 -0
- package/mode-ofb.js +54 -0
- package/package.json +45 -3
- package/pad-ansix923.js +49 -0
- package/pad-iso10126.js +44 -0
- package/pad-iso97971.js +40 -0
- package/pad-nopadding.js +30 -0
- package/pad-pkcs7.js +18 -0
- package/pad-zeropadding.js +47 -0
- package/pbkdf2.js +145 -0
- package/rabbit-legacy.js +190 -0
- package/rabbit.js +192 -0
- package/rc4.js +139 -0
- package/ripemd160.js +267 -0
- package/sha1.js +150 -0
- package/sha224.js +80 -0
- package/sha256.js +199 -0
- package/sha3.js +326 -0
- package/sha384.js +83 -0
- package/sha512.js +326 -0
- package/test/aes-profile.js +31 -0
- package/test/aes-test.js +80 -0
- package/test/blowfish-test.js +33 -0
- package/test/cipher-test.js +522 -0
- package/test/config-test.js +51 -0
- package/test/des-profile.js +31 -0
- package/test/des-test.js +104 -0
- package/test/enc-base64-test.js +71 -0
- package/test/enc-hex-test.js +15 -0
- package/test/enc-latin1-test.js +15 -0
- package/test/enc-utf16-test.js +55 -0
- package/test/enc-utf8-test.js +39 -0
- package/test/evpkdf-profile.js +11 -0
- package/test/evpkdf-test.js +32 -0
- package/test/format-openssl-test.js +37 -0
- package/test/hmac-md5-profile.js +30 -0
- package/test/hmac-md5-test.js +59 -0
- package/test/hmac-sha224-test.js +59 -0
- package/test/hmac-sha256-test.js +59 -0
- package/test/hmac-sha384-test.js +59 -0
- package/test/hmac-sha512-test.js +59 -0
- package/test/kdf-openssl-test.js +15 -0
- package/test/lib-base-test.js +92 -0
- package/test/lib-cipherparams-test.js +59 -0
- package/test/lib-passwordbasedcipher-test.js +25 -0
- package/test/lib-serializablecipher-test.js +51 -0
- package/test/lib-typedarrays-test.js +57 -0
- package/test/lib-wordarray-test.js +85 -0
- package/test/md5-profile.js +24 -0
- package/test/md5-test.js +70 -0
- package/test/mode-cbc-test.js +49 -0
- package/test/mode-cfb-test.js +51 -0
- package/test/mode-ctr-test.js +55 -0
- package/test/mode-ecb-test.js +38 -0
- package/test/mode-ofb-test.js +50 -0
- package/test/pad-ansix923-test.js +28 -0
- package/test/pad-iso10126-test.js +50 -0
- package/test/pad-iso97971-test.js +35 -0
- package/test/pad-pkcs7-test.js +28 -0
- package/test/pad-zeropadding-test.js +28 -0
- package/test/pbkdf2-profile.js +11 -0
- package/test/pbkdf2-test.js +80 -0
- package/test/profile.html +281 -0
- package/test/rabbit-legacy-test.js +80 -0
- package/test/rabbit-profile.js +30 -0
- package/test/rabbit-test.js +84 -0
- package/test/rc4-profile.js +30 -0
- package/test/rc4-test.js +68 -0
- package/test/ripemd160-test.js +19 -0
- package/test/sha1-profile.js +24 -0
- package/test/sha1-test.js +70 -0
- package/test/sha224-test.js +19 -0
- package/test/sha256-profile.js +24 -0
- package/test/sha256-test.js +70 -0
- package/test/sha3-profile.js +24 -0
- package/test/sha3-test.js +69 -0
- package/test/sha384-test.js +54 -0
- package/test/sha512-profile.js +24 -0
- package/test/sha512-test.js +54 -0
- package/test/test-build.html +105 -0
- package/test/test.html +138 -0
- package/test/test1.html +63 -0
- package/test/tripledes-profile.js +31 -0
- package/test/tripledes-test.js +121 -0
- package/test/x64-word-test.js +99 -0
- package/test/x64-wordarray-test.js +38 -0
- package/tripledes.js +779 -0
- package/x64-core.js +304 -0
package/rabbit-legacy.js
ADDED
@@ -0,0 +1,190 @@
|
|
1
|
+
;(function (root, factory, undef) {
|
2
|
+
if (typeof exports === "object") {
|
3
|
+
// CommonJS
|
4
|
+
module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
|
5
|
+
}
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
7
|
+
// AMD
|
8
|
+
define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
|
9
|
+
}
|
10
|
+
else {
|
11
|
+
// Global (browser)
|
12
|
+
factory(root.CryptoJS);
|
13
|
+
}
|
14
|
+
}(this, function (CryptoJS) {
|
15
|
+
|
16
|
+
(function () {
|
17
|
+
// Shortcuts
|
18
|
+
var C = CryptoJS;
|
19
|
+
var C_lib = C.lib;
|
20
|
+
var StreamCipher = C_lib.StreamCipher;
|
21
|
+
var C_algo = C.algo;
|
22
|
+
|
23
|
+
// Reusable objects
|
24
|
+
var S = [];
|
25
|
+
var C_ = [];
|
26
|
+
var G = [];
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Rabbit stream cipher algorithm.
|
30
|
+
*
|
31
|
+
* This is a legacy version that neglected to convert the key to little-endian.
|
32
|
+
* This error doesn't affect the cipher's security,
|
33
|
+
* but it does affect its compatibility with other implementations.
|
34
|
+
*/
|
35
|
+
var RabbitLegacy = C_algo.RabbitLegacy = StreamCipher.extend({
|
36
|
+
_doReset: function () {
|
37
|
+
// Shortcuts
|
38
|
+
var K = this._key.words;
|
39
|
+
var iv = this.cfg.iv;
|
40
|
+
|
41
|
+
// Generate initial state values
|
42
|
+
var X = this._X = [
|
43
|
+
K[0], (K[3] << 16) | (K[2] >>> 16),
|
44
|
+
K[1], (K[0] << 16) | (K[3] >>> 16),
|
45
|
+
K[2], (K[1] << 16) | (K[0] >>> 16),
|
46
|
+
K[3], (K[2] << 16) | (K[1] >>> 16)
|
47
|
+
];
|
48
|
+
|
49
|
+
// Generate initial counter values
|
50
|
+
var C = this._C = [
|
51
|
+
(K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
|
52
|
+
(K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
|
53
|
+
(K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
|
54
|
+
(K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
|
55
|
+
];
|
56
|
+
|
57
|
+
// Carry bit
|
58
|
+
this._b = 0;
|
59
|
+
|
60
|
+
// Iterate the system four times
|
61
|
+
for (var i = 0; i < 4; i++) {
|
62
|
+
nextState.call(this);
|
63
|
+
}
|
64
|
+
|
65
|
+
// Modify the counters
|
66
|
+
for (var i = 0; i < 8; i++) {
|
67
|
+
C[i] ^= X[(i + 4) & 7];
|
68
|
+
}
|
69
|
+
|
70
|
+
// IV setup
|
71
|
+
if (iv) {
|
72
|
+
// Shortcuts
|
73
|
+
var IV = iv.words;
|
74
|
+
var IV_0 = IV[0];
|
75
|
+
var IV_1 = IV[1];
|
76
|
+
|
77
|
+
// Generate four subvectors
|
78
|
+
var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
|
79
|
+
var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
|
80
|
+
var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
|
81
|
+
var i3 = (i2 << 16) | (i0 & 0x0000ffff);
|
82
|
+
|
83
|
+
// Modify counter values
|
84
|
+
C[0] ^= i0;
|
85
|
+
C[1] ^= i1;
|
86
|
+
C[2] ^= i2;
|
87
|
+
C[3] ^= i3;
|
88
|
+
C[4] ^= i0;
|
89
|
+
C[5] ^= i1;
|
90
|
+
C[6] ^= i2;
|
91
|
+
C[7] ^= i3;
|
92
|
+
|
93
|
+
// Iterate the system four times
|
94
|
+
for (var i = 0; i < 4; i++) {
|
95
|
+
nextState.call(this);
|
96
|
+
}
|
97
|
+
}
|
98
|
+
},
|
99
|
+
|
100
|
+
_doProcessBlock: function (M, offset) {
|
101
|
+
// Shortcut
|
102
|
+
var X = this._X;
|
103
|
+
|
104
|
+
// Iterate the system
|
105
|
+
nextState.call(this);
|
106
|
+
|
107
|
+
// Generate four keystream words
|
108
|
+
S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
|
109
|
+
S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
|
110
|
+
S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
|
111
|
+
S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
|
112
|
+
|
113
|
+
for (var i = 0; i < 4; i++) {
|
114
|
+
// Swap endian
|
115
|
+
S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
|
116
|
+
(((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
|
117
|
+
|
118
|
+
// Encrypt
|
119
|
+
M[offset + i] ^= S[i];
|
120
|
+
}
|
121
|
+
},
|
122
|
+
|
123
|
+
blockSize: 128/32,
|
124
|
+
|
125
|
+
ivSize: 64/32
|
126
|
+
});
|
127
|
+
|
128
|
+
function nextState() {
|
129
|
+
// Shortcuts
|
130
|
+
var X = this._X;
|
131
|
+
var C = this._C;
|
132
|
+
|
133
|
+
// Save old counter values
|
134
|
+
for (var i = 0; i < 8; i++) {
|
135
|
+
C_[i] = C[i];
|
136
|
+
}
|
137
|
+
|
138
|
+
// Calculate new counter values
|
139
|
+
C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
|
140
|
+
C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
|
141
|
+
C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
|
142
|
+
C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
|
143
|
+
C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
|
144
|
+
C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
|
145
|
+
C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
|
146
|
+
C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
|
147
|
+
this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
|
148
|
+
|
149
|
+
// Calculate the g-values
|
150
|
+
for (var i = 0; i < 8; i++) {
|
151
|
+
var gx = X[i] + C[i];
|
152
|
+
|
153
|
+
// Construct high and low argument for squaring
|
154
|
+
var ga = gx & 0xffff;
|
155
|
+
var gb = gx >>> 16;
|
156
|
+
|
157
|
+
// Calculate high and low result of squaring
|
158
|
+
var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
|
159
|
+
var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
|
160
|
+
|
161
|
+
// High XOR low
|
162
|
+
G[i] = gh ^ gl;
|
163
|
+
}
|
164
|
+
|
165
|
+
// Calculate new state values
|
166
|
+
X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
|
167
|
+
X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
|
168
|
+
X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
|
169
|
+
X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
|
170
|
+
X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
|
171
|
+
X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
|
172
|
+
X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
|
173
|
+
X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
|
174
|
+
}
|
175
|
+
|
176
|
+
/**
|
177
|
+
* Shortcut functions to the cipher's object interface.
|
178
|
+
*
|
179
|
+
* @example
|
180
|
+
*
|
181
|
+
* var ciphertext = CryptoJS.RabbitLegacy.encrypt(message, key, cfg);
|
182
|
+
* var plaintext = CryptoJS.RabbitLegacy.decrypt(ciphertext, key, cfg);
|
183
|
+
*/
|
184
|
+
C.RabbitLegacy = StreamCipher._createHelper(RabbitLegacy);
|
185
|
+
}());
|
186
|
+
|
187
|
+
|
188
|
+
return CryptoJS.RabbitLegacy;
|
189
|
+
|
190
|
+
}));
|
package/rabbit.js
ADDED
@@ -0,0 +1,192 @@
|
|
1
|
+
;(function (root, factory, undef) {
|
2
|
+
if (typeof exports === "object") {
|
3
|
+
// CommonJS
|
4
|
+
module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
|
5
|
+
}
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
7
|
+
// AMD
|
8
|
+
define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
|
9
|
+
}
|
10
|
+
else {
|
11
|
+
// Global (browser)
|
12
|
+
factory(root.CryptoJS);
|
13
|
+
}
|
14
|
+
}(this, function (CryptoJS) {
|
15
|
+
|
16
|
+
(function () {
|
17
|
+
// Shortcuts
|
18
|
+
var C = CryptoJS;
|
19
|
+
var C_lib = C.lib;
|
20
|
+
var StreamCipher = C_lib.StreamCipher;
|
21
|
+
var C_algo = C.algo;
|
22
|
+
|
23
|
+
// Reusable objects
|
24
|
+
var S = [];
|
25
|
+
var C_ = [];
|
26
|
+
var G = [];
|
27
|
+
|
28
|
+
/**
|
29
|
+
* Rabbit stream cipher algorithm
|
30
|
+
*/
|
31
|
+
var Rabbit = C_algo.Rabbit = StreamCipher.extend({
|
32
|
+
_doReset: function () {
|
33
|
+
// Shortcuts
|
34
|
+
var K = this._key.words;
|
35
|
+
var iv = this.cfg.iv;
|
36
|
+
|
37
|
+
// Swap endian
|
38
|
+
for (var i = 0; i < 4; i++) {
|
39
|
+
K[i] = (((K[i] << 8) | (K[i] >>> 24)) & 0x00ff00ff) |
|
40
|
+
(((K[i] << 24) | (K[i] >>> 8)) & 0xff00ff00);
|
41
|
+
}
|
42
|
+
|
43
|
+
// Generate initial state values
|
44
|
+
var X = this._X = [
|
45
|
+
K[0], (K[3] << 16) | (K[2] >>> 16),
|
46
|
+
K[1], (K[0] << 16) | (K[3] >>> 16),
|
47
|
+
K[2], (K[1] << 16) | (K[0] >>> 16),
|
48
|
+
K[3], (K[2] << 16) | (K[1] >>> 16)
|
49
|
+
];
|
50
|
+
|
51
|
+
// Generate initial counter values
|
52
|
+
var C = this._C = [
|
53
|
+
(K[2] << 16) | (K[2] >>> 16), (K[0] & 0xffff0000) | (K[1] & 0x0000ffff),
|
54
|
+
(K[3] << 16) | (K[3] >>> 16), (K[1] & 0xffff0000) | (K[2] & 0x0000ffff),
|
55
|
+
(K[0] << 16) | (K[0] >>> 16), (K[2] & 0xffff0000) | (K[3] & 0x0000ffff),
|
56
|
+
(K[1] << 16) | (K[1] >>> 16), (K[3] & 0xffff0000) | (K[0] & 0x0000ffff)
|
57
|
+
];
|
58
|
+
|
59
|
+
// Carry bit
|
60
|
+
this._b = 0;
|
61
|
+
|
62
|
+
// Iterate the system four times
|
63
|
+
for (var i = 0; i < 4; i++) {
|
64
|
+
nextState.call(this);
|
65
|
+
}
|
66
|
+
|
67
|
+
// Modify the counters
|
68
|
+
for (var i = 0; i < 8; i++) {
|
69
|
+
C[i] ^= X[(i + 4) & 7];
|
70
|
+
}
|
71
|
+
|
72
|
+
// IV setup
|
73
|
+
if (iv) {
|
74
|
+
// Shortcuts
|
75
|
+
var IV = iv.words;
|
76
|
+
var IV_0 = IV[0];
|
77
|
+
var IV_1 = IV[1];
|
78
|
+
|
79
|
+
// Generate four subvectors
|
80
|
+
var i0 = (((IV_0 << 8) | (IV_0 >>> 24)) & 0x00ff00ff) | (((IV_0 << 24) | (IV_0 >>> 8)) & 0xff00ff00);
|
81
|
+
var i2 = (((IV_1 << 8) | (IV_1 >>> 24)) & 0x00ff00ff) | (((IV_1 << 24) | (IV_1 >>> 8)) & 0xff00ff00);
|
82
|
+
var i1 = (i0 >>> 16) | (i2 & 0xffff0000);
|
83
|
+
var i3 = (i2 << 16) | (i0 & 0x0000ffff);
|
84
|
+
|
85
|
+
// Modify counter values
|
86
|
+
C[0] ^= i0;
|
87
|
+
C[1] ^= i1;
|
88
|
+
C[2] ^= i2;
|
89
|
+
C[3] ^= i3;
|
90
|
+
C[4] ^= i0;
|
91
|
+
C[5] ^= i1;
|
92
|
+
C[6] ^= i2;
|
93
|
+
C[7] ^= i3;
|
94
|
+
|
95
|
+
// Iterate the system four times
|
96
|
+
for (var i = 0; i < 4; i++) {
|
97
|
+
nextState.call(this);
|
98
|
+
}
|
99
|
+
}
|
100
|
+
},
|
101
|
+
|
102
|
+
_doProcessBlock: function (M, offset) {
|
103
|
+
// Shortcut
|
104
|
+
var X = this._X;
|
105
|
+
|
106
|
+
// Iterate the system
|
107
|
+
nextState.call(this);
|
108
|
+
|
109
|
+
// Generate four keystream words
|
110
|
+
S[0] = X[0] ^ (X[5] >>> 16) ^ (X[3] << 16);
|
111
|
+
S[1] = X[2] ^ (X[7] >>> 16) ^ (X[5] << 16);
|
112
|
+
S[2] = X[4] ^ (X[1] >>> 16) ^ (X[7] << 16);
|
113
|
+
S[3] = X[6] ^ (X[3] >>> 16) ^ (X[1] << 16);
|
114
|
+
|
115
|
+
for (var i = 0; i < 4; i++) {
|
116
|
+
// Swap endian
|
117
|
+
S[i] = (((S[i] << 8) | (S[i] >>> 24)) & 0x00ff00ff) |
|
118
|
+
(((S[i] << 24) | (S[i] >>> 8)) & 0xff00ff00);
|
119
|
+
|
120
|
+
// Encrypt
|
121
|
+
M[offset + i] ^= S[i];
|
122
|
+
}
|
123
|
+
},
|
124
|
+
|
125
|
+
blockSize: 128/32,
|
126
|
+
|
127
|
+
ivSize: 64/32
|
128
|
+
});
|
129
|
+
|
130
|
+
function nextState() {
|
131
|
+
// Shortcuts
|
132
|
+
var X = this._X;
|
133
|
+
var C = this._C;
|
134
|
+
|
135
|
+
// Save old counter values
|
136
|
+
for (var i = 0; i < 8; i++) {
|
137
|
+
C_[i] = C[i];
|
138
|
+
}
|
139
|
+
|
140
|
+
// Calculate new counter values
|
141
|
+
C[0] = (C[0] + 0x4d34d34d + this._b) | 0;
|
142
|
+
C[1] = (C[1] + 0xd34d34d3 + ((C[0] >>> 0) < (C_[0] >>> 0) ? 1 : 0)) | 0;
|
143
|
+
C[2] = (C[2] + 0x34d34d34 + ((C[1] >>> 0) < (C_[1] >>> 0) ? 1 : 0)) | 0;
|
144
|
+
C[3] = (C[3] + 0x4d34d34d + ((C[2] >>> 0) < (C_[2] >>> 0) ? 1 : 0)) | 0;
|
145
|
+
C[4] = (C[4] + 0xd34d34d3 + ((C[3] >>> 0) < (C_[3] >>> 0) ? 1 : 0)) | 0;
|
146
|
+
C[5] = (C[5] + 0x34d34d34 + ((C[4] >>> 0) < (C_[4] >>> 0) ? 1 : 0)) | 0;
|
147
|
+
C[6] = (C[6] + 0x4d34d34d + ((C[5] >>> 0) < (C_[5] >>> 0) ? 1 : 0)) | 0;
|
148
|
+
C[7] = (C[7] + 0xd34d34d3 + ((C[6] >>> 0) < (C_[6] >>> 0) ? 1 : 0)) | 0;
|
149
|
+
this._b = (C[7] >>> 0) < (C_[7] >>> 0) ? 1 : 0;
|
150
|
+
|
151
|
+
// Calculate the g-values
|
152
|
+
for (var i = 0; i < 8; i++) {
|
153
|
+
var gx = X[i] + C[i];
|
154
|
+
|
155
|
+
// Construct high and low argument for squaring
|
156
|
+
var ga = gx & 0xffff;
|
157
|
+
var gb = gx >>> 16;
|
158
|
+
|
159
|
+
// Calculate high and low result of squaring
|
160
|
+
var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb;
|
161
|
+
var gl = (((gx & 0xffff0000) * gx) | 0) + (((gx & 0x0000ffff) * gx) | 0);
|
162
|
+
|
163
|
+
// High XOR low
|
164
|
+
G[i] = gh ^ gl;
|
165
|
+
}
|
166
|
+
|
167
|
+
// Calculate new state values
|
168
|
+
X[0] = (G[0] + ((G[7] << 16) | (G[7] >>> 16)) + ((G[6] << 16) | (G[6] >>> 16))) | 0;
|
169
|
+
X[1] = (G[1] + ((G[0] << 8) | (G[0] >>> 24)) + G[7]) | 0;
|
170
|
+
X[2] = (G[2] + ((G[1] << 16) | (G[1] >>> 16)) + ((G[0] << 16) | (G[0] >>> 16))) | 0;
|
171
|
+
X[3] = (G[3] + ((G[2] << 8) | (G[2] >>> 24)) + G[1]) | 0;
|
172
|
+
X[4] = (G[4] + ((G[3] << 16) | (G[3] >>> 16)) + ((G[2] << 16) | (G[2] >>> 16))) | 0;
|
173
|
+
X[5] = (G[5] + ((G[4] << 8) | (G[4] >>> 24)) + G[3]) | 0;
|
174
|
+
X[6] = (G[6] + ((G[5] << 16) | (G[5] >>> 16)) + ((G[4] << 16) | (G[4] >>> 16))) | 0;
|
175
|
+
X[7] = (G[7] + ((G[6] << 8) | (G[6] >>> 24)) + G[5]) | 0;
|
176
|
+
}
|
177
|
+
|
178
|
+
/**
|
179
|
+
* Shortcut functions to the cipher's object interface.
|
180
|
+
*
|
181
|
+
* @example
|
182
|
+
*
|
183
|
+
* var ciphertext = CryptoJS.Rabbit.encrypt(message, key, cfg);
|
184
|
+
* var plaintext = CryptoJS.Rabbit.decrypt(ciphertext, key, cfg);
|
185
|
+
*/
|
186
|
+
C.Rabbit = StreamCipher._createHelper(Rabbit);
|
187
|
+
}());
|
188
|
+
|
189
|
+
|
190
|
+
return CryptoJS.Rabbit;
|
191
|
+
|
192
|
+
}));
|
package/rc4.js
ADDED
@@ -0,0 +1,139 @@
|
|
1
|
+
;(function (root, factory, undef) {
|
2
|
+
if (typeof exports === "object") {
|
3
|
+
// CommonJS
|
4
|
+
module.exports = exports = factory(require("./core"), require("./enc-base64"), require("./md5"), require("./evpkdf"), require("./cipher-core"));
|
5
|
+
}
|
6
|
+
else if (typeof define === "function" && define.amd) {
|
7
|
+
// AMD
|
8
|
+
define(["./core", "./enc-base64", "./md5", "./evpkdf", "./cipher-core"], factory);
|
9
|
+
}
|
10
|
+
else {
|
11
|
+
// Global (browser)
|
12
|
+
factory(root.CryptoJS);
|
13
|
+
}
|
14
|
+
}(this, function (CryptoJS) {
|
15
|
+
|
16
|
+
(function () {
|
17
|
+
// Shortcuts
|
18
|
+
var C = CryptoJS;
|
19
|
+
var C_lib = C.lib;
|
20
|
+
var StreamCipher = C_lib.StreamCipher;
|
21
|
+
var C_algo = C.algo;
|
22
|
+
|
23
|
+
/**
|
24
|
+
* RC4 stream cipher algorithm.
|
25
|
+
*/
|
26
|
+
var RC4 = C_algo.RC4 = StreamCipher.extend({
|
27
|
+
_doReset: function () {
|
28
|
+
// Shortcuts
|
29
|
+
var key = this._key;
|
30
|
+
var keyWords = key.words;
|
31
|
+
var keySigBytes = key.sigBytes;
|
32
|
+
|
33
|
+
// Init sbox
|
34
|
+
var S = this._S = [];
|
35
|
+
for (var i = 0; i < 256; i++) {
|
36
|
+
S[i] = i;
|
37
|
+
}
|
38
|
+
|
39
|
+
// Key setup
|
40
|
+
for (var i = 0, j = 0; i < 256; i++) {
|
41
|
+
var keyByteIndex = i % keySigBytes;
|
42
|
+
var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;
|
43
|
+
|
44
|
+
j = (j + S[i] + keyByte) % 256;
|
45
|
+
|
46
|
+
// Swap
|
47
|
+
var t = S[i];
|
48
|
+
S[i] = S[j];
|
49
|
+
S[j] = t;
|
50
|
+
}
|
51
|
+
|
52
|
+
// Counters
|
53
|
+
this._i = this._j = 0;
|
54
|
+
},
|
55
|
+
|
56
|
+
_doProcessBlock: function (M, offset) {
|
57
|
+
M[offset] ^= generateKeystreamWord.call(this);
|
58
|
+
},
|
59
|
+
|
60
|
+
keySize: 256/32,
|
61
|
+
|
62
|
+
ivSize: 0
|
63
|
+
});
|
64
|
+
|
65
|
+
function generateKeystreamWord() {
|
66
|
+
// Shortcuts
|
67
|
+
var S = this._S;
|
68
|
+
var i = this._i;
|
69
|
+
var j = this._j;
|
70
|
+
|
71
|
+
// Generate keystream word
|
72
|
+
var keystreamWord = 0;
|
73
|
+
for (var n = 0; n < 4; n++) {
|
74
|
+
i = (i + 1) % 256;
|
75
|
+
j = (j + S[i]) % 256;
|
76
|
+
|
77
|
+
// Swap
|
78
|
+
var t = S[i];
|
79
|
+
S[i] = S[j];
|
80
|
+
S[j] = t;
|
81
|
+
|
82
|
+
keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);
|
83
|
+
}
|
84
|
+
|
85
|
+
// Update counters
|
86
|
+
this._i = i;
|
87
|
+
this._j = j;
|
88
|
+
|
89
|
+
return keystreamWord;
|
90
|
+
}
|
91
|
+
|
92
|
+
/**
|
93
|
+
* Shortcut functions to the cipher's object interface.
|
94
|
+
*
|
95
|
+
* @example
|
96
|
+
*
|
97
|
+
* var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);
|
98
|
+
* var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);
|
99
|
+
*/
|
100
|
+
C.RC4 = StreamCipher._createHelper(RC4);
|
101
|
+
|
102
|
+
/**
|
103
|
+
* Modified RC4 stream cipher algorithm.
|
104
|
+
*/
|
105
|
+
var RC4Drop = C_algo.RC4Drop = RC4.extend({
|
106
|
+
/**
|
107
|
+
* Configuration options.
|
108
|
+
*
|
109
|
+
* @property {number} drop The number of keystream words to drop. Default 192
|
110
|
+
*/
|
111
|
+
cfg: RC4.cfg.extend({
|
112
|
+
drop: 192
|
113
|
+
}),
|
114
|
+
|
115
|
+
_doReset: function () {
|
116
|
+
RC4._doReset.call(this);
|
117
|
+
|
118
|
+
// Drop
|
119
|
+
for (var i = this.cfg.drop; i > 0; i--) {
|
120
|
+
generateKeystreamWord.call(this);
|
121
|
+
}
|
122
|
+
}
|
123
|
+
});
|
124
|
+
|
125
|
+
/**
|
126
|
+
* Shortcut functions to the cipher's object interface.
|
127
|
+
*
|
128
|
+
* @example
|
129
|
+
*
|
130
|
+
* var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);
|
131
|
+
* var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);
|
132
|
+
*/
|
133
|
+
C.RC4Drop = StreamCipher._createHelper(RC4Drop);
|
134
|
+
}());
|
135
|
+
|
136
|
+
|
137
|
+
return CryptoJS.RC4;
|
138
|
+
|
139
|
+
}));
|