| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 | /*CryptoJS v3.1.2code.google.com/p/crypto-js(c) 2009-2013 by Jeff Mott. All rights reserved.code.google.com/p/crypto-js/wiki/License*//** * Cipher Feedback block mode. */CryptoJS.mode.CFB = (function () {    var CFB = CryptoJS.lib.BlockCipherMode.extend();    CFB.Encryptor = CFB.extend({        processBlock: function (words, offset) {            // Shortcuts            var cipher = this._cipher;            var blockSize = cipher.blockSize;            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);            // Remember this block to use with next block            this._prevBlock = words.slice(offset, offset + blockSize);        }    });    CFB.Decryptor = CFB.extend({        processBlock: function (words, offset) {            // Shortcuts            var cipher = this._cipher;            var blockSize = cipher.blockSize;            // Remember this block to use with next block            var thisBlock = words.slice(offset, offset + blockSize);            generateKeystreamAndEncrypt.call(this, words, offset, blockSize, cipher);            // This block becomes the previous block            this._prevBlock = thisBlock;        }    });    function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) {        // Shortcut        var iv = this._iv;        // Generate keystream        if (iv) {            var keystream = iv.slice(0);            // Remove IV for subsequent blocks            this._iv = undefined;        } else {            var keystream = this._prevBlock;        }        cipher.encryptBlock(keystream, 0);        // Encrypt        for (var i = 0; i < blockSize; i++) {            words[offset + i] ^= keystream[i];        }    }    return CFB;}());
 |