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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


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

Files changed (124) hide show
  1. package/.jshintrc +33 -0
  2. package/.travis.yml +15 -0
  3. package/CONTRIBUTING.md +28 -0
  4. package/LICENSE +24 -0
  5. package/README.md +273 -3
  6. package/aes.js +234 -0
  7. package/blowfish.js +471 -0
  8. package/bower.json +39 -0
  9. package/cipher-core.js +895 -0
  10. package/core.js +819 -0
  11. package/crypto-js.js +6657 -0
  12. package/docs/QuickStartGuide.wiki +470 -0
  13. package/enc-base64.js +140 -0
  14. package/enc-base64url.js +148 -0
  15. package/enc-hex.js +18 -0
  16. package/enc-latin1.js +18 -0
  17. package/enc-utf16.js +149 -0
  18. package/enc-utf8.js +18 -0
  19. package/evpkdf.js +134 -0
  20. package/format-hex.js +66 -0
  21. package/format-openssl.js +18 -0
  22. package/hmac-md5.js +18 -0
  23. package/hmac-ripemd160.js +18 -0
  24. package/hmac-sha1.js +18 -0
  25. package/hmac-sha224.js +18 -0
  26. package/hmac-sha256.js +18 -0
  27. package/hmac-sha3.js +18 -0
  28. package/hmac-sha384.js +18 -0
  29. package/hmac-sha512.js +18 -0
  30. package/hmac.js +143 -0
  31. package/index.js +18 -0
  32. package/lib-typedarrays.js +76 -0
  33. package/md5.js +268 -0
  34. package/mode-cfb.js +80 -0
  35. package/mode-ctr-gladman.js +116 -0
  36. package/mode-ctr.js +58 -0
  37. package/mode-ecb.js +40 -0
  38. package/mode-ofb.js +54 -0
  39. package/package.json +45 -3
  40. package/pad-ansix923.js +49 -0
  41. package/pad-iso10126.js +44 -0
  42. package/pad-iso97971.js +40 -0
  43. package/pad-nopadding.js +30 -0
  44. package/pad-pkcs7.js +18 -0
  45. package/pad-zeropadding.js +47 -0
  46. package/pbkdf2.js +145 -0
  47. package/rabbit-legacy.js +190 -0
  48. package/rabbit.js +192 -0
  49. package/rc4.js +139 -0
  50. package/ripemd160.js +267 -0
  51. package/sha1.js +150 -0
  52. package/sha224.js +80 -0
  53. package/sha256.js +199 -0
  54. package/sha3.js +326 -0
  55. package/sha384.js +83 -0
  56. package/sha512.js +326 -0
  57. package/test/aes-profile.js +31 -0
  58. package/test/aes-test.js +80 -0
  59. package/test/blowfish-test.js +33 -0
  60. package/test/cipher-test.js +522 -0
  61. package/test/config-test.js +51 -0
  62. package/test/des-profile.js +31 -0
  63. package/test/des-test.js +104 -0
  64. package/test/enc-base64-test.js +71 -0
  65. package/test/enc-hex-test.js +15 -0
  66. package/test/enc-latin1-test.js +15 -0
  67. package/test/enc-utf16-test.js +55 -0
  68. package/test/enc-utf8-test.js +39 -0
  69. package/test/evpkdf-profile.js +11 -0
  70. package/test/evpkdf-test.js +32 -0
  71. package/test/format-openssl-test.js +37 -0
  72. package/test/hmac-md5-profile.js +30 -0
  73. package/test/hmac-md5-test.js +59 -0
  74. package/test/hmac-sha224-test.js +59 -0
  75. package/test/hmac-sha256-test.js +59 -0
  76. package/test/hmac-sha384-test.js +59 -0
  77. package/test/hmac-sha512-test.js +59 -0
  78. package/test/kdf-openssl-test.js +15 -0
  79. package/test/lib-base-test.js +92 -0
  80. package/test/lib-cipherparams-test.js +59 -0
  81. package/test/lib-passwordbasedcipher-test.js +25 -0
  82. package/test/lib-serializablecipher-test.js +51 -0
  83. package/test/lib-typedarrays-test.js +57 -0
  84. package/test/lib-wordarray-test.js +85 -0
  85. package/test/md5-profile.js +24 -0
  86. package/test/md5-test.js +70 -0
  87. package/test/mode-cbc-test.js +49 -0
  88. package/test/mode-cfb-test.js +51 -0
  89. package/test/mode-ctr-test.js +55 -0
  90. package/test/mode-ecb-test.js +38 -0
  91. package/test/mode-ofb-test.js +50 -0
  92. package/test/pad-ansix923-test.js +28 -0
  93. package/test/pad-iso10126-test.js +50 -0
  94. package/test/pad-iso97971-test.js +35 -0
  95. package/test/pad-pkcs7-test.js +28 -0
  96. package/test/pad-zeropadding-test.js +28 -0
  97. package/test/pbkdf2-profile.js +11 -0
  98. package/test/pbkdf2-test.js +80 -0
  99. package/test/profile.html +281 -0
  100. package/test/rabbit-legacy-test.js +80 -0
  101. package/test/rabbit-profile.js +30 -0
  102. package/test/rabbit-test.js +84 -0
  103. package/test/rc4-profile.js +30 -0
  104. package/test/rc4-test.js +68 -0
  105. package/test/ripemd160-test.js +19 -0
  106. package/test/sha1-profile.js +24 -0
  107. package/test/sha1-test.js +70 -0
  108. package/test/sha224-test.js +19 -0
  109. package/test/sha256-profile.js +24 -0
  110. package/test/sha256-test.js +70 -0
  111. package/test/sha3-profile.js +24 -0
  112. package/test/sha3-test.js +69 -0
  113. package/test/sha384-test.js +54 -0
  114. package/test/sha512-profile.js +24 -0
  115. package/test/sha512-test.js +54 -0
  116. package/test/test-build.html +105 -0
  117. package/test/test.html +138 -0
  118. package/test/test1.html +63 -0
  119. package/test/tripledes-profile.js +31 -0
  120. package/test/tripledes-test.js +121 -0
  121. package/test/x64-word-test.js +99 -0
  122. package/test/x64-wordarray-test.js +38 -0
  123. package/tripledes.js +779 -0
  124. package/x64-core.js +304 -0
@@ -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
+ }));