diff --git a/src/core.js b/src/core.js index 8ba28ed..b7d8b4a 100644 --- a/src/core.js +++ b/src/core.js @@ -274,6 +274,11 @@ var CryptoJS = CryptoJS || (function (Math, undefined) { // Clamp excess bits this.clamp(); + // Set array length first to fix array length allocation issue + if (thisWords.length < Math.ceil((thisSigBytes + thatSigBytes) / 4)) { + thisWords.length = Math.ceil((thisSigBytes + thatSigBytes) / 4); + } + // Concat if (thisSigBytes % 4) { // Copy one byte at a time @@ -406,7 +411,7 @@ var CryptoJS = CryptoJS || (function (Math, undefined) { var hexStrLength = hexStr.length; // Convert - var words = []; + var words = new Array((hexStrLength + 7) >>> 3); for (var i = 0; i < hexStrLength; i += 2) { words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); } @@ -465,7 +470,7 @@ var CryptoJS = CryptoJS || (function (Math, undefined) { var latin1StrLength = latin1Str.length; // Convert - var words = []; + var words = new Array((latin1StrLength + 3) >>> 2); for (var i = 0; i < latin1StrLength; i++) { words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); } @@ -602,6 +607,10 @@ var CryptoJS = CryptoJS || (function (Math, undefined) { // Process blocks if (nWordsReady) { + if (dataWords.length < nWordsReady) { + data.words = dataWords.concat(new Array(nWordsReady - dataWords.length)); + dataWords = data.words; + } for (var offset = 0; offset < nWordsReady; offset += blockSize) { // Perform concrete-algorithm logic this._doProcessBlock(dataWords, offset); diff --git a/src/enc-base64.js b/src/enc-base64.js index a32b9a4..cb818de 100644 --- a/src/enc-base64.js +++ b/src/enc-base64.js @@ -100,7 +100,7 @@ }; function parseLoop(base64Str, base64StrLength, reverseMap) { - var words = []; + var words = new Array((base64StrLength - (base64StrLength >>> 2) + 2) >>> 2); var nBytes = 0; for (var i = 0; i < base64StrLength; i++) { if (i % 4) { diff --git a/src/enc-utf16.js b/src/enc-utf16.js index a13cf20..12b93e6 100644 --- a/src/enc-utf16.js +++ b/src/enc-utf16.js @@ -114,7 +114,7 @@ var utf16StrLength = utf16Str.length; // Convert - var words = []; + var words = new Array((utf16StrLength + 1) >>> 1); for (var i = 0; i < utf16StrLength; i++) { words[i >>> 1] |= swapEndian(utf16Str.charCodeAt(i) << (16 - (i % 2) * 16)); } diff --git a/src/md5.js b/src/md5.js index 5189321..ded182f 100644 --- a/src/md5.js +++ b/src/md5.js @@ -150,6 +150,12 @@ var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; + var newLength = Math.max((nBitsLeft >>> 5) + 1, (((nBitsLeft + 64) >>> 9) << 4) + 16); + if (dataWords.length < newLength) { + data.words = dataWords.concat(new Array(newLength - dataWords.length)); + dataWords = data.words; + } + // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); diff --git a/src/ripemd160.js b/src/ripemd160.js index 3336bc8..71abe96 100644 --- a/src/ripemd160.js +++ b/src/ripemd160.js @@ -148,6 +148,12 @@ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; + var newLength = Math.max((nBitsLeft >>> 5) + 1, (((nBitsLeft + 64) >>> 9) << 4) + 15); + if (dataWords.length < newLength) { + data.words = dataWords.concat(new Array(newLength - dataWords.length)); + dataWords = data.words; + } + // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = ( diff --git a/src/sha1.js b/src/sha1.js index d052aeb..1e75e47 100644 --- a/src/sha1.js +++ b/src/sha1.js @@ -75,6 +75,12 @@ var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; + var newLength = Math.max((nBitsLeft >>> 5) + 1, (((nBitsLeft + 64) >>> 9) << 4) + 16); + if (dataWords.length < newLength) { + data.words = dataWords.concat(new Array(newLength - dataWords.length)); + dataWords = data.words; + } + // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); diff --git a/src/sha256.js b/src/sha256.js index ce5525d..51b3a9f 100644 --- a/src/sha256.js +++ b/src/sha256.js @@ -124,6 +124,12 @@ var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; + var newLength = Math.max((nBitsLeft >>> 5) + 1, (((nBitsLeft + 64) >>> 9) << 4) + 16); + if (dataWords.length < newLength) { + data.words = dataWords.concat(new Array(newLength - dataWords.length)); + dataWords = data.words; + } + // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000); diff --git a/src/sha3.js b/src/sha3.js index 9545fcd..91ca9f5 100644 --- a/src/sha3.js +++ b/src/sha3.js @@ -220,6 +220,12 @@ var nBitsLeft = data.sigBytes * 8; var blockSizeBits = this.blockSize * 32; + var newLength = Math.max((nBitsLeft >>> 5) + 1, (Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5); + if (dataWords.length < newLength) { + data.words = dataWords.concat(new Array(newLength - dataWords.length)); + dataWords = data.words; + } + // Add padding dataWords[nBitsLeft >>> 5] |= 0x1 << (24 - nBitsLeft % 32); dataWords[((Math.ceil((nBitsLeft + 1) / blockSizeBits) * blockSizeBits) >>> 5) - 1] |= 0x80; diff --git a/src/sha512.js b/src/sha512.js index 2ca9991..6075efe 100644 --- a/src/sha512.js +++ b/src/sha512.js @@ -246,6 +246,12 @@ var nBitsTotal = this._nDataBytes * 8; var nBitsLeft = data.sigBytes * 8; + var newLength = Math.max((nBitsLeft >>> 5) + 1, (((nBitsLeft + 128) >>> 10) << 5) + 32); + if (dataWords.length < newLength) { + data.words = dataWords.concat(new Array(newLength - dataWords.length)); + dataWords = data.words; + } + // Add padding dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32); dataWords[(((nBitsLeft + 128) >>> 10) << 5) + 30] = Math.floor(nBitsTotal / 0x100000000);