/base/000_base/bower_components/cryptojslib/components/mode-cfb.js |
@@ -0,0 +1,64 @@ |
/* |
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 |
*/ |
/** |
* 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; |
}()); |