Spaces:
Runtime error
Runtime error
;(function (root, factory) { | |
if (typeof exports === "object") { | |
// CommonJS | |
module.exports = exports = factory(); | |
} | |
else if (typeof define === "function" && define.amd) { | |
// AMD | |
define([], factory); | |
} | |
else { | |
// Global (browser) | |
root.CryptoJS = factory(); | |
} | |
}(this, function () { | |
/*globals window, global, require*/ | |
/** | |
* CryptoJS core components. | |
*/ | |
var CryptoJS = CryptoJS || (function (Math, undefined) { | |
var crypto; | |
// Native crypto from window (Browser) | |
if (typeof window !== 'undefined' && window.crypto) { | |
crypto = window.crypto; | |
} | |
// Native crypto in web worker (Browser) | |
if (typeof self !== 'undefined' && self.crypto) { | |
crypto = self.crypto; | |
} | |
// Native crypto from worker | |
if (typeof globalThis !== 'undefined' && globalThis.crypto) { | |
crypto = globalThis.crypto; | |
} | |
// Native (experimental IE 11) crypto from window (Browser) | |
if (!crypto && typeof window !== 'undefined' && window.msCrypto) { | |
crypto = window.msCrypto; | |
} | |
// Native crypto from global (NodeJS) | |
if (!crypto && typeof global !== 'undefined' && global.crypto) { | |
crypto = global.crypto; | |
} | |
// Native crypto import via require (NodeJS) | |
if (!crypto && typeof require === 'function') { | |
try { | |
crypto = require('crypto'); | |
} catch (err) {} | |
} | |
/* | |
* Cryptographically secure pseudorandom number generator | |
* | |
* As Math.random() is cryptographically not safe to use | |
*/ | |
var cryptoSecureRandomInt = function () { | |
if (crypto) { | |
// Use getRandomValues method (Browser) | |
if (typeof crypto.getRandomValues === 'function') { | |
try { | |
return crypto.getRandomValues(new Uint32Array(1))[0]; | |
} catch (err) {} | |
} | |
// Use randomBytes method (NodeJS) | |
if (typeof crypto.randomBytes === 'function') { | |
try { | |
return crypto.randomBytes(4).readInt32LE(); | |
} catch (err) {} | |
} | |
} | |
throw new Error('Native crypto module could not be used to get secure random number.'); | |
}; | |
/* | |
* Local polyfill of Object.create | |
*/ | |
var create = Object.create || (function () { | |
function F() {} | |
return function (obj) { | |
var subtype; | |
F.prototype = obj; | |
subtype = new F(); | |
F.prototype = null; | |
return subtype; | |
}; | |
}()); | |
/** | |
* CryptoJS namespace. | |
*/ | |
var C = {}; | |
/** | |
* Library namespace. | |
*/ | |
var C_lib = C.lib = {}; | |
/** | |
* Base object for prototypal inheritance. | |
*/ | |
var Base = C_lib.Base = (function () { | |
return { | |
/** | |
* Creates a new object that inherits from this object. | |
* | |
* @param {Object} overrides Properties to copy into the new object. | |
* | |
* @return {Object} The new object. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var MyType = CryptoJS.lib.Base.extend({ | |
* field: 'value', | |
* | |
* method: function () { | |
* } | |
* }); | |
*/ | |
extend: function (overrides) { | |
// Spawn | |
var subtype = create(this); | |
// Augment | |
if (overrides) { | |
subtype.mixIn(overrides); | |
} | |
// Create default initializer | |
if (!subtype.hasOwnProperty('init') || this.init === subtype.init) { | |
subtype.init = function () { | |
subtype.$super.init.apply(this, arguments); | |
}; | |
} | |
// Initializer's prototype is the subtype object | |
subtype.init.prototype = subtype; | |
// Reference supertype | |
subtype.$super = this; | |
return subtype; | |
}, | |
/** | |
* Extends this object and runs the init method. | |
* Arguments to create() will be passed to init(). | |
* | |
* @return {Object} The new object. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var instance = MyType.create(); | |
*/ | |
create: function () { | |
var instance = this.extend(); | |
instance.init.apply(instance, arguments); | |
return instance; | |
}, | |
/** | |
* Initializes a newly created object. | |
* Override this method to add some logic when your objects are created. | |
* | |
* @example | |
* | |
* var MyType = CryptoJS.lib.Base.extend({ | |
* init: function () { | |
* // ... | |
* } | |
* }); | |
*/ | |
init: function () { | |
}, | |
/** | |
* Copies properties into this object. | |
* | |
* @param {Object} properties The properties to mix in. | |
* | |
* @example | |
* | |
* MyType.mixIn({ | |
* field: 'value' | |
* }); | |
*/ | |
mixIn: function (properties) { | |
for (var propertyName in properties) { | |
if (properties.hasOwnProperty(propertyName)) { | |
this[propertyName] = properties[propertyName]; | |
} | |
} | |
// IE won't copy toString using the loop above | |
if (properties.hasOwnProperty('toString')) { | |
this.toString = properties.toString; | |
} | |
}, | |
/** | |
* Creates a copy of this object. | |
* | |
* @return {Object} The clone. | |
* | |
* @example | |
* | |
* var clone = instance.clone(); | |
*/ | |
clone: function () { | |
return this.init.prototype.extend(this); | |
} | |
}; | |
}()); | |
/** | |
* An array of 32-bit words. | |
* | |
* @property {Array} words The array of 32-bit words. | |
* @property {number} sigBytes The number of significant bytes in this word array. | |
*/ | |
var WordArray = C_lib.WordArray = Base.extend({ | |
/** | |
* Initializes a newly created word array. | |
* | |
* @param {Array} words (Optional) An array of 32-bit words. | |
* @param {number} sigBytes (Optional) The number of significant bytes in the words. | |
* | |
* @example | |
* | |
* var wordArray = CryptoJS.lib.WordArray.create(); | |
* var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]); | |
* var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6); | |
*/ | |
init: function (words, sigBytes) { | |
words = this.words = words || []; | |
if (sigBytes != undefined) { | |
this.sigBytes = sigBytes; | |
} else { | |
this.sigBytes = words.length * 4; | |
} | |
}, | |
/** | |
* Converts this word array to a string. | |
* | |
* @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex | |
* | |
* @return {string} The stringified word array. | |
* | |
* @example | |
* | |
* var string = wordArray + ''; | |
* var string = wordArray.toString(); | |
* var string = wordArray.toString(CryptoJS.enc.Utf8); | |
*/ | |
toString: function (encoder) { | |
return (encoder || Hex).stringify(this); | |
}, | |
/** | |
* Concatenates a word array to this word array. | |
* | |
* @param {WordArray} wordArray The word array to append. | |
* | |
* @return {WordArray} This word array. | |
* | |
* @example | |
* | |
* wordArray1.concat(wordArray2); | |
*/ | |
concat: function (wordArray) { | |
// Shortcuts | |
var thisWords = this.words; | |
var thatWords = wordArray.words; | |
var thisSigBytes = this.sigBytes; | |
var thatSigBytes = wordArray.sigBytes; | |
// Clamp excess bits | |
this.clamp(); | |
// Concat | |
if (thisSigBytes % 4) { | |
// Copy one byte at a time | |
for (var i = 0; i < thatSigBytes; i++) { | |
var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; | |
thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8); | |
} | |
} else { | |
// Copy one word at a time | |
for (var j = 0; j < thatSigBytes; j += 4) { | |
thisWords[(thisSigBytes + j) >>> 2] = thatWords[j >>> 2]; | |
} | |
} | |
this.sigBytes += thatSigBytes; | |
// Chainable | |
return this; | |
}, | |
/** | |
* Removes insignificant bits. | |
* | |
* @example | |
* | |
* wordArray.clamp(); | |
*/ | |
clamp: function () { | |
// Shortcuts | |
var words = this.words; | |
var sigBytes = this.sigBytes; | |
// Clamp | |
words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8); | |
words.length = Math.ceil(sigBytes / 4); | |
}, | |
/** | |
* Creates a copy of this word array. | |
* | |
* @return {WordArray} The clone. | |
* | |
* @example | |
* | |
* var clone = wordArray.clone(); | |
*/ | |
clone: function () { | |
var clone = Base.clone.call(this); | |
clone.words = this.words.slice(0); | |
return clone; | |
}, | |
/** | |
* Creates a word array filled with random bytes. | |
* | |
* @param {number} nBytes The number of random bytes to generate. | |
* | |
* @return {WordArray} The random word array. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var wordArray = CryptoJS.lib.WordArray.random(16); | |
*/ | |
random: function (nBytes) { | |
var words = []; | |
for (var i = 0; i < nBytes; i += 4) { | |
words.push(cryptoSecureRandomInt()); | |
} | |
return new WordArray.init(words, nBytes); | |
} | |
}); | |
/** | |
* Encoder namespace. | |
*/ | |
var C_enc = C.enc = {}; | |
/** | |
* Hex encoding strategy. | |
*/ | |
var Hex = C_enc.Hex = { | |
/** | |
* Converts a word array to a hex string. | |
* | |
* @param {WordArray} wordArray The word array. | |
* | |
* @return {string} The hex string. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var hexString = CryptoJS.enc.Hex.stringify(wordArray); | |
*/ | |
stringify: function (wordArray) { | |
// Shortcuts | |
var words = wordArray.words; | |
var sigBytes = wordArray.sigBytes; | |
// Convert | |
var hexChars = []; | |
for (var i = 0; i < sigBytes; i++) { | |
var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; | |
hexChars.push((bite >>> 4).toString(16)); | |
hexChars.push((bite & 0x0f).toString(16)); | |
} | |
return hexChars.join(''); | |
}, | |
/** | |
* Converts a hex string to a word array. | |
* | |
* @param {string} hexStr The hex string. | |
* | |
* @return {WordArray} The word array. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var wordArray = CryptoJS.enc.Hex.parse(hexString); | |
*/ | |
parse: function (hexStr) { | |
// Shortcut | |
var hexStrLength = hexStr.length; | |
// Convert | |
var words = []; | |
for (var i = 0; i < hexStrLength; i += 2) { | |
words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4); | |
} | |
return new WordArray.init(words, hexStrLength / 2); | |
} | |
}; | |
/** | |
* Latin1 encoding strategy. | |
*/ | |
var Latin1 = C_enc.Latin1 = { | |
/** | |
* Converts a word array to a Latin1 string. | |
* | |
* @param {WordArray} wordArray The word array. | |
* | |
* @return {string} The Latin1 string. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var latin1String = CryptoJS.enc.Latin1.stringify(wordArray); | |
*/ | |
stringify: function (wordArray) { | |
// Shortcuts | |
var words = wordArray.words; | |
var sigBytes = wordArray.sigBytes; | |
// Convert | |
var latin1Chars = []; | |
for (var i = 0; i < sigBytes; i++) { | |
var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff; | |
latin1Chars.push(String.fromCharCode(bite)); | |
} | |
return latin1Chars.join(''); | |
}, | |
/** | |
* Converts a Latin1 string to a word array. | |
* | |
* @param {string} latin1Str The Latin1 string. | |
* | |
* @return {WordArray} The word array. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var wordArray = CryptoJS.enc.Latin1.parse(latin1String); | |
*/ | |
parse: function (latin1Str) { | |
// Shortcut | |
var latin1StrLength = latin1Str.length; | |
// Convert | |
var words = []; | |
for (var i = 0; i < latin1StrLength; i++) { | |
words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8); | |
} | |
return new WordArray.init(words, latin1StrLength); | |
} | |
}; | |
/** | |
* UTF-8 encoding strategy. | |
*/ | |
var Utf8 = C_enc.Utf8 = { | |
/** | |
* Converts a word array to a UTF-8 string. | |
* | |
* @param {WordArray} wordArray The word array. | |
* | |
* @return {string} The UTF-8 string. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var utf8String = CryptoJS.enc.Utf8.stringify(wordArray); | |
*/ | |
stringify: function (wordArray) { | |
try { | |
return decodeURIComponent(escape(Latin1.stringify(wordArray))); | |
} catch (e) { | |
throw new Error('Malformed UTF-8 data'); | |
} | |
}, | |
/** | |
* Converts a UTF-8 string to a word array. | |
* | |
* @param {string} utf8Str The UTF-8 string. | |
* | |
* @return {WordArray} The word array. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var wordArray = CryptoJS.enc.Utf8.parse(utf8String); | |
*/ | |
parse: function (utf8Str) { | |
return Latin1.parse(unescape(encodeURIComponent(utf8Str))); | |
} | |
}; | |
/** | |
* Abstract buffered block algorithm template. | |
* | |
* The property blockSize must be implemented in a concrete subtype. | |
* | |
* @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0 | |
*/ | |
var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({ | |
/** | |
* Resets this block algorithm's data buffer to its initial state. | |
* | |
* @example | |
* | |
* bufferedBlockAlgorithm.reset(); | |
*/ | |
reset: function () { | |
// Initial values | |
this._data = new WordArray.init(); | |
this._nDataBytes = 0; | |
}, | |
/** | |
* Adds new data to this block algorithm's buffer. | |
* | |
* @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8. | |
* | |
* @example | |
* | |
* bufferedBlockAlgorithm._append('data'); | |
* bufferedBlockAlgorithm._append(wordArray); | |
*/ | |
_append: function (data) { | |
// Convert string to WordArray, else assume WordArray already | |
if (typeof data == 'string') { | |
data = Utf8.parse(data); | |
} | |
// Append | |
this._data.concat(data); | |
this._nDataBytes += data.sigBytes; | |
}, | |
/** | |
* Processes available data blocks. | |
* | |
* This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype. | |
* | |
* @param {boolean} doFlush Whether all blocks and partial blocks should be processed. | |
* | |
* @return {WordArray} The processed data. | |
* | |
* @example | |
* | |
* var processedData = bufferedBlockAlgorithm._process(); | |
* var processedData = bufferedBlockAlgorithm._process(!!'flush'); | |
*/ | |
_process: function (doFlush) { | |
var processedWords; | |
// Shortcuts | |
var data = this._data; | |
var dataWords = data.words; | |
var dataSigBytes = data.sigBytes; | |
var blockSize = this.blockSize; | |
var blockSizeBytes = blockSize * 4; | |
// Count blocks ready | |
var nBlocksReady = dataSigBytes / blockSizeBytes; | |
if (doFlush) { | |
// Round up to include partial blocks | |
nBlocksReady = Math.ceil(nBlocksReady); | |
} else { | |
// Round down to include only full blocks, | |
// less the number of blocks that must remain in the buffer | |
nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0); | |
} | |
// Count words ready | |
var nWordsReady = nBlocksReady * blockSize; | |
// Count bytes ready | |
var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes); | |
// Process blocks | |
if (nWordsReady) { | |
for (var offset = 0; offset < nWordsReady; offset += blockSize) { | |
// Perform concrete-algorithm logic | |
this._doProcessBlock(dataWords, offset); | |
} | |
// Remove processed words | |
processedWords = dataWords.splice(0, nWordsReady); | |
data.sigBytes -= nBytesReady; | |
} | |
// Return processed words | |
return new WordArray.init(processedWords, nBytesReady); | |
}, | |
/** | |
* Creates a copy of this object. | |
* | |
* @return {Object} The clone. | |
* | |
* @example | |
* | |
* var clone = bufferedBlockAlgorithm.clone(); | |
*/ | |
clone: function () { | |
var clone = Base.clone.call(this); | |
clone._data = this._data.clone(); | |
return clone; | |
}, | |
_minBufferSize: 0 | |
}); | |
/** | |
* Abstract hasher template. | |
* | |
* @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits) | |
*/ | |
var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({ | |
/** | |
* Configuration options. | |
*/ | |
cfg: Base.extend(), | |
/** | |
* Initializes a newly created hasher. | |
* | |
* @param {Object} cfg (Optional) The configuration options to use for this hash computation. | |
* | |
* @example | |
* | |
* var hasher = CryptoJS.algo.SHA256.create(); | |
*/ | |
init: function (cfg) { | |
// Apply config defaults | |
this.cfg = this.cfg.extend(cfg); | |
// Set initial values | |
this.reset(); | |
}, | |
/** | |
* Resets this hasher to its initial state. | |
* | |
* @example | |
* | |
* hasher.reset(); | |
*/ | |
reset: function () { | |
// Reset data buffer | |
BufferedBlockAlgorithm.reset.call(this); | |
// Perform concrete-hasher logic | |
this._doReset(); | |
}, | |
/** | |
* Updates this hasher with a message. | |
* | |
* @param {WordArray|string} messageUpdate The message to append. | |
* | |
* @return {Hasher} This hasher. | |
* | |
* @example | |
* | |
* hasher.update('message'); | |
* hasher.update(wordArray); | |
*/ | |
update: function (messageUpdate) { | |
// Append | |
this._append(messageUpdate); | |
// Update the hash | |
this._process(); | |
// Chainable | |
return this; | |
}, | |
/** | |
* Finalizes the hash computation. | |
* Note that the finalize operation is effectively a destructive, read-once operation. | |
* | |
* @param {WordArray|string} messageUpdate (Optional) A final message update. | |
* | |
* @return {WordArray} The hash. | |
* | |
* @example | |
* | |
* var hash = hasher.finalize(); | |
* var hash = hasher.finalize('message'); | |
* var hash = hasher.finalize(wordArray); | |
*/ | |
finalize: function (messageUpdate) { | |
// Final message update | |
if (messageUpdate) { | |
this._append(messageUpdate); | |
} | |
// Perform concrete-hasher logic | |
var hash = this._doFinalize(); | |
return hash; | |
}, | |
blockSize: 512/32, | |
/** | |
* Creates a shortcut function to a hasher's object interface. | |
* | |
* @param {Hasher} hasher The hasher to create a helper for. | |
* | |
* @return {Function} The shortcut function. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256); | |
*/ | |
_createHelper: function (hasher) { | |
return function (message, cfg) { | |
return new hasher.init(cfg).finalize(message); | |
}; | |
}, | |
/** | |
* Creates a shortcut function to the HMAC's object interface. | |
* | |
* @param {Hasher} hasher The hasher to use in this HMAC helper. | |
* | |
* @return {Function} The shortcut function. | |
* | |
* @static | |
* | |
* @example | |
* | |
* var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256); | |
*/ | |
_createHmacHelper: function (hasher) { | |
return function (message, key) { | |
return new C_algo.HMAC.init(hasher, key).finalize(message); | |
}; | |
} | |
}); | |
/** | |
* Algorithm namespace. | |
*/ | |
var C_algo = C.algo = {}; | |
return C; | |
}(Math)); | |
return CryptoJS; | |
})); |