--- /dev/null
+/*
+CryptoJS v3.1.2
+code.google.com/p/crypto-js
+(c) 2009-2013 by Jeff Mott. All rights reserved.
+code.google.com/p/crypto-js/wiki/License
+*/
+(function () {\r
+ // Shortcuts\r
+ var C = CryptoJS;\r
+ var C_lib = C.lib;\r
+ var StreamCipher = C_lib.StreamCipher;\r
+ var C_algo = C.algo;\r
+\r
+ /**\r
+ * RC4 stream cipher algorithm.\r
+ */\r
+ var RC4 = C_algo.RC4 = StreamCipher.extend({\r
+ _doReset: function () {\r
+ // Shortcuts\r
+ var key = this._key;\r
+ var keyWords = key.words;\r
+ var keySigBytes = key.sigBytes;\r
+\r
+ // Init sbox\r
+ var S = this._S = [];\r
+ for (var i = 0; i < 256; i++) {\r
+ S[i] = i;\r
+ }\r
+\r
+ // Key setup\r
+ for (var i = 0, j = 0; i < 256; i++) {\r
+ var keyByteIndex = i % keySigBytes;\r
+ var keyByte = (keyWords[keyByteIndex >>> 2] >>> (24 - (keyByteIndex % 4) * 8)) & 0xff;\r
+\r
+ j = (j + S[i] + keyByte) % 256;\r
+\r
+ // Swap\r
+ var t = S[i];\r
+ S[i] = S[j];\r
+ S[j] = t;\r
+ }\r
+\r
+ // Counters\r
+ this._i = this._j = 0;\r
+ },\r
+\r
+ _doProcessBlock: function (M, offset) {\r
+ M[offset] ^= generateKeystreamWord.call(this);\r
+ },\r
+\r
+ keySize: 256/32,\r
+\r
+ ivSize: 0\r
+ });\r
+\r
+ function generateKeystreamWord() {\r
+ // Shortcuts\r
+ var S = this._S;\r
+ var i = this._i;\r
+ var j = this._j;\r
+\r
+ // Generate keystream word\r
+ var keystreamWord = 0;\r
+ for (var n = 0; n < 4; n++) {\r
+ i = (i + 1) % 256;\r
+ j = (j + S[i]) % 256;\r
+\r
+ // Swap\r
+ var t = S[i];\r
+ S[i] = S[j];\r
+ S[j] = t;\r
+\r
+ keystreamWord |= S[(S[i] + S[j]) % 256] << (24 - n * 8);\r
+ }\r
+\r
+ // Update counters\r
+ this._i = i;\r
+ this._j = j;\r
+\r
+ return keystreamWord;\r
+ }\r
+\r
+ /**\r
+ * Shortcut functions to the cipher's object interface.\r
+ *\r
+ * @example\r
+ *\r
+ * var ciphertext = CryptoJS.RC4.encrypt(message, key, cfg);\r
+ * var plaintext = CryptoJS.RC4.decrypt(ciphertext, key, cfg);\r
+ */\r
+ C.RC4 = StreamCipher._createHelper(RC4);\r
+\r
+ /**\r
+ * Modified RC4 stream cipher algorithm.\r
+ */\r
+ var RC4Drop = C_algo.RC4Drop = RC4.extend({\r
+ /**\r
+ * Configuration options.\r
+ *\r
+ * @property {number} drop The number of keystream words to drop. Default 192\r
+ */\r
+ cfg: RC4.cfg.extend({\r
+ drop: 192\r
+ }),\r
+\r
+ _doReset: function () {\r
+ RC4._doReset.call(this);\r
+\r
+ // Drop\r
+ for (var i = this.cfg.drop; i > 0; i--) {\r
+ generateKeystreamWord.call(this);\r
+ }\r
+ }\r
+ });\r
+\r
+ /**\r
+ * Shortcut functions to the cipher's object interface.\r
+ *\r
+ * @example\r
+ *\r
+ * var ciphertext = CryptoJS.RC4Drop.encrypt(message, key, cfg);\r
+ * var plaintext = CryptoJS.RC4Drop.decrypt(ciphertext, key, cfg);\r
+ */\r
+ C.RC4Drop = StreamCipher._createHelper(RC4Drop);\r
+}());\r