OSDN Git Service

- add crypto-js library(for new hash access method).
[feedblog/feedblog.git] / js / crypto-js / components / rc4.js
diff --git a/js/crypto-js/components/rc4.js b/js/crypto-js/components/rc4.js
new file mode 100644 (file)
index 0000000..69ccb13
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+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