diff --git a/.eslintrc.js b/.eslintrc.js index b4071c9..9fc0ef9 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -3,34 +3,35 @@ module.exports = { 'browser': true, 'es6': true, 'node': true, - 'jest': true, + 'jest': true }, 'parser': '@babel/eslint-parser', 'extends': 'eslint:recommended', 'globals': { 'Atomics': 'readonly', - 'SharedArrayBuffer': 'readonly', + 'SharedArrayBuffer': 'readonly' }, 'parserOptions': { 'ecmaVersion': 6, 'sourceType': 'module', 'ecmaFeatures': { - 'impliedStrict': true, + 'impliedStrict': true }, - 'requireConfigFile': false, + 'requireConfigFile': false }, 'rules': { - 'quotes': ['warn', 'single',], - 'linebreak-style': [0, 'error', 'windows',], - 'indent': ['error', 2,], - 'semi': ['error', 'always',], - 'comma-dangle': ['error', 'always',], - 'no-cond-assign': ['error', 'always',], + 'quotes': ['warn', 'single'], + 'linebreak-style': [0, 'error', 'windows'], + 'indent': ['error', 2], + 'semi': ['error', 'always'], + 'comma-dangle': ['warn', 'never'], + 'no-cond-assign': ['error', 'always'], 'no-console': 'off', 'accessor-pairs': 'error', 'default-case':'error', 'no-eval': 'error', 'no-use-before-define': 'warn', 'max-len': 'off', - }, + 'object-curly-spacing': ['warn', 'always', { 'arraysInObjects': false, 'objectsInObjects': false }] + } }; diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2d7108a..2c165ec 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,6 +1,6 @@ name: CI -on: +on: push: branches: - '**' @@ -17,7 +17,7 @@ jobs: node_version: [12, 14, 16] include: - os: macos-latest - node_version: 14 + node_version: 16 - os: windows-latest node_version: 14 fail-fast: false diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..22cc82b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,10 @@ +## 1.1.1 + +### Bug fixes: + +* Add and fix types for static WordArray.create()(contributed by asivery, [#2](https://github.com/originjs/crypto-js-wasm/pull/2)) +* Fix the library for Webpack(contributed by asivery [#3](https://github.com/originjs/crypto-js-wasm/pull/3)) +* Use sha256 with iterations of 250000 as default hasher of PBKDF2 to prevent weak security problem. Related to CVE-2023-46233 of crypto-js + +### Features: + diff --git a/README-CN.md b/README-CN.md index e89480c..8a5f527 100644 --- a/README-CN.md +++ b/README-CN.md @@ -51,7 +51,7 @@ yarn add @originjs/crypto-js-wasm 在使用各算法前需调用一次对应的`loadWasm()`,或调用`loadAllWasm()`以加载所有算法的WebAssembly文件。 ```javascript -import CryptoJSW from 'crypto-js-wasm'; +import CryptoJSW from '@originjs/crypto-js-wasm'; // (可选) 加载所有 wasm 文件 await CryptoJSW.loadAllWasm(); diff --git a/README.md b/README.md index 5e7ca3a..3392e76 100644 --- a/README.md +++ b/README.md @@ -51,7 +51,7 @@ yarn add @originjs/crypto-js-wasm Note that the async function `loadWasm()` should be called once (and once only!) for each algorithm that will be used, unless `loadAllWasm()` is called at the very beginning. ```javascript -import CryptoJSW from 'crypto-js-wasm'; +import CryptoJSW from '@originjs/crypto-js-wasm'; // (Optional) load all wasm files await CryptoJSW.loadAllWasm(); diff --git a/docs/rsa-CN.md b/docs/rsa-CN.md index 286ce3d..3ccaca2 100644 --- a/docs/rsa-CN.md +++ b/docs/rsa-CN.md @@ -165,3 +165,23 @@ const errorDigest = C.RSA.digest('another message', {hashAlgo: 'md5',}); expect(C.RSA.verify(errorDigest, signature)).toBe(false); ``` +### 注意 + +`initFromKeyFile` 和 `generateKeyFile` 的内部实现依赖于 `nodejs` 的 `fs`(因为他们就是设计用来从文件中读取,或写入文件的),这意味着他们不能在浏览器中使用。如果在非`nodejs`环境使用他们,我们会报错,但是方法内部所使用的`fs`在`webpack`中还是可能报错: + +```shell +Module not found: Error: Can't resolve 'fs' in '...\node_modules\@originjs\crypto-js-wasm\lib' +``` + +对于 `webpack > 5`, 你可以在 `webpack.config.js` 中添加如下配置来避免此报错(通过[这个issue](https://github.com/webpack-contrib/css-loader/issues/447)可以查看更多细节): + +```javascript +module.exports = { + ... + resolve: { + fallback: { + fs: false + }, + } +} +``` diff --git a/docs/rsa.md b/docs/rsa.md index 40b4693..3095bdd 100644 --- a/docs/rsa.md +++ b/docs/rsa.md @@ -163,3 +163,23 @@ const errorDigest = C.RSA.digest('another message', {hashAlgo: 'md5',}); expect(C.RSA.verify(errorDigest, signature)).toBe(false); ``` +### Notes + +The implementations of `initFromKeyFile` and `generateKeyFile` depends on `fs` in `nodejs`(as they are designed to read from or write to files), which means they cannot be used in browser. We will throw an error if the runtime is not `nodejs`, but the usage of `fs` still may report in `webpack` like this: + +```shell +Module not found: Error: Can't resolve 'fs' in '...\node_modules\@originjs\crypto-js-wasm\lib' +``` + +For `webpack > 5`, you can add this in your `webpack.config.js` to avoid the error report(check [this issue](https://github.com/webpack-contrib/css-loader/issues/447) for details): + +```javascript +module.exports = { + ... + resolve: { + fallback: { + fs: false + }, + } +} +``` diff --git a/package.json b/package.json index 8e16b08..0e45242 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@originjs/crypto-js-wasm", - "version": "1.1.0", + "version": "1.1.1", "description": "An alternative to crypto-js implemented with WebAssembly and ESM", "main": "lib/index.js", "files": [ diff --git a/src/algo/hash/md5.js b/src/algo/hash/md5.js index 923efff..69ec13f 100644 --- a/src/algo/hash/md5.js +++ b/src/algo/hash/md5.js @@ -1,8 +1,8 @@ -import {WordArray,} from '../../core/core.js'; -import {Hasher,} from '../../core/hasher'; -import {loadWasm,} from '../../utils/wasm-utils'; -import {wasmBytes,} from './md5_wasm'; -import {md5Wasm,} from './md5_bg'; +import { WordArray } from '../../core/core.js'; +import { Hasher } from '../../core/hasher'; +import { loadWasm } from '../../utils/wasm-utils'; +import { wasmBytes } from './md5_wasm'; +import { md5Wasm } from './md5_bg'; /** * MD5 hash algorithm. @@ -29,7 +29,7 @@ export class MD5Algo extends Hasher { 0x67452301, 0xefcdab89, 0x98badcfe, - 0x10325476, + 0x10325476 ]); } diff --git a/src/algo/hash/md5_wasm.js b/src/algo/hash/md5_wasm.js index 7c08407..5fa69f3 100644 --- a/src/algo/hash/md5_wasm.js +++ b/src/algo/hash/md5_wasm.js @@ -1,3 +1,3 @@ -import {generateWasmBytes} from '../../utils/wasm-utils'; +import { generateWasmBytes } from '../../utils/wasm-utils'; export const wasmBytes = generateWasmBytes('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'); diff --git a/src/algo/hash/ripemd160.js b/src/algo/hash/ripemd160.js index f0b7853..6403bd7 100644 --- a/src/algo/hash/ripemd160.js +++ b/src/algo/hash/ripemd160.js @@ -20,11 +20,11 @@ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWIS WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import { Hasher, } from '../../core/hasher'; -import {WordArray,} from '../../core/core.js'; -import {ripemd160Wasm,} from './ripemd160_bg'; -import {wasmBytes,} from './ripemd160_wasm'; -import {loadWasm,} from '../../utils/wasm-utils'; +import { Hasher } from '../../core/hasher'; +import { WordArray } from '../../core/core.js'; +import { ripemd160Wasm } from './ripemd160_bg'; +import { wasmBytes } from './ripemd160_wasm'; +import { loadWasm } from '../../utils/wasm-utils'; @@ -49,7 +49,7 @@ export class RIPEMD160Algo extends Hasher { } _doReset() { - this._hash = new WordArray([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0,]); + this._hash = new WordArray([0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0]); } _process(doFlush) { diff --git a/src/algo/hash/sha1.js b/src/algo/hash/sha1.js index 2e700c6..aab7bba 100644 --- a/src/algo/hash/sha1.js +++ b/src/algo/hash/sha1.js @@ -1,8 +1,8 @@ -import {WordArray,} from '../../core/core'; -import {Hasher,} from '../../core/hasher'; -import {wasmBytes,} from './sha1_wasm'; -import {loadWasm,} from '../../utils/wasm-utils'; -import {sha1Wasm,} from './sha1_bg'; +import { WordArray } from '../../core/core'; +import { Hasher } from '../../core/hasher'; +import { wasmBytes } from './sha1_wasm'; +import { loadWasm } from '../../utils/wasm-utils'; +import { sha1Wasm } from './sha1_bg'; /** * SHA-1 hash algorithm. @@ -30,7 +30,7 @@ export class SHA1Algo extends Hasher { 0xefcdab89, 0x98badcfe, 0x10325476, - 0xc3d2e1f0, + 0xc3d2e1f0 ]); } diff --git a/src/algo/hash/sha224.js b/src/algo/hash/sha224.js index ec8b3a9..95c8d3d 100644 --- a/src/algo/hash/sha224.js +++ b/src/algo/hash/sha224.js @@ -1,5 +1,5 @@ -import { WordArray, } from '../../core/core.js'; -import { SHA256Algo, } from './sha256.js'; +import { WordArray } from '../../core/core.js'; +import { SHA256Algo } from './sha256.js'; /** * SHA-224 hash algorithm. @@ -24,7 +24,7 @@ export class SHA224Algo extends SHA256Algo { 0xffc00b31, 0x68581511, 0x64f98fa7, - 0xbefa4fa4, + 0xbefa4fa4 ]); } diff --git a/src/algo/hash/sha256.js b/src/algo/hash/sha256.js index a2a6d3b..973756c 100644 --- a/src/algo/hash/sha256.js +++ b/src/algo/hash/sha256.js @@ -1,11 +1,11 @@ -import {WordArray,} from '../../core/core.js'; -import {Hasher,} from '../../core/hasher'; -import {loadWasm,} from '../../utils/wasm-utils'; -import {wasmBytes,} from './sha256_wasm'; -import {sha256Wasm,} from './sha256_bg'; +import { WordArray } from '../../core/core.js'; +import { Hasher } from '../../core/hasher'; +import { loadWasm } from '../../utils/wasm-utils'; +import { wasmBytes } from './sha256_wasm'; +import { sha256Wasm } from './sha256_bg'; // Initialization and round constants tables -const H = [1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225,]; +const H = [1779033703, -1150833019, 1013904242, -1521486534, 1359893119, -1694144372, 528734635, 1541459225]; /** * SHA-256 hash algorithm. diff --git a/src/algo/hash/sha256_wasm.js b/src/algo/hash/sha256_wasm.js index 7bcdf7e..af59693 100644 --- a/src/algo/hash/sha256_wasm.js +++ b/src/algo/hash/sha256_wasm.js @@ -1,3 +1,3 @@ -import {generateWasmBytes} from '../../utils/wasm-utils'; +import { generateWasmBytes } from '../../utils/wasm-utils'; export const wasmBytes = generateWasmBytes('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'); diff --git a/src/algo/hash/sha3.js b/src/algo/hash/sha3.js index 23ca2a2..2f42c9f 100644 --- a/src/algo/hash/sha3.js +++ b/src/algo/hash/sha3.js @@ -1,9 +1,9 @@ -import {WordArray} from '../../core/core.js'; -import {X64Word} from '../../core/x64-core.js'; -import {Hasher} from '../../core/hasher'; -import {wasmBytes} from './sha3_wasm'; -import {sha3Wasm} from './sha3_bg'; -import {loadWasm} from '../../utils/wasm-utils'; +import { WordArray } from '../../core/core.js'; +import { X64Word } from '../../core/x64-core.js'; +import { Hasher } from '../../core/hasher'; +import { wasmBytes } from './sha3_wasm'; +import { sha3Wasm } from './sha3_bg'; +import { loadWasm } from '../../utils/wasm-utils'; /** * SHA-3 hash algorithm. @@ -34,7 +34,7 @@ export class SHA3Algo extends Hasher { * Default: 512 */ super(Object.assign( - {outputLength: 512}, + { outputLength: 512 }, cfg )); } diff --git a/src/algo/hash/sha384.js b/src/algo/hash/sha384.js index abe74ae..ee159e1 100644 --- a/src/algo/hash/sha384.js +++ b/src/algo/hash/sha384.js @@ -1,5 +1,5 @@ -import {X64Word, X64WordArray,} from '../../core/x64-core.js'; -import {SHA512Algo,} from './sha512.js'; +import { X64Word, X64WordArray } from '../../core/x64-core.js'; +import { SHA512Algo } from './sha512.js'; /** * SHA-384 hash algorithm. @@ -24,7 +24,7 @@ export class SHA384Algo extends SHA512Algo { new X64Word(0x67332667, 0xffc00b31), new X64Word(0x8eb44a87, 0x68581511), new X64Word(0xdb0c2e0d, 0x64f98fa7), - new X64Word(0x47b5481d, 0xbefa4fa4), + new X64Word(0x47b5481d, 0xbefa4fa4) ]); } diff --git a/src/algo/hash/sha512.js b/src/algo/hash/sha512.js index 037c638..26709b4 100644 --- a/src/algo/hash/sha512.js +++ b/src/algo/hash/sha512.js @@ -1,9 +1,9 @@ -import {Hasher,} from '../../core/hasher'; -import {WordArray,} from '../../core/core.js'; -import {X64Word, X64WordArray,} from '../../core/x64-core.js'; -import {loadWasm,} from '../../utils/wasm-utils'; -import {wasmBytes,} from './sha512_wasm'; -import {sha512Wasm,} from './sha512_bg'; +import { Hasher } from '../../core/hasher'; +import { WordArray } from '../../core/core.js'; +import { X64Word, X64WordArray } from '../../core/x64-core.js'; +import { loadWasm } from '../../utils/wasm-utils'; +import { wasmBytes } from './sha512_wasm'; +import { sha512Wasm } from './sha512_bg'; /** * SHA-512 hash algorithm. @@ -40,7 +40,7 @@ export class SHA512Algo extends Hasher { new X64Word(0x510e527f, 0xade682d1), new X64Word(0x9b05688c, 0x2b3e6c1f), new X64Word(0x1f83d9ab, 0xfb41bd6b), - new X64Word(0x5be0cd19, 0x137e2179), + new X64Word(0x5be0cd19, 0x137e2179) ]); } diff --git a/src/algo/pbkdf2/pbkdf2.js b/src/algo/pbkdf2/pbkdf2.js index 4f524c5..bb728da 100644 --- a/src/algo/pbkdf2/pbkdf2.js +++ b/src/algo/pbkdf2/pbkdf2.js @@ -2,7 +2,7 @@ import { Base, WordArray } from '../../core/core.js'; -import { SHA1Algo } from '../hash/sha1.js'; +import { SHA256Algo } from '../hash/sha256.js'; import { HMAC } from '../hmac/hmac.js'; @@ -28,28 +28,28 @@ export class PBKDF2Algo extends Base { * Configuration options. * * @property {number} keySize The key size in words to generate. Default: 4 (128 bits) - * @property {Hasher} hasher The hasher to use. Default: SHA1 - * @property {number} iterations The number of iterations to perform. Default: 1 + * @property {Hasher} hasher The hasher to use. Default: SHA256 + * @property {number} iterations The number of iterations to perform. Default: 250000 */ this.cfg = Object.assign( new Base(), { keySize: 128 / 32, - hasher: SHA1Algo, - iterations: 1 + hasher: SHA256Algo, + iterations: 250000 }, cfg ); } /** - * SHA1 is the default hasher of pbkdf2. + * SHA256 is the default hasher of pbkdf2. * With another hasher configured, user should call the corresponding loadWasm of the configured hasher. * * @returns {Promise} */ static async loadWasm() { - return SHA1Algo.loadWasm(); + return SHA256Algo.loadWasm(); } async loadWasm() { diff --git a/src/core/cipher-core.js b/src/core/cipher-core.js index 7dea5bc..c25337a 100644 --- a/src/core/cipher-core.js +++ b/src/core/cipher-core.js @@ -13,7 +13,7 @@ import { } from '../encryption/evpkdf.js'; import { isString } from '../utils'; import { Pkcs7 } from '../pad/pad-pkcs7'; -import {MD5Algo} from '../algo/hash/md5'; +import { MD5Algo } from '../algo/hash/md5'; /** @@ -324,7 +324,9 @@ function xorBlock(words, offset, blockSize) { /** * Abstract base CBC mode. */ -export class CBC extends BlockCipherMode { } +export class CBC extends BlockCipherMode { + static _name = 'CBC'; +} /** * CBC encryptor. */ @@ -768,9 +770,9 @@ export const OpenSSLKdf = { // Derive key and IV let key; if (!hasher) { - key = new EvpKDFAlgo({keySize: keySize + ivSize}).compute(password, _salt); + key = new EvpKDFAlgo({ keySize: keySize + ivSize }).compute(password, _salt); } else { - key = new EvpKDFAlgo({keySize: keySize + ivSize, hasher: hasher}).compute(password, salt); + key = new EvpKDFAlgo({ keySize: keySize + ivSize, hasher: hasher }).compute(password, salt); } // Separate key and IV diff --git a/src/core/core.js b/src/core/core.js index 4470cbb..95eae59 100644 --- a/src/core/core.js +++ b/src/core/core.js @@ -96,6 +96,22 @@ export class Base { Object.assign(clone, this); return clone; } + + /** + * Get a new instance of this class. + * Arguments to create() will be passed to constructor. + * + * @return {Object} The new object. + * + * @static + * + * @example + * + * var instance = MyType.create(); + */ + static create(...args) { + return new this(...args); + } } /** @@ -161,6 +177,17 @@ export class WordArray extends Base { } } + /** + * Creates and initializes a word array + * A compatibility method for crypto-js + * + * @param {Array} words (Optional) An array of 32-bit words. + * @param {number} sigBytes (Optional) The number of significant bytes in the words. + */ + static create(words = [], sigBytes = words.length * 4) { + return new WordArray(words, sigBytes); + } + /** * Creates a word array filled with random bytes. * diff --git a/src/core/hasher.js b/src/core/hasher.js index 057e106..2a81461 100644 --- a/src/core/hasher.js +++ b/src/core/hasher.js @@ -1,5 +1,5 @@ -import {BufferedBlockAlgorithm, Base,} from './core'; -import {HMAC,} from '../algo/hmac/hmac'; +import { BufferedBlockAlgorithm, Base } from './core'; +import { HMAC } from '../algo/hmac/hmac'; /** diff --git a/src/encryption/aes.js b/src/encryption/aes.js index 5fae7c2..ff1665f 100644 --- a/src/encryption/aes.js +++ b/src/encryption/aes.js @@ -1,8 +1,8 @@ -import {aesWasm} from './aes_bg'; -import {WordArray} from '../core/core'; -import {BlockCipher} from '../core/cipher-core.js'; -import {loadWasm} from '../utils/wasm-utils'; -import {wasmBytes} from './aes_wasm'; +import { aesWasm } from './aes_bg'; +import { WordArray } from '../core/core'; +import { BlockCipher } from '../core/cipher-core.js'; +import { loadWasm } from '../utils/wasm-utils'; +import { wasmBytes } from './aes_wasm'; /** * AES block cipher algorithm. @@ -94,15 +94,15 @@ export class AESAlgo extends BlockCipher { // Perform concrete-algorithm logic if (this._xformMode == this._ENC_XFORM_MODE) { if (this.modeProcessBlock != undefined) { - this.modeProcessBlock = aesWasm(AESAlgo.wasm).doEncrypt(this.cfg.mode.name, this._nRounds, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this._keySchedule); + this.modeProcessBlock = aesWasm(AESAlgo.wasm).doEncrypt(this.cfg.mode._name, this._nRounds, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this._keySchedule); } else { - this.modeProcessBlock = aesWasm(AESAlgo.wasm).doEncrypt(this.cfg.mode.name, this._nRounds, nWordsReady, blockSize, ivWords, dataArray, this._keySchedule); + this.modeProcessBlock = aesWasm(AESAlgo.wasm).doEncrypt(this.cfg.mode._name, this._nRounds, nWordsReady, blockSize, ivWords, dataArray, this._keySchedule); } } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { if (this.modeProcessBlock != undefined) { - this.modeProcessBlock = aesWasm(AESAlgo.wasm).doDecrypt(this.cfg.mode.name, this._nRounds, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this._keySchedule, this._invKeySchedule); + this.modeProcessBlock = aesWasm(AESAlgo.wasm).doDecrypt(this.cfg.mode._name, this._nRounds, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this._keySchedule, this._invKeySchedule); } else { - this.modeProcessBlock = aesWasm(AESAlgo.wasm).doDecrypt(this.cfg.mode.name, this._nRounds, nWordsReady, blockSize, ivWords, dataArray, this._keySchedule, this._invKeySchedule); + this.modeProcessBlock = aesWasm(AESAlgo.wasm).doDecrypt(this.cfg.mode._name, this._nRounds, nWordsReady, blockSize, ivWords, dataArray, this._keySchedule, this._invKeySchedule); } } dataWords = Array.from(dataArray); diff --git a/src/encryption/blowfish.js b/src/encryption/blowfish.js index 76467a3..c1426ba 100644 --- a/src/encryption/blowfish.js +++ b/src/encryption/blowfish.js @@ -1,8 +1,8 @@ -import {blowfishWasm} from './blowfish_bg'; -import {WordArray} from '../core/core'; -import {BlockCipher} from '../core/cipher-core.js'; -import {loadWasm} from '../utils/wasm-utils'; -import {wasmBytes} from './blowfish_wasm'; +import { blowfishWasm } from './blowfish_bg'; +import { WordArray } from '../core/core'; +import { BlockCipher } from '../core/cipher-core.js'; +import { loadWasm } from '../utils/wasm-utils'; +import { wasmBytes } from './blowfish_wasm'; /** * Blowfish block cipher algorithm. @@ -109,15 +109,15 @@ export class BlowfishAlgo extends BlockCipher { // Perform concrete-algorithm logic if (this._xformMode == this._ENC_XFORM_MODE) { if (this.modeProcessBlock != undefined) { - this.modeProcessBlock = blowfishWasm(BlowfishAlgo.wasm).doEncrypt(this.cfg.mode.name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this.pbox, s); + this.modeProcessBlock = blowfishWasm(BlowfishAlgo.wasm).doEncrypt(this.cfg.mode._name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this.pbox, s); } else { - this.modeProcessBlock = blowfishWasm(BlowfishAlgo.wasm).doEncrypt(this.cfg.mode.name, nWordsReady, blockSize, ivWords, dataArray, this.pbox, s); + this.modeProcessBlock = blowfishWasm(BlowfishAlgo.wasm).doEncrypt(this.cfg.mode._name, nWordsReady, blockSize, ivWords, dataArray, this.pbox, s); } } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { if (this.modeProcessBlock != undefined) { - this.modeProcessBlock = blowfishWasm(BlowfishAlgo.wasm).doDecrypt(this.cfg.mode.name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this.pbox, s); + this.modeProcessBlock = blowfishWasm(BlowfishAlgo.wasm).doDecrypt(this.cfg.mode._name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this.pbox, s); } else { - this.modeProcessBlock = blowfishWasm(BlowfishAlgo.wasm).doDecrypt(this.cfg.mode.name, nWordsReady, blockSize, ivWords, dataArray, this.pbox, s); + this.modeProcessBlock = blowfishWasm(BlowfishAlgo.wasm).doDecrypt(this.cfg.mode._name, nWordsReady, blockSize, ivWords, dataArray, this.pbox, s); } } dataWords = Array.from(dataArray); diff --git a/src/encryption/rabbit-legacy.js b/src/encryption/rabbit-legacy.js index 5341bf0..5d86611 100644 --- a/src/encryption/rabbit-legacy.js +++ b/src/encryption/rabbit-legacy.js @@ -1,8 +1,8 @@ -import {WordArray} from '../core/core.js'; -import {StreamCipher} from '../core/cipher-core.js'; -import {rabbitWasm} from './rabbit_bg'; -import {wasmBytes} from './rabbit_wasm'; -import {loadWasm} from '../utils/wasm-utils'; +import { WordArray } from '../core/core.js'; +import { StreamCipher } from '../core/cipher-core.js'; +import { rabbitWasm } from './rabbit_bg'; +import { wasmBytes } from './rabbit_wasm'; +import { loadWasm } from '../utils/wasm-utils'; // Reusable objects const C_ = []; diff --git a/src/encryption/rabbit.js b/src/encryption/rabbit.js index a77851f..868e932 100644 --- a/src/encryption/rabbit.js +++ b/src/encryption/rabbit.js @@ -1,8 +1,8 @@ -import {WordArray} from '../core/core.js'; -import {StreamCipher} from '../core/cipher-core.js'; -import {rabbitWasm} from './rabbit_bg'; -import {wasmBytes} from './rabbit_wasm'; -import {loadWasm} from '../utils/wasm-utils'; +import { WordArray } from '../core/core.js'; +import { StreamCipher } from '../core/cipher-core.js'; +import { rabbitWasm } from './rabbit_bg'; +import { wasmBytes } from './rabbit_wasm'; +import { loadWasm } from '../utils/wasm-utils'; // Reusable objects const C_ = []; diff --git a/src/encryption/rc4.js b/src/encryption/rc4.js index d5c04fe..7d83563 100644 --- a/src/encryption/rc4.js +++ b/src/encryption/rc4.js @@ -1,8 +1,8 @@ -import {WordArray} from '../core/core.js'; -import {StreamCipher} from '../core/cipher-core.js'; -import {rc4Wasm} from './rc4_bg'; -import {wasmBytes} from './rc4_wasm'; -import {loadWasm} from '../utils/wasm-utils'; +import { WordArray } from '../core/core.js'; +import { StreamCipher } from '../core/cipher-core.js'; +import { rc4Wasm } from './rc4_bg'; +import { wasmBytes } from './rc4_wasm'; +import { loadWasm } from '../utils/wasm-utils'; function generateKeystreamWord() { // Shortcuts diff --git a/src/encryption/rsa.js b/src/encryption/rsa.js index 647b24e..9dcda2b 100644 --- a/src/encryption/rsa.js +++ b/src/encryption/rsa.js @@ -1,12 +1,12 @@ -import { parameterCheck, } from '../utils'; -import { init, RsaPrivate, RsaPublic, } from './rsa_bg.js'; -import { MD5, } from '../algo/hash/md5.js'; -import { SHA1, } from '../algo/hash/sha1.js'; -import { SHA224, } from '../algo/hash/sha224.js'; -import { SHA256, } from '../algo/hash/sha256.js'; -import { SHA384, } from '../algo/hash/sha384.js'; -import { SHA512, } from '../algo/hash/sha512.js'; -import { RIPEMD160, } from '../algo/hash/ripemd160.js'; +import { parameterCheck } from '../utils'; +import { init, RsaPrivate, RsaPublic } from './rsa_bg.js'; +import { MD5 } from '../algo/hash/md5.js'; +import { SHA1 } from '../algo/hash/sha1.js'; +import { SHA224 } from '../algo/hash/sha224.js'; +import { SHA256 } from '../algo/hash/sha256.js'; +import { SHA384 } from '../algo/hash/sha384.js'; +import { SHA512 } from '../algo/hash/sha512.js'; +import { RIPEMD160 } from '../algo/hash/ripemd160.js'; const RSA_PADDING_OAEP = 'OAEP'; const RSA_PADDING_PSS = 'PSS'; @@ -22,13 +22,13 @@ const DEFAULT_RSA_HASH_ALGO = 'SHA256'; // TODO: what if a new hasher is added? const RSA_HASH_ALGOS = new Map([ - ['MD5', MD5,], - ['SHA1', SHA1,], - ['SHA224', SHA224,], - ['SHA256', SHA256,], - ['SHA384', SHA384,], - ['SHA512', SHA512,], - ['RIPEMD160', RIPEMD160,], + ['MD5', MD5], + ['SHA1', SHA1], + ['SHA224', SHA224], + ['SHA256', SHA256], + ['SHA384', SHA384], + ['SHA512', SHA512], + ['RIPEMD160', RIPEMD160] ]); // TODO: should extend AsymmetricCipher(class not created yet) @@ -45,7 +45,7 @@ export class RSAAlgo { * @param isPublicKey true if the input key file is a public key file */ updateRsaKey(keyFilePathOrKeySize = DEFAULT_RSA_KEY_SIZE, isPublicKey = DEFAULT_IS_PUBLIC_KEY) { - parameterCheck(keyFilePathOrKeySize, 'RSA keyFilePathOrKeySize', ['number', 'string',]); + parameterCheck(keyFilePathOrKeySize, 'RSA keyFilePathOrKeySize', ['number', 'string']); if (keyFilePathOrKeySize === RSAAlgo.keyFilePathOrKeySize && isPublicKey == RSAAlgo.isPublicKey) { // do not update keys if nothing changed @@ -62,7 +62,7 @@ export class RSAAlgo { } // load wasm of available hashers - [...RSA_HASH_ALGOS.values(),].map(async hash => await hash.loadWasm()); + [...RSA_HASH_ALGOS.values()].map(async hash => await hash.loadWasm()); await init(); RSAAlgo.wasm = true; @@ -209,7 +209,7 @@ export class RSAAlgo { } const keyContent = fs.readFileSync(path, { encoding: 'utf-8', - flag: 'r', + flag: 'r' }); this.initFromKeyContent(keyContent, isPublicKey); } @@ -615,5 +615,5 @@ export const RSA = { getKeyContent(keyType, keyFmt) { return this.rsa.getKeyContent(keyType, keyFmt); - }, + } }; diff --git a/src/encryption/rsa_bg.js b/src/encryption/rsa_bg.js index 7e0995f..29534ab 100644 --- a/src/encryption/rsa_bg.js +++ b/src/encryption/rsa_bg.js @@ -1,4 +1,4 @@ -import { wasmBytes, } from './rsa_wasm'; +import { wasmBytes } from './rsa_wasm'; let wasm; let globalThis; const heap = new Array(32).fill(undefined); @@ -21,7 +21,7 @@ function takeObject(idx) { return ret; } -const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true, }); +const cachedTextDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: true }); cachedTextDecoder.decode(); @@ -125,7 +125,7 @@ const encodeString = (typeof cachedTextEncoder.encodeInto === 'function' view.set(buf); return { read: arg.length, - written: buf.length, + written: buf.length }; }); @@ -563,4 +563,4 @@ async function init() { cachedUint8Memory0 = new Uint8Array(wasm.memory.buffer); } -export { init, }; +export { init }; diff --git a/src/encryption/rsa_wasm.js b/src/encryption/rsa_wasm.js index 904b8eb..1900592 100644 --- a/src/encryption/rsa_wasm.js +++ b/src/encryption/rsa_wasm.js @@ -1,3 +1,3 @@ -import { generateWasmBytes, } from '../utils/wasm-utils'; +import { generateWasmBytes } from '../utils/wasm-utils'; export const wasmBytes = generateWasmBytes('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'); diff --git a/src/encryption/tripledes.js b/src/encryption/tripledes.js index 2dc4d3e..4381582 100644 --- a/src/encryption/tripledes.js +++ b/src/encryption/tripledes.js @@ -1,8 +1,8 @@ -import {WordArray} from '../core/core.js'; -import {BlockCipher} from '../core/cipher-core.js'; -import {desWasm} from './des_bg'; -import {wasmBytes} from './des_wasm'; -import {loadWasm} from '../utils/wasm-utils'; +import { WordArray } from '../core/core.js'; +import { BlockCipher } from '../core/cipher-core.js'; +import { desWasm } from './des_bg'; +import { wasmBytes } from './des_wasm'; +import { loadWasm } from '../utils/wasm-utils'; // Permuted Choice 1 constants const PC1 = [ @@ -163,15 +163,15 @@ export class DESAlgo extends BlockCipher { // Perform concrete-algorithm logic if (this._xformMode == this._ENC_XFORM_MODE) { if (this.modeProcessBlock != undefined) { - this.modeProcessBlock = desWasm(DESAlgo.wasm).doEncrypt(this.cfg.mode.name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this._key.words); + this.modeProcessBlock = desWasm(DESAlgo.wasm).doEncrypt(this.cfg.mode._name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this._key.words); } else { - this.modeProcessBlock = desWasm(DESAlgo.wasm).doEncrypt(this.cfg.mode.name, nWordsReady, blockSize, ivWords, dataArray, this._key.words); + this.modeProcessBlock = desWasm(DESAlgo.wasm).doEncrypt(this.cfg.mode._name, nWordsReady, blockSize, ivWords, dataArray, this._key.words); } } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { if (this.modeProcessBlock != undefined) { - this.modeProcessBlock = desWasm(DESAlgo.wasm).doDecrypt(this.cfg.mode.name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this._key.words); + this.modeProcessBlock = desWasm(DESAlgo.wasm).doDecrypt(this.cfg.mode._name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, this._key.words); } else { - this.modeProcessBlock = desWasm(DESAlgo.wasm).doDecrypt(this.cfg.mode.name, nWordsReady, blockSize, ivWords, dataArray, this._key.words); + this.modeProcessBlock = desWasm(DESAlgo.wasm).doDecrypt(this.cfg.mode._name, nWordsReady, blockSize, ivWords, dataArray, this._key.words); } } dataWords = Array.from(dataArray); @@ -284,15 +284,15 @@ export class TripleDESAlgo extends BlockCipher { // Perform concrete-algorithm logic if (this._xformMode == this._ENC_XFORM_MODE) { if (this.modeProcessBlock != undefined) { - this.modeProcessBlock = desWasm(DESAlgo.wasm).tripleEncrypt(this.cfg.mode.name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, key1, key2, key3); + this.modeProcessBlock = desWasm(DESAlgo.wasm).tripleEncrypt(this.cfg.mode._name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, key1, key2, key3); } else { - this.modeProcessBlock = desWasm(DESAlgo.wasm).tripleEncrypt(this.cfg.mode.name, nWordsReady, blockSize, ivWords, dataArray, key1, key2, key3); + this.modeProcessBlock = desWasm(DESAlgo.wasm).tripleEncrypt(this.cfg.mode._name, nWordsReady, blockSize, ivWords, dataArray, key1, key2, key3); } } else /* if (this._xformMode == this._DEC_XFORM_MODE) */ { if (this.modeProcessBlock != undefined) { - this.modeProcessBlock = desWasm(DESAlgo.wasm).tripleDecrypt(this.cfg.mode.name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, key1, key2, key3); + this.modeProcessBlock = desWasm(DESAlgo.wasm).tripleDecrypt(this.cfg.mode._name, nWordsReady, blockSize, this.modeProcessBlock, dataArray, key1, key2, key3); } else { - this.modeProcessBlock = desWasm(DESAlgo.wasm).tripleDecrypt(this.cfg.mode.name, nWordsReady, blockSize, ivWords, dataArray, key1, key2, key3); + this.modeProcessBlock = desWasm(DESAlgo.wasm).tripleDecrypt(this.cfg.mode._name, nWordsReady, blockSize, ivWords, dataArray, key1, key2, key3); } } dataWords = Array.from(dataArray); diff --git a/src/mode/mode-cfb.js b/src/mode/mode-cfb.js index 77f2532..2ba28ac 100644 --- a/src/mode/mode-cfb.js +++ b/src/mode/mode-cfb.js @@ -30,7 +30,7 @@ function generateKeystreamAndEncrypt(words, offset, blockSize, cipher) { * Cipher Feedback block mode. */ export class CFB extends BlockCipherMode { - + static _name = 'CFB'; static Encryptor(){} } diff --git a/src/mode/mode-ctr-gladman.js b/src/mode/mode-ctr-gladman.js index 6678831..71a8337 100644 --- a/src/mode/mode-ctr-gladman.js +++ b/src/mode/mode-ctr-gladman.js @@ -53,6 +53,7 @@ const incCounter = (counter) => { * Jan Hruby jhruby.web@gmail.com */ export class CTRGladman extends BlockCipherMode { + static _name = 'CTRGladman'; } CTRGladman.Encryptor = class extends CTRGladman { processBlock(words, offset) { diff --git a/src/mode/mode-ctr.js b/src/mode/mode-ctr.js index 804d6f8..4f01501 100644 --- a/src/mode/mode-ctr.js +++ b/src/mode/mode-ctr.js @@ -6,6 +6,7 @@ import { } from '../core/cipher-core.js'; export class CTR extends BlockCipherMode { + static _name = 'CTR'; } CTR.Encryptor = class extends CTR { processBlock(words, offset) { diff --git a/src/mode/mode-ecb.js b/src/mode/mode-ecb.js index c35ca49..477408e 100644 --- a/src/mode/mode-ecb.js +++ b/src/mode/mode-ecb.js @@ -6,6 +6,7 @@ import { } from '../core/cipher-core.js'; export class ECB extends BlockCipherMode { + static _name = 'ECB'; } ECB.Encryptor = class extends ECB { processBlock(words, offset) { diff --git a/src/mode/mode-ofb.js b/src/mode/mode-ofb.js index 5fb9f58..8221f3e 100644 --- a/src/mode/mode-ofb.js +++ b/src/mode/mode-ofb.js @@ -6,6 +6,7 @@ import { } from '../core/cipher-core.js'; export class OFB extends BlockCipherMode { + static _name = 'OFB'; } OFB.Encryptor = class extends OFB { processBlock(words, offset) { diff --git a/test/algo.blowfish.test.js b/test/algo.blowfish.test.js index 1230b2c..e54ca2e 100644 --- a/test/algo.blowfish.test.js +++ b/test/algo.blowfish.test.js @@ -30,6 +30,6 @@ describe('algo-blowfish-test', () => { hasher: C.algo.SHA256 }).toString(); - expect(C.Blowfish.decrypt(encryptedA, 'pass', {hasher: C.algo.SHA256}).toString(C.enc.Utf8)).toBe('Test'); + expect(C.Blowfish.decrypt(encryptedA, 'pass', { hasher: C.algo.SHA256 }).toString(C.enc.Utf8)).toBe('Test'); }); }); diff --git a/test/algo.pbkdf2.profile.test.js b/test/algo.pbkdf2.profile.test.js index dbc879d..c4aa22f 100644 --- a/test/algo.pbkdf2.profile.test.js +++ b/test/algo.pbkdf2.profile.test.js @@ -1,7 +1,7 @@ import C from '../src/index'; beforeAll(async () => { - await C.SHA1.loadWasm(); + await C.SHA256.loadWasm(); }); describe('algo-pbkdf2-profile', () => { diff --git a/test/algo.pbkdf2.test.js b/test/algo.pbkdf2.test.js index 32c2009..182d92d 100644 --- a/test/algo.pbkdf2.test.js +++ b/test/algo.pbkdf2.test.js @@ -1,104 +1,104 @@ import C from '../src/index'; beforeAll(async () => { - await C.SHA1.loadWasm(); + await C.SHA256.loadWasm(); }); describe('algo-pbkdf2-test', () => { test('testKeySize128', () => { expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', { keySize: 128 / 32 - }).toString()).toBe('cdedb5281bb2f801565a1122b2563515'); + }).toString()).toBe('62929ab995a1111c75c37bc562261ea3'); }); test('testKeySize256', () => { expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', { keySize: 256 / 32 - }).toString()).toBe('cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837'); + }).toString()).toBe('62929ab995a1111c75c37bc562261ea3fb3cdc7e725c4ca87c03cec5bb7663e1'); }); test('testKeySize128Iterations2', () => { expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', { keySize: 128 / 32, iterations: 2 - }).toString()).toBe('01dbee7f4a9e243e988b62c73cda935d'); + }).toString()).toBe('262fb72ea65b44ab5ceba7f8c8bfa781'); }); test('testKeySize256Iterations2', () => { expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', { keySize: 256 / 32, iterations: 2 - }).toString()).toBe('01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86'); + }).toString()).toBe('262fb72ea65b44ab5ceba7f8c8bfa7815ff9939204eb7357a59a75877d745777'); }); test('testKeySize128Iterations1200', () => { expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', { keySize: 128 / 32, iterations: 1200 - }).toString()).toBe('5c08eb61fdf71e4e4ec3cf6ba1f5512b'); + }).toString()).toBe('c76a982415f1acc71dc197273c5b6ada'); }); test('testKeySize256Iterations1200', () => { expect(C.PBKDF2('password', 'ATHENA.MIT.EDUraeburn', { keySize: 256 / 32, iterations: 1200 - }).toString()).toBe('5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13'); + }).toString()).toBe('c76a982415f1acc71dc197273c5b6ada32f62915ed461718aad32843762433fa'); }); test('testKeySize128Iterations5', () => { expect(C.PBKDF2('password', C.enc.Hex.parse('1234567878563412'), { keySize: 128 / 32, iterations: 5 - }).toString()).toBe('d1daa78615f287e6a1c8b120d7062a49'); + }).toString()).toBe('74e98b2e9eeddaab3113c1efc6d82b07'); }); test('testKeySize256Iterations5', () => { expect(C.PBKDF2('password', C.enc.Hex.parse('1234567878563412'), { keySize: 256 / 32, iterations: 5 - }).toString()).toBe('d1daa78615f287e6a1c8b120d7062a493f98d203e6be49a6adf4fa574b6e64ee'); + }).toString()).toBe('74e98b2e9eeddaab3113c1efc6d82b073c4860195b3e0737fa21a4778f376321'); }); test('testKeySize128Iterations1200PassPhraseEqualsBlockSize', () => { expect(C.PBKDF2('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'pass phrase equals block size', { keySize: 128 / 32, iterations: 1200 - }).toString()).toBe('139c30c0966bc32ba55fdbf212530ac9'); + }).toString()).toBe('c1dfb29a4d2f2fb67c6f78d074d66367'); }); test('testKeySize256Iterations1200PassPhraseEqualsBlockSize', () => { expect(C.PBKDF2('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'pass phrase equals block size', { keySize: 256 / 32, iterations: 1200 - }).toString()).toBe('139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1'); + }).toString()).toBe('c1dfb29a4d2f2fb67c6f78d074d663671e6fd4da1e598572b1fecf256cb7cf61'); }); test('testKeySize128Iterations1200PassPhraseExceedsBlockSize', () => { expect(C.PBKDF2('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'pass phrase exceeds block size', { keySize: 128 / 32, iterations: 1200 - }).toString()).toBe('9ccad6d468770cd51b10e6a68721be61'); + }).toString()).toBe('22344bc4b6e32675a8090f3ea80be01d'); }); test('testKeySize256Iterations1200PassPhraseExceedsBlockSize', () => { expect(C.PBKDF2('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX', 'pass phrase exceeds block size', { keySize: 256 / 32, iterations: 1200 - }).toString()).toBe('9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a'); + }).toString()).toBe('22344bc4b6e32675a8090f3ea80be01d5f95126a2cddc3facc4a5e6dca04ec58'); }); test('testKeySize128Iterations50', () => { expect(C.PBKDF2(C.enc.Hex.parse('f09d849e'), 'EXAMPLE.COMpianist', { keySize: 128 / 32, iterations: 50 - }).toString()).toBe('6b9cf26d45455a43a5b8bb276a403b39'); + }).toString()).toBe('44b0781253db3141ac4174af29325818'); }); test('testKeySize256Iterations50', () => { expect(C.PBKDF2(C.enc.Hex.parse('f09d849e'), 'EXAMPLE.COMpianist', { keySize: 256 / 32, iterations: 50 - }).toString()).toBe('6b9cf26d45455a43a5b8bb276a403b39e7fe37a0c41e02c281ff3069e1e94f52'); + }).toString()).toBe('44b0781253db3141ac4174af29325818584698d507a79f9879033dec308a2b77'); }); test('testInputIntegrity', () => { diff --git a/test/algo.rsa.test.js b/test/algo.rsa.test.js index b1980ee..23cef8a 100644 --- a/test/algo.rsa.test.js +++ b/test/algo.rsa.test.js @@ -45,7 +45,7 @@ uwIDAQAB const message = 'test message'; const encrypted = C.RSA.encrypt(message, { key: publicKeyContent, - isPublicKey: true, + isPublicKey: true }); // decrypt should throw expect(() => { @@ -70,16 +70,16 @@ uwIDAQAB test('encryptAndDecryptWithPKCS1V15', () => { C.RSA.resetConfig(); const msg = 'testMessage'; - const encrypted = C.RSA.encrypt(msg, {encryptPadding: 'pkcs1v15',}); - const decrypted = C.RSA.decrypt(encrypted, {encryptPadding: 'pkcs1v15',}); + const encrypted = C.RSA.encrypt(msg, { encryptPadding: 'pkcs1v15' }); + const decrypted = C.RSA.decrypt(encrypted, { encryptPadding: 'pkcs1v15' }); expect(new TextDecoder().decode(decrypted)).toBe(msg); }); test('encryptAndDecryptWithOAEP', () => { C.RSA.resetConfig(); const msg = 'testMessage'; - const encrypted = C.RSA.encrypt(msg, {encryptPadding: 'oaep',}); - const decrypted = C.RSA.decrypt(encrypted, {encryptPadding: 'oaep',}); + const encrypted = C.RSA.encrypt(msg, { encryptPadding: 'oaep' }); + const decrypted = C.RSA.decrypt(encrypted, { encryptPadding: 'oaep' }); expect(new TextDecoder().decode(decrypted)).toBe(msg); }); @@ -88,7 +88,7 @@ uwIDAQAB const msg = 'testMessage'; expect(() => { - C.RSA.encrypt(msg, {encryptPadding: 'ErrorPadding',}); + C.RSA.encrypt(msg, { encryptPadding: 'ErrorPadding' }); }).toThrow(); }); @@ -99,12 +99,12 @@ uwIDAQAB console.error = () => {}; const msg = 'testMessage'; - const PKCSEncrypted = C.RSA.encrypt(msg, {encryptPadding: 'pkcs1v15',}); - const OAEPDecrypted = C.RSA.decrypt(PKCSEncrypted, {encryptPadding: 'oaep',}); + const PKCSEncrypted = C.RSA.encrypt(msg, { encryptPadding: 'pkcs1v15' }); + const OAEPDecrypted = C.RSA.decrypt(PKCSEncrypted, { encryptPadding: 'oaep' }); expect(OAEPDecrypted).toBeNull(); - const OAEPEncrypted = C.RSA.encrypt(msg, {encryptPadding: 'oaep',}); - const PKCSDecrypted = C.RSA.decrypt(OAEPEncrypted, {encryptPadding: 'pkcs1v15',}); + const OAEPEncrypted = C.RSA.encrypt(msg, { encryptPadding: 'oaep' }); + const PKCSDecrypted = C.RSA.decrypt(OAEPEncrypted, { encryptPadding: 'pkcs1v15' }); expect(PKCSDecrypted).toBeNull(); // recover console error print @@ -116,17 +116,17 @@ uwIDAQAB const msgOAEPTooLong = new Uint8Array(191); expect(() => { - C.RSA.encrypt(msgOAEPTooLong, { encryptPadding: 'oaep', }); + C.RSA.encrypt(msgOAEPTooLong, { encryptPadding: 'oaep' }); }).toThrow(); const msgOAEPMD5TooLong = new Uint8Array(223); expect(() => { - C.RSA.encrypt(msgOAEPMD5TooLong, { encryptPadding: 'oaep', hashAlgo: 'md5', }); + C.RSA.encrypt(msgOAEPMD5TooLong, { encryptPadding: 'oaep', hashAlgo: 'md5' }); }).toThrow(); const msgPKCS1V15TooLong = new Uint8Array(246); expect(() => { - C.RSA.encrypt(msgPKCS1V15TooLong, { encryptPadding: 'pkcs1v15', }); + C.RSA.encrypt(msgPKCS1V15TooLong, { encryptPadding: 'pkcs1v15' }); }).toThrow(); }); @@ -139,7 +139,7 @@ uwIDAQAB console.error = () => {}; const msg = 'test message'; - const digestSha512 = C.RSA.digest(msg, {hashAlgo: 'sha512',}); + const digestSha512 = C.RSA.digest(msg, { hashAlgo: 'sha512' }); expect(() => { C.RSA.sign(digestSha512); }).toThrow(); @@ -151,66 +151,66 @@ uwIDAQAB test('signDigestOfMd5WithPKCS1V15', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'md5',}); - const signature = C.RSA.sign(digest, {signPadding: 'pkcs1v15',}); + const digest = C.RSA.digest(message, { hashAlgo: 'md5' }); + const signature = C.RSA.sign(digest, { signPadding: 'pkcs1v15' }); expect(C.RSA.verify(digest, signature)).toBe(true); - const errorDigest = C.RSA.digest('another message', {hashAlgo: 'md5',}); + const errorDigest = C.RSA.digest('another message', { hashAlgo: 'md5' }); expect(C.RSA.verify(errorDigest, signature)).toBe(false); }); test('signDigestOfSha1WithPKCS1V15', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha1',}); - const signature = C.RSA.sign(digest, {signPadding: 'pkcs1v15',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha1' }); + const signature = C.RSA.sign(digest, { signPadding: 'pkcs1v15' }); expect(C.RSA.verify(digest, signature)).toBe(true); }); test('signDigestOfSha224WithPKCS1V15', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha224',}); - const signature = C.RSA.sign(digest, {signPadding: 'pkcs1v15',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha224' }); + const signature = C.RSA.sign(digest, { signPadding: 'pkcs1v15' }); expect(C.RSA.verify(digest, signature)).toBe(true); }); test('signDigestOfSha256WithPKCS1V15', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha256',}); - const signature = C.RSA.sign(digest, {signPadding: 'pkcs1v15',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha256' }); + const signature = C.RSA.sign(digest, { signPadding: 'pkcs1v15' }); expect(C.RSA.verify(digest, signature)).toBe(true); }); test('signDigestOfSha384WithPKCS1V15', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha384',}); - const signature = C.RSA.sign(digest, {signPadding: 'pkcs1v15',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha384' }); + const signature = C.RSA.sign(digest, { signPadding: 'pkcs1v15' }); expect(C.RSA.verify(digest, signature)).toBe(true); }); test('signDigestOfSha512WithPKCS1V15', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha512',}); - const signature = C.RSA.sign(digest, {signPadding: 'pkcs1v15',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha512' }); + const signature = C.RSA.sign(digest, { signPadding: 'pkcs1v15' }); expect(C.RSA.verify(digest, signature)).toBe(true); }); test('signDigestOfRIPEMD160WithPKCS1V15', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'RIPEMD160',}); - const signature = C.RSA.sign(digest, {signPadding: 'pkcs1v15',}); + const digest = C.RSA.digest(message, { hashAlgo: 'RIPEMD160' }); + const signature = C.RSA.sign(digest, { signPadding: 'pkcs1v15' }); expect(C.RSA.verify(digest, signature)).toBe(true); }); test('signDigestOfMd5WithPSS', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'md5',}); + const digest = C.RSA.digest(message, { hashAlgo: 'md5' }); const signature = C.RSA.sign(digest); expect(C.RSA.verify(digest, signature)).toBe(true); }); @@ -218,7 +218,7 @@ uwIDAQAB test('signDigestOfSha1WithPSS', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha1',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha1' }); const signature = C.RSA.sign(digest); expect(C.RSA.verify(digest, signature)).toBe(true); }); @@ -226,7 +226,7 @@ uwIDAQAB test('signDigestOfSha224WithPSS', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha224',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha224' }); const signature = C.RSA.sign(digest); expect(C.RSA.verify(digest, signature)).toBe(true); }); @@ -234,7 +234,7 @@ uwIDAQAB test('signDigestOfSha256WithPSS', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha256',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha256' }); const signature = C.RSA.sign(digest); expect(C.RSA.verify(digest, signature)).toBe(true); }); @@ -242,7 +242,7 @@ uwIDAQAB test('signDigestOfSha384WithPSS', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha384',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha384' }); const signature = C.RSA.sign(digest); expect(C.RSA.verify(digest, signature)).toBe(true); }); @@ -250,7 +250,7 @@ uwIDAQAB test('signDigestOfSha512WithPSS', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'sha512',}); + const digest = C.RSA.digest(message, { hashAlgo: 'sha512' }); const signature = C.RSA.sign(digest); expect(C.RSA.verify(digest, signature)).toBe(true); }); @@ -258,7 +258,7 @@ uwIDAQAB test('signDigestOfRipemd160WithPSS', () => { C.RSA.resetConfig(); const message = 'test message'; - const digest = C.RSA.digest(message, {hashAlgo: 'ripemd160',}); + const digest = C.RSA.digest(message, { hashAlgo: 'ripemd160' }); const signature = C.RSA.sign(digest); expect(C.RSA.verify(digest, signature)).toBe(true); }); @@ -275,8 +275,8 @@ uwIDAQAB expect(new TextDecoder().decode(decrypted)).toBe(msg); // sign and verify - const digest = rsa.digest(msg, {hashAlgo: 'md5',}); - const signature = rsa.sign(digest, {signPadding: 'pkcs1v15',}); + const digest = rsa.digest(msg, { hashAlgo: 'md5' }); + const signature = rsa.sign(digest, { signPadding: 'pkcs1v15' }); expect(rsa.verify(digest, signature)).toBe(true); }); @@ -284,35 +284,35 @@ uwIDAQAB C.RSA.resetConfig(); const message = 'testMessage'; - const digest = C.RSA.digest(message, {hashAlgo: 'ripemd160',}); - const signature = C.RSA.sign(digest, {signPadding: 'PSS',}); - expect(C.RSA.verify(digest, signature, {signPadding: 'pkcs1v15',})).toBe(false); + const digest = C.RSA.digest(message, { hashAlgo: 'ripemd160' }); + const signature = C.RSA.sign(digest, { signPadding: 'PSS' }); + expect(C.RSA.verify(digest, signature, { signPadding: 'pkcs1v15' })).toBe(false); }); test('generatePrivateAndPublicKeyFile', () => { C.RSA.resetConfig(); C.RSA.generateKeyFile('pairs'); - expect(fs.readFileSync('./keys/key_private.pem', { encoding: 'utf-8', })) + expect(fs.readFileSync('./keys/key_private.pem', { encoding: 'utf-8' })) .toMatch(/^-----BEGIN PRIVATE KEY-----/); - expect(fs.readFileSync('./keys/key_public.pem', { encoding: 'utf-8', })) + expect(fs.readFileSync('./keys/key_public.pem', { encoding: 'utf-8' })) .toMatch(/^-----BEGIN PUBLIC KEY-----/); - fs.rmdirSync('./keys', { recursive: true, force: true, }); + fs.rmdirSync('./keys', { recursive: true, force: true }); }); test('generatePrivateKeyFile', () => { C.RSA.resetConfig(); C.RSA.generateKeyFile('private', 'pem', 'key'); - expect(fs.readFileSync('./keys/key.pem', { encoding: 'utf-8', })) + expect(fs.readFileSync('./keys/key.pem', { encoding: 'utf-8' })) .toMatch(/^-----BEGIN PRIVATE KEY-----/); - fs.rmdirSync('./keys', { recursive: true, force: true, }); + fs.rmdirSync('./keys', { recursive: true, force: true }); }); test('generatePublicKeyFile', () => { C.RSA.resetConfig(); C.RSA.generateKeyFile('public', 'pem', 'key'); - expect(fs.readFileSync('./keys/key.pem', { encoding: 'utf-8', })) + expect(fs.readFileSync('./keys/key.pem', { encoding: 'utf-8' })) .toMatch(/^-----BEGIN PUBLIC KEY-----/); - fs.rmdirSync('./keys', { recursive: true, force: true, }); + fs.rmdirSync('./keys', { recursive: true, force: true }); }); test('getKeyTypeOfPrivateKey', () => { @@ -325,6 +325,6 @@ uwIDAQAB C.RSA.generateKeyFile('public'); C.RSA.updateRsaKey('./keys/key.pem', true); expect(C.RSA.getKeyType()).toBe('public'); - fs.rmdirSync('./keys', { recursive: true, force: true, }); + fs.rmdirSync('./keys', { recursive: true, force: true }); }); }); diff --git a/test/config.test.js b/test/config.test.js index 1d8fe7d..b803a10 100644 --- a/test/config.test.js +++ b/test/config.test.js @@ -26,21 +26,21 @@ describe('config-test', () => { test('testCustomKDFHasher', () => { //SHA1 - let encryptedSHA1 = C.AES.encrypt('Test', 'Pass', { salt: data.saltA, hasher: C.algo.SHA1}).toString(); - expect(C.AES.decrypt(encryptedSHA1, 'Pass', { hasher: C.algo.SHA1}).toString(C.enc.Utf8)).toBe('Test'); + let encryptedSHA1 = C.AES.encrypt('Test', 'Pass', { salt: data.saltA, hasher: C.algo.SHA1 }).toString(); + expect(C.AES.decrypt(encryptedSHA1, 'Pass', { hasher: C.algo.SHA1 }).toString(C.enc.Utf8)).toBe('Test'); //SHA256 - let encryptedSHA256 = C.AES.encrypt('Test', 'Pass', { salt: data.saltA, hasher: C.algo.SHA256}).toString(); - expect(C.AES.decrypt(encryptedSHA256, 'Pass', { hasher: C.algo.SHA256}).toString(C.enc.Utf8)).toBe('Test'); + let encryptedSHA256 = C.AES.encrypt('Test', 'Pass', { salt: data.saltA, hasher: C.algo.SHA256 }).toString(); + expect(C.AES.decrypt(encryptedSHA256, 'Pass', { hasher: C.algo.SHA256 }).toString(C.enc.Utf8)).toBe('Test'); //SHA512 - let encryptedSHA512 = C.AES.encrypt('Test', 'Pass', { salt: data.saltA, hasher: C.algo.SHA512}).toString(); - expect(C.AES.decrypt(encryptedSHA512, 'Pass', { hasher: C.algo.SHA512}).toString(C.enc.Utf8)).toBe('Test'); + let encryptedSHA512 = C.AES.encrypt('Test', 'Pass', { salt: data.saltA, hasher: C.algo.SHA512 }).toString(); + expect(C.AES.decrypt(encryptedSHA512, 'Pass', { hasher: C.algo.SHA512 }).toString(C.enc.Utf8)).toBe('Test'); //Default: MD5 let encryptedDefault = C.AES.encrypt('Test', 'Pass', { salt: data.saltA }).toString(); - let encryptedMD5 = C.AES.encrypt('Test', 'Pass', { salt: data.saltA, hasher: C.algo.MD5}).toString(); - expect(C.AES.decrypt(encryptedMD5, 'Pass', { hasher: C.algo.MD5}).toString(C.enc.Utf8)).toBe('Test'); + let encryptedMD5 = C.AES.encrypt('Test', 'Pass', { salt: data.saltA, hasher: C.algo.MD5 }).toString(); + expect(C.AES.decrypt(encryptedMD5, 'Pass', { hasher: C.algo.MD5 }).toString(C.enc.Utf8)).toBe('Test'); expect(encryptedMD5).toBe(encryptedDefault); //Different KDFHasher diff --git a/test/crypto-js-test/algo.aes.test.js b/test/crypto-js-test/algo.aes.test.js index 405bf48..4588195 100644 --- a/test/crypto-js-test/algo.aes.test.js +++ b/test/crypto-js-test/algo.aes.test.js @@ -16,103 +16,103 @@ const data3 = cryptoJs.enc.Hex.parse('bbccddeeff'); const data = cryptoJs.enc.Hex.parse('00112233445500112233445500112233445500112233445566778899aabbccddeeff'); test('testHelper', () => { - expect(cryptoJsWasm.algo.AES.createEncryptor(cryptoJsWasm.SHA256('key'), {iv: iv}).finalize('Test').toString()) - .toEqual(cryptoJs.algo.AES.createEncryptor(cryptoJs.SHA256('key'), {iv: iv}).finalize('Test').toString()); - expect(cryptoJsWasm.lib.SerializableCipher.encrypt(cryptoJsWasm.algo.AES, 'Test', cryptoJsWasm.SHA256('key'), {iv: iv}).toString()) - .toEqual(cryptoJs.lib.SerializableCipher.encrypt(cryptoJs.algo.AES, 'Test', cryptoJs.SHA256('key'), {iv: iv}).toString()); + expect(cryptoJsWasm.algo.AES.createEncryptor(cryptoJsWasm.SHA256('key'), { iv: iv }).finalize('Test').toString()) + .toEqual(cryptoJs.algo.AES.createEncryptor(cryptoJs.SHA256('key'), { iv: iv }).finalize('Test').toString()); + expect(cryptoJsWasm.lib.SerializableCipher.encrypt(cryptoJsWasm.algo.AES, 'Test', cryptoJsWasm.SHA256('key'), { iv: iv }).toString()) + .toEqual(cryptoJs.lib.SerializableCipher.encrypt(cryptoJs.algo.AES, 'Test', cryptoJs.SHA256('key'), { iv: iv }).toString()); }); test('testEncryptModeCBC', () => { - expect(cryptoJsWasm.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJsWasm.mode.CBC}).toString()) - .toEqual(cryptoJs.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJs.mode.CBC}).toString()); + expect(cryptoJsWasm.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJsWasm.mode.CBC }).toString()) + .toEqual(cryptoJs.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJs.mode.CBC }).toString()); }); test('testEncryptModeECB', () => { - expect(cryptoJsWasm.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJsWasm.mode.ECB}).toString()) - .toEqual(cryptoJs.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJs.mode.ECB}).toString()); + expect(cryptoJsWasm.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJsWasm.mode.ECB }).toString()) + .toEqual(cryptoJs.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJs.mode.ECB }).toString()); }); test('testEncryptModeCFB', () => { - expect(cryptoJsWasm.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJsWasm.mode.CFB}).toString()) - .toEqual(cryptoJs.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJs.mode.CFB}).toString()); + expect(cryptoJsWasm.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJsWasm.mode.CFB }).toString()) + .toEqual(cryptoJs.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJs.mode.CFB }).toString()); }); test('testEncryptModeOFB', () => { - expect(cryptoJsWasm.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJsWasm.mode.OFB}).toString()) - .toEqual(cryptoJs.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJs.mode.OFB}).toString()); + expect(cryptoJsWasm.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJsWasm.mode.OFB }).toString()) + .toEqual(cryptoJs.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJs.mode.OFB }).toString()); }); test('testEncryptModeCTR', () => { - expect(cryptoJsWasm.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJsWasm.mode.CTR}).toString()) - .toEqual(cryptoJs.AES.encrypt('Test', key256, {iv: iv, mode: cryptoJs.mode.CTR}).toString()); + expect(cryptoJsWasm.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJsWasm.mode.CTR }).toString()) + .toEqual(cryptoJs.AES.encrypt('Test', key256, { iv: iv, mode: cryptoJs.mode.CTR }).toString()); }); test('testDecryptModeCBC', () => { - const encrypted = cryptoJs.AES.encrypt('Test', 'key', {mode: cryptoJs.mode.CBC}).toString(); - expect(cryptoJs.AES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CBC}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CBC}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.AES.encrypt('Test', 'key', { mode: cryptoJs.mode.CBC }).toString(); + expect(cryptoJs.AES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CBC }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CBC }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeECB', () => { - const encrypted = cryptoJs.AES.encrypt('Test', 'key', {mode: cryptoJs.mode.ECB}).toString(); - expect(cryptoJs.AES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.ECB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.ECB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.AES.encrypt('Test', 'key', { mode: cryptoJs.mode.ECB }).toString(); + expect(cryptoJs.AES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.ECB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.ECB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeCFB', () => { - const encrypted = cryptoJs.AES.encrypt('Test', 'key', {mode: cryptoJs.mode.CFB}).toString(); - expect(cryptoJs.AES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CFB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CFB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.AES.encrypt('Test', 'key', { mode: cryptoJs.mode.CFB }).toString(); + expect(cryptoJs.AES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CFB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CFB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeOFB', () => { - const encrypted = cryptoJs.AES.encrypt('Test', 'key', {mode: cryptoJs.mode.OFB}).toString(); - expect(cryptoJs.AES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.OFB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.OFB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.AES.encrypt('Test', 'key', { mode: cryptoJs.mode.OFB }).toString(); + expect(cryptoJs.AES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.OFB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.OFB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeCTR', () => { - const encrypted = cryptoJs.AES.encrypt('Test', 'key', {mode: cryptoJs.mode.CTR}).toString(); - expect(cryptoJs.AES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CTR}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CTR}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.AES.encrypt('Test', 'key', { mode: cryptoJs.mode.CTR }).toString(); + expect(cryptoJs.AES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CTR }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.AES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CTR }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testEncryptKeySize128', () => { - expect(cryptoJsWasm.AES.encrypt('Test', key128, {iv: iv}).toString()) - .toEqual(cryptoJs.AES.encrypt('Test', key128, {iv: iv}).toString()); + expect(cryptoJsWasm.AES.encrypt('Test', key128, { iv: iv }).toString()) + .toEqual(cryptoJs.AES.encrypt('Test', key128, { iv: iv }).toString()); }); test('testEncryptKeySize192', () => { - expect(cryptoJsWasm.AES.encrypt('Test', key192, {iv: iv}).toString()) - .toEqual(cryptoJs.AES.encrypt('Test', key192, {iv: iv}).toString()); + expect(cryptoJsWasm.AES.encrypt('Test', key192, { iv: iv }).toString()) + .toEqual(cryptoJs.AES.encrypt('Test', key192, { iv: iv }).toString()); }); test('testEncryptKeySize256', () => { - expect(cryptoJsWasm.AES.encrypt('Test', key256, {iv: iv}).toString()) - .toEqual(cryptoJs.AES.encrypt('Test', key256, {iv: iv}).toString()); + expect(cryptoJsWasm.AES.encrypt('Test', key256, { iv: iv }).toString()) + .toEqual(cryptoJs.AES.encrypt('Test', key256, { iv: iv }).toString()); }); test('testDecryptKeySize128', () => { - const encrypted = cryptoJs.AES.encrypt('Test', key128, {iv: iv}).toString(); - expect(cryptoJs.AES.decrypt(encrypted, key128, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.AES.decrypt(encrypted, key128, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.AES.encrypt('Test', key128, { iv: iv }).toString(); + expect(cryptoJs.AES.decrypt(encrypted, key128, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.AES.decrypt(encrypted, key128, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptKeySize192', () => { - const encrypted = cryptoJs.AES.encrypt('Test', key192, {iv: iv}).toString(); - expect(cryptoJs.AES.decrypt(encrypted, key192, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.AES.decrypt(encrypted, key192, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.AES.encrypt('Test', key192, { iv: iv }).toString(); + expect(cryptoJs.AES.decrypt(encrypted, key192, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.AES.decrypt(encrypted, key192, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptKeySize256', () => { - const encrypted = cryptoJs.AES.encrypt('Test', key256, {iv: iv}).toString(); - expect(cryptoJs.AES.decrypt(encrypted, key256, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.AES.decrypt(encrypted, key256, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.AES.encrypt('Test', key256, { iv: iv }).toString(); + expect(cryptoJs.AES.decrypt(encrypted, key256, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.AES.decrypt(encrypted, key256, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testMultiPart', () => { - let aes = cryptoJs.algo.AES.createEncryptor(key128, {iv: iv}); - let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, {iv: iv}); + let aes = cryptoJs.algo.AES.createEncryptor(key128, { iv: iv }); + let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, { iv: iv }); let ciphertext1 = aes.process(data1); let ciphertext2 = aes.process(data2); let ciphertext3 = aes.process(data3); @@ -129,14 +129,14 @@ test('testMultiPart', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.AES.encrypt(data, - key128, {iv: iv}).toString()); + key128, { iv: iv }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.AES.encrypt(data, - key128, {iv: iv}).toString()); + key128, { iv: iv }).toString()); }); test('testMultiPartECB', () => { - let aes = cryptoJs.algo.AES.createEncryptor(key128, {mode: cryptoJs.mode.ECB}); - let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, {mode: cryptoJsWasm.mode.ECB}); + let aes = cryptoJs.algo.AES.createEncryptor(key128, { mode: cryptoJs.mode.ECB }); + let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, { mode: cryptoJsWasm.mode.ECB }); let ciphertext1 = aes.process(data1); let ciphertext2 = aes.process(data2); let ciphertext3 = aes.process(data3); @@ -153,14 +153,14 @@ test('testMultiPartECB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.AES.encrypt(data, - key128, {mode: cryptoJs.mode.ECB}).toString()); + key128, { mode: cryptoJs.mode.ECB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.AES.encrypt(data, - key128, {mode: cryptoJsWasm.mode.ECB}).toString()); + key128, { mode: cryptoJsWasm.mode.ECB }).toString()); }); test('testMultiPartCFB', () => { - let aes = cryptoJs.algo.AES.createEncryptor(key128, {iv: iv, mode: cryptoJs.mode.CFB}); - let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, {iv: iv, mode: cryptoJsWasm.mode.CFB}); + let aes = cryptoJs.algo.AES.createEncryptor(key128, { iv: iv, mode: cryptoJs.mode.CFB }); + let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, { iv: iv, mode: cryptoJsWasm.mode.CFB }); let ciphertext1 = aes.process(data1); let ciphertext2 = aes.process(data2); let ciphertext3 = aes.process(data3); @@ -177,14 +177,14 @@ test('testMultiPartCFB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.AES.encrypt(data, - key128, {iv: iv, mode: cryptoJs.mode.CFB}).toString()); + key128, { iv: iv, mode: cryptoJs.mode.CFB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.AES.encrypt(data, - key128, {iv: iv, mode: cryptoJsWasm.mode.CFB}).toString()); + key128, { iv: iv, mode: cryptoJsWasm.mode.CFB }).toString()); }); test('testMultiPartOFB', () => { - let aes = cryptoJs.algo.AES.createEncryptor(key128, {iv: iv, mode: cryptoJs.mode.OFB}); - let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, {iv: iv, mode: cryptoJsWasm.mode.OFB}); + let aes = cryptoJs.algo.AES.createEncryptor(key128, { iv: iv, mode: cryptoJs.mode.OFB }); + let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, { iv: iv, mode: cryptoJsWasm.mode.OFB }); let ciphertext1 = aes.process(data1); let ciphertext2 = aes.process(data2); let ciphertext3 = aes.process(data3); @@ -201,14 +201,14 @@ test('testMultiPartOFB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.AES.encrypt(data, - key128, {iv: iv, mode: cryptoJs.mode.OFB}).toString()); + key128, { iv: iv, mode: cryptoJs.mode.OFB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.AES.encrypt(data, - key128, {iv: iv, mode: cryptoJsWasm.mode.OFB}).toString()); + key128, { iv: iv, mode: cryptoJsWasm.mode.OFB }).toString()); }); test('testMultiPartCTR', () => { - let aes = cryptoJs.algo.AES.createEncryptor(key128, {iv: iv, mode: cryptoJs.mode.CTR}); - let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, {iv: iv, mode: cryptoJsWasm.mode.CTR}); + let aes = cryptoJs.algo.AES.createEncryptor(key128, { iv: iv, mode: cryptoJs.mode.CTR }); + let aesWasm = cryptoJsWasm.algo.AES.createEncryptor(key128, { iv: iv, mode: cryptoJsWasm.mode.CTR }); let ciphertext1 = aes.process(data1); let ciphertext2 = aes.process(data2); let ciphertext3 = aes.process(data3); @@ -225,7 +225,7 @@ test('testMultiPartCTR', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.AES.encrypt(data, - key128, {iv: iv, mode: cryptoJs.mode.CTR}).toString()); + key128, { iv: iv, mode: cryptoJs.mode.CTR }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.AES.encrypt(data, - key128, {iv: iv, mode: cryptoJsWasm.mode.CTR}).toString()); + key128, { iv: iv, mode: cryptoJsWasm.mode.CTR }).toString()); }); \ No newline at end of file diff --git a/test/crypto-js-test/algo.des.test.js b/test/crypto-js-test/algo.des.test.js index 84c7e68..1ab7dd5 100644 --- a/test/crypto-js-test/algo.des.test.js +++ b/test/crypto-js-test/algo.des.test.js @@ -15,111 +15,111 @@ const data3 = cryptoJs.enc.Hex.parse('bbccddeeff'); const data = cryptoJs.enc.Hex.parse('00112233445566778899aabbccddeeff'); test('testHelper', () => { - expect(cryptoJsWasm.algo.DES.createEncryptor(key64, {iv: iv}).finalize('Test').toString()) - .toEqual(cryptoJs.algo.DES.createEncryptor(key64, {iv: iv}).finalize('Test').toString()); - expect(cryptoJsWasm.lib.SerializableCipher.encrypt(cryptoJsWasm.algo.DES, 'Test', key64, {iv: iv}).toString()) - .toEqual(cryptoJs.lib.SerializableCipher.encrypt(cryptoJs.algo.DES, 'Test', key64, {iv: iv}).toString()); + expect(cryptoJsWasm.algo.DES.createEncryptor(key64, { iv: iv }).finalize('Test').toString()) + .toEqual(cryptoJs.algo.DES.createEncryptor(key64, { iv: iv }).finalize('Test').toString()); + expect(cryptoJsWasm.lib.SerializableCipher.encrypt(cryptoJsWasm.algo.DES, 'Test', key64, { iv: iv }).toString()) + .toEqual(cryptoJs.lib.SerializableCipher.encrypt(cryptoJs.algo.DES, 'Test', key64, { iv: iv }).toString()); }); test('testEncryptModeCBC', () => { - expect(cryptoJsWasm.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJsWasm.mode.CBC}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJs.mode.CBC}).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJsWasm.mode.CBC }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJs.mode.CBC }).toString()); }); test('testEncryptModeECB', () => { - expect(cryptoJsWasm.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJsWasm.mode.ECB}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJs.mode.ECB}).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJsWasm.mode.ECB }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJs.mode.ECB }).toString()); }); test('testEncryptModeCFB', () => { - expect(cryptoJsWasm.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJsWasm.mode.CFB}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJs.mode.CFB}).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJsWasm.mode.CFB }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJs.mode.CFB }).toString()); }); test('testEncryptModeOFB', () => { - expect(cryptoJsWasm.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJsWasm.mode.OFB}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJs.mode.OFB}).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJsWasm.mode.OFB }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJs.mode.OFB }).toString()); }); test('testEncryptModeCTR', () => { - expect(cryptoJsWasm.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJsWasm.mode.CTR}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key64, {iv: iv, mode: cryptoJs.mode.CTR}).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJsWasm.mode.CTR }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key64, { iv: iv, mode: cryptoJs.mode.CTR }).toString()); }); test('testDecryptModeCBC', () => { - const encrypted = cryptoJs.DES.encrypt('Test', 'key', {mode: cryptoJs.mode.CBC}).toString(); - expect(cryptoJs.DES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CBC}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CBC}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.DES.encrypt('Test', 'key', { mode: cryptoJs.mode.CBC }).toString(); + expect(cryptoJs.DES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CBC }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CBC }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeECB', () => { - const encrypted = cryptoJs.DES.encrypt('Test', 'key', {mode: cryptoJs.mode.ECB}).toString(); - expect(cryptoJs.DES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.ECB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.ECB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.DES.encrypt('Test', 'key', { mode: cryptoJs.mode.ECB }).toString(); + expect(cryptoJs.DES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.ECB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.ECB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeCFB', () => { - const encrypted = cryptoJs.DES.encrypt('Test', 'key', {mode: cryptoJs.mode.CFB}).toString(); - expect(cryptoJs.DES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CFB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CFB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.DES.encrypt('Test', 'key', { mode: cryptoJs.mode.CFB }).toString(); + expect(cryptoJs.DES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CFB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CFB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeOFB', () => { - const encrypted = cryptoJs.DES.encrypt('Test', 'key', {mode: cryptoJs.mode.OFB}).toString(); - expect(cryptoJs.DES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.OFB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.OFB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.DES.encrypt('Test', 'key', { mode: cryptoJs.mode.OFB }).toString(); + expect(cryptoJs.DES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.OFB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.OFB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeCTR', () => { - const encrypted = cryptoJs.DES.encrypt('Test', 'key', {mode: cryptoJs.mode.CTR}).toString(); - expect(cryptoJs.DES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CTR}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CTR}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.DES.encrypt('Test', 'key', { mode: cryptoJs.mode.CTR }).toString(); + expect(cryptoJs.DES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CTR }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CTR }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testEncryptKeySize64', () => { - expect(cryptoJsWasm.DES.encrypt('Test', key64, {iv: iv}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key64, {iv: iv}).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key64, { iv: iv }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key64, { iv: iv }).toString()); }); test('testEncryptKeySize128', () => { - expect(cryptoJsWasm.DES.encrypt('Test', key128, {iv: iv}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key128, {iv: iv}).toString()); - expect(cryptoJsWasm.DES.encrypt('Test', key128, {iv: iv}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key64, {iv: iv}).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key128, { iv: iv }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key128, { iv: iv }).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key128, { iv: iv }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key64, { iv: iv }).toString()); }); test('testEncryptKeySize256', () => { - expect(cryptoJsWasm.DES.encrypt('Test', key256, {iv: iv}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key256, {iv: iv}).toString()); - expect(cryptoJsWasm.DES.encrypt('Test', key256, {iv: iv}).toString()) - .toEqual(cryptoJs.DES.encrypt('Test', key64, {iv: iv}).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key256, { iv: iv }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key256, { iv: iv }).toString()); + expect(cryptoJsWasm.DES.encrypt('Test', key256, { iv: iv }).toString()) + .toEqual(cryptoJs.DES.encrypt('Test', key64, { iv: iv }).toString()); }); test('testDecryptKeySize64', () => { - const encrypted = cryptoJs.DES.encrypt('Test', key64, {iv: iv}).toString(); - expect(cryptoJs.DES.decrypt(encrypted, key64, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, key64, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.DES.encrypt('Test', key64, { iv: iv }).toString(); + expect(cryptoJs.DES.decrypt(encrypted, key64, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, key64, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptKeySize128', () => { - const encrypted = cryptoJs.DES.encrypt('Test', key128, {iv: iv}).toString(); - expect(cryptoJs.DES.decrypt(encrypted, key128, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, key128, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); - expect(cryptoJs.DES.decrypt(encrypted, key64, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, key64, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.DES.encrypt('Test', key128, { iv: iv }).toString(); + expect(cryptoJs.DES.decrypt(encrypted, key128, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, key128, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + expect(cryptoJs.DES.decrypt(encrypted, key64, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, key64, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptKeySize256', () => { - const encrypted = cryptoJs.DES.encrypt('Test', key256, {iv: iv}).toString(); - expect(cryptoJs.DES.decrypt(encrypted, key256, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, key256, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); - expect(cryptoJs.DES.decrypt(encrypted, key64, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.DES.decrypt(encrypted, key64, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.DES.encrypt('Test', key256, { iv: iv }).toString(); + expect(cryptoJs.DES.decrypt(encrypted, key256, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, key256, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + expect(cryptoJs.DES.decrypt(encrypted, key64, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.DES.decrypt(encrypted, key64, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testMultiPart', () => { - let DES = cryptoJs.algo.DES.createEncryptor(key64, {iv: iv}); - let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, {iv: iv}); + let DES = cryptoJs.algo.DES.createEncryptor(key64, { iv: iv }); + let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, { iv: iv }); let ciphertext1 = DES.process(data1); let ciphertext2 = DES.process(data2); let ciphertext3 = DES.process(data3); @@ -136,14 +136,14 @@ test('testMultiPart', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.DES.encrypt(data, - key64, {iv: iv}).toString()); + key64, { iv: iv }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.DES.encrypt(data, - key64, {iv: iv}).toString()); + key64, { iv: iv }).toString()); }); test('testMultiPartECB', () => { - let DES = cryptoJs.algo.DES.createEncryptor(key64, {iv: iv, mode: cryptoJs.mode.ECB}); - let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, {iv: iv, mode: cryptoJsWasm.mode.ECB}); + let DES = cryptoJs.algo.DES.createEncryptor(key64, { iv: iv, mode: cryptoJs.mode.ECB }); + let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, { iv: iv, mode: cryptoJsWasm.mode.ECB }); let ciphertext1 = DES.process(data1); let ciphertext2 = DES.process(data2); let ciphertext3 = DES.process(data3); @@ -160,14 +160,14 @@ test('testMultiPartECB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.DES.encrypt(data, - key64, {mode: cryptoJs.mode.ECB}).toString()); + key64, { mode: cryptoJs.mode.ECB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.DES.encrypt(data, - key64, {mode: cryptoJsWasm.mode.ECB}).toString()); + key64, { mode: cryptoJsWasm.mode.ECB }).toString()); }); test('testMultiPartCFB', () => { - let DES = cryptoJs.algo.DES.createEncryptor(key64, {iv: iv, mode: cryptoJs.mode.CFB}); - let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, {iv: iv, mode: cryptoJsWasm.mode.CFB}); + let DES = cryptoJs.algo.DES.createEncryptor(key64, { iv: iv, mode: cryptoJs.mode.CFB }); + let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, { iv: iv, mode: cryptoJsWasm.mode.CFB }); let ciphertext1 = DES.process(data1); let ciphertext2 = DES.process(data2); let ciphertext3 = DES.process(data3); @@ -184,14 +184,14 @@ test('testMultiPartCFB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.DES.encrypt(data, - key64, {iv: iv, mode: cryptoJs.mode.CFB}).toString()); + key64, { iv: iv, mode: cryptoJs.mode.CFB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.DES.encrypt(data, - key64, {iv: iv, mode: cryptoJsWasm.mode.CFB}).toString()); + key64, { iv: iv, mode: cryptoJsWasm.mode.CFB }).toString()); }); test('testMultiPartOFB', () => { - let DES = cryptoJs.algo.DES.createEncryptor(key64, {iv: iv, mode: cryptoJs.mode.OFB}); - let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, {iv: iv, mode: cryptoJsWasm.mode.OFB}); + let DES = cryptoJs.algo.DES.createEncryptor(key64, { iv: iv, mode: cryptoJs.mode.OFB }); + let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, { iv: iv, mode: cryptoJsWasm.mode.OFB }); let ciphertext1 = DES.process(data1); let ciphertext2 = DES.process(data2); let ciphertext3 = DES.process(data3); @@ -208,14 +208,14 @@ test('testMultiPartOFB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.DES.encrypt(data, - key64, {iv: iv, mode: cryptoJs.mode.OFB}).toString()); + key64, { iv: iv, mode: cryptoJs.mode.OFB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.DES.encrypt(data, - key64, {iv: iv, mode: cryptoJsWasm.mode.OFB}).toString()); + key64, { iv: iv, mode: cryptoJsWasm.mode.OFB }).toString()); }); test('testMultiPartCTR', () => { - let DES = cryptoJs.algo.DES.createEncryptor(key64, {iv: iv, mode: cryptoJs.mode.CTR}); - let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, {iv: iv, mode: cryptoJsWasm.mode.CTR}); + let DES = cryptoJs.algo.DES.createEncryptor(key64, { iv: iv, mode: cryptoJs.mode.CTR }); + let DESWasm = cryptoJsWasm.algo.DES.createEncryptor(key64, { iv: iv, mode: cryptoJsWasm.mode.CTR }); let ciphertext1 = DES.process(data1); let ciphertext2 = DES.process(data2); let ciphertext3 = DES.process(data3); @@ -232,7 +232,7 @@ test('testMultiPartCTR', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.DES.encrypt(data, - key64, {iv: iv, mode: cryptoJs.mode.CTR}).toString()); + key64, { iv: iv, mode: cryptoJs.mode.CTR }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.DES.encrypt(data, - key64, {iv: iv, mode: cryptoJsWasm.mode.CTR}).toString()); + key64, { iv: iv, mode: cryptoJsWasm.mode.CTR }).toString()); }); \ No newline at end of file diff --git a/test/crypto-js-test/algo.rabbit-legacy.test.js b/test/crypto-js-test/algo.rabbit-legacy.test.js index 1f07000..d466482 100644 --- a/test/crypto-js-test/algo.rabbit-legacy.test.js +++ b/test/crypto-js-test/algo.rabbit-legacy.test.js @@ -21,21 +21,21 @@ test('testHelper', () => { test('testEncrypt', () => { expect(cryptoJsWasm.RabbitLegacy.encrypt('Test', cryptoJsWasm.SHA256('key')).toString()).toEqual(cryptoJs.RabbitLegacy.encrypt('Test', cryptoJs.SHA256('key')).toString()); - expect(cryptoJsWasm.RabbitLegacy.encrypt('Test', cryptoJsWasm.SHA256('key'), {iv: iv}).toString()).toEqual(cryptoJs.RabbitLegacy.encrypt('Test', cryptoJs.SHA256('key'), {iv: iv}).toString()); + expect(cryptoJsWasm.RabbitLegacy.encrypt('Test', cryptoJsWasm.SHA256('key'), { iv: iv }).toString()).toEqual(cryptoJs.RabbitLegacy.encrypt('Test', cryptoJs.SHA256('key'), { iv: iv }).toString()); }); test('testDecrypt', () => { const encrypted = cryptoJs.RabbitLegacy.encrypt('Test', 'key').toString(); expect(cryptoJs.RabbitLegacy.decrypt(encrypted, 'key').toString(cryptoJs.enc.Utf8)).toEqual('Test'); expect(cryptoJsWasm.RabbitLegacy.decrypt(encrypted, 'key').toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); - const encryptedWithIv = cryptoJs.RabbitLegacy.encrypt('Test', 'key', {iv: iv}).toString(); + const encryptedWithIv = cryptoJs.RabbitLegacy.encrypt('Test', 'key', { iv: iv }).toString(); expect(cryptoJs.RabbitLegacy.decrypt(encryptedWithIv, 'key').toString(cryptoJs.enc.Utf8)).toEqual('Test'); expect(cryptoJsWasm.RabbitLegacy.decrypt(encryptedWithIv, 'key').toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testMultiPart', () => { - let rabbit = cryptoJs.algo.RabbitLegacy.createEncryptor(cryptoJs.SHA256('key'), {iv: iv}); - let rabbitWasm = cryptoJsWasm.algo.RabbitLegacy.createEncryptor(cryptoJsWasm.SHA256('key'), {iv: iv}); + let rabbit = cryptoJs.algo.RabbitLegacy.createEncryptor(cryptoJs.SHA256('key'), { iv: iv }); + let rabbitWasm = cryptoJsWasm.algo.RabbitLegacy.createEncryptor(cryptoJsWasm.SHA256('key'), { iv: iv }); let ciphertext1 = rabbit.process(data1); let ciphertext2 = rabbit.process(data2); let ciphertext3 = rabbit.process(data3); @@ -51,6 +51,6 @@ test('testMultiPart', () => { expect(ciphertext3.toString()).toEqual(ciphertextWasm3.toString()); expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); - expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.RabbitLegacy.encrypt(data, cryptoJs.SHA256('key'), {iv: iv}).toString()); - expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.RabbitLegacy.encrypt(data, cryptoJsWasm.SHA256('key'), {iv: iv}).toString()); + expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.RabbitLegacy.encrypt(data, cryptoJs.SHA256('key'), { iv: iv }).toString()); + expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.RabbitLegacy.encrypt(data, cryptoJsWasm.SHA256('key'), { iv: iv }).toString()); }); \ No newline at end of file diff --git a/test/crypto-js-test/algo.rabbit.test.js b/test/crypto-js-test/algo.rabbit.test.js index 33cfae2..0a8d887 100644 --- a/test/crypto-js-test/algo.rabbit.test.js +++ b/test/crypto-js-test/algo.rabbit.test.js @@ -21,21 +21,21 @@ test('testHelper', () => { test('testEncrypt', () => { expect(cryptoJsWasm.Rabbit.encrypt('Test', cryptoJsWasm.SHA256('key')).toString()).toEqual(cryptoJs.Rabbit.encrypt('Test', cryptoJs.SHA256('key')).toString()); - expect(cryptoJsWasm.Rabbit.encrypt('Test', cryptoJsWasm.SHA256('key'), {iv: iv}).toString()).toEqual(cryptoJs.Rabbit.encrypt('Test', cryptoJs.SHA256('key'), {iv: iv}).toString()); + expect(cryptoJsWasm.Rabbit.encrypt('Test', cryptoJsWasm.SHA256('key'), { iv: iv }).toString()).toEqual(cryptoJs.Rabbit.encrypt('Test', cryptoJs.SHA256('key'), { iv: iv }).toString()); }); test('testDecrypt', () => { const encrypted = cryptoJs.Rabbit.encrypt('Test', 'key').toString(); expect(cryptoJs.Rabbit.decrypt(encrypted, 'key').toString(cryptoJs.enc.Utf8)).toEqual('Test'); expect(cryptoJsWasm.Rabbit.decrypt(encrypted, 'key').toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); - const encryptedWithIv = cryptoJs.Rabbit.encrypt('Test', 'key', {iv: iv}).toString(); + const encryptedWithIv = cryptoJs.Rabbit.encrypt('Test', 'key', { iv: iv }).toString(); expect(cryptoJs.Rabbit.decrypt(encryptedWithIv, 'key').toString(cryptoJs.enc.Utf8)).toEqual('Test'); expect(cryptoJsWasm.Rabbit.decrypt(encryptedWithIv, 'key').toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testMultiPart', () => { - let rabbit = cryptoJs.algo.Rabbit.createEncryptor(cryptoJs.SHA256('key'), {iv: iv}); - let rabbitWasm = cryptoJsWasm.algo.Rabbit.createEncryptor(cryptoJsWasm.SHA256('key'), {iv: iv}); + let rabbit = cryptoJs.algo.Rabbit.createEncryptor(cryptoJs.SHA256('key'), { iv: iv }); + let rabbitWasm = cryptoJsWasm.algo.Rabbit.createEncryptor(cryptoJsWasm.SHA256('key'), { iv: iv }); let ciphertext1 = rabbit.process(data1); let ciphertext2 = rabbit.process(data2); let ciphertext3 = rabbit.process(data3); @@ -51,6 +51,6 @@ test('testMultiPart', () => { expect(ciphertext3.toString()).toEqual(ciphertextWasm3.toString()); expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); - expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.Rabbit.encrypt(data, cryptoJs.SHA256('key'), {iv: iv}).toString()); - expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.Rabbit.encrypt(data, cryptoJsWasm.SHA256('key'), {iv: iv}).toString()); + expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.Rabbit.encrypt(data, cryptoJs.SHA256('key'), { iv: iv }).toString()); + expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.Rabbit.encrypt(data, cryptoJsWasm.SHA256('key'), { iv: iv }).toString()); }); \ No newline at end of file diff --git a/test/crypto-js-test/algo.tripledes.test.js b/test/crypto-js-test/algo.tripledes.test.js index 786a637..28c5fec 100644 --- a/test/crypto-js-test/algo.tripledes.test.js +++ b/test/crypto-js-test/algo.tripledes.test.js @@ -16,121 +16,121 @@ const data3 = cryptoJs.enc.Hex.parse('bbccddeeff'); const data = cryptoJs.enc.Hex.parse('00112233445566778899aabbccddeeff'); test('testHelper', () => { - expect(cryptoJsWasm.algo.TripleDES.createEncryptor(key, {iv: iv}).finalize('Test').toString()) - .toEqual(cryptoJs.algo.TripleDES.createEncryptor(key, {iv: iv}).finalize('Test').toString()); - expect(cryptoJsWasm.lib.SerializableCipher.encrypt(cryptoJsWasm.algo.TripleDES, 'Test', key, {iv: iv}).toString()) - .toEqual(cryptoJs.lib.SerializableCipher.encrypt(cryptoJs.algo.TripleDES, 'Test', key, {iv: iv}).toString()); + expect(cryptoJsWasm.algo.TripleDES.createEncryptor(key, { iv: iv }).finalize('Test').toString()) + .toEqual(cryptoJs.algo.TripleDES.createEncryptor(key, { iv: iv }).finalize('Test').toString()); + expect(cryptoJsWasm.lib.SerializableCipher.encrypt(cryptoJsWasm.algo.TripleDES, 'Test', key, { iv: iv }).toString()) + .toEqual(cryptoJs.lib.SerializableCipher.encrypt(cryptoJs.algo.TripleDES, 'Test', key, { iv: iv }).toString()); }); test('testEncryptModeCBC', () => { - expect(cryptoJsWasm.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJsWasm.mode.CBC}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJs.mode.CBC}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJsWasm.mode.CBC }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJs.mode.CBC }).toString()); }); test('testEncryptModeECB', () => { - expect(cryptoJsWasm.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJsWasm.mode.ECB}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJs.mode.ECB}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJsWasm.mode.ECB }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJs.mode.ECB }).toString()); }); test('testEncryptModeCFB', () => { - expect(cryptoJsWasm.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJsWasm.mode.CFB}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJs.mode.CFB}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJsWasm.mode.CFB }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJs.mode.CFB }).toString()); }); test('testEncryptModeOFB', () => { - expect(cryptoJsWasm.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJsWasm.mode.OFB}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJs.mode.OFB}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJsWasm.mode.OFB }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJs.mode.OFB }).toString()); }); test('testEncryptModeCTR', () => { - expect(cryptoJsWasm.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJsWasm.mode.CTR}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', key, {iv: iv, mode: cryptoJs.mode.CTR}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJsWasm.mode.CTR }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', key, { iv: iv, mode: cryptoJs.mode.CTR }).toString()); }); test('testDecryptModeCBC', () => { - const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', {mode: cryptoJs.mode.CBC}).toString(); - expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CBC}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CBC}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', { mode: cryptoJs.mode.CBC }).toString(); + expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CBC }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CBC }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeECB', () => { - const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', {mode: cryptoJs.mode.ECB}).toString(); - expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.ECB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.ECB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', { mode: cryptoJs.mode.ECB }).toString(); + expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.ECB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.ECB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeCFB', () => { - const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', {mode: cryptoJs.mode.CFB}).toString(); - expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CFB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CFB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', { mode: cryptoJs.mode.CFB }).toString(); + expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CFB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CFB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeOFB', () => { - const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', {mode: cryptoJs.mode.OFB}).toString(); - expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.OFB}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.OFB}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', { mode: cryptoJs.mode.OFB }).toString(); + expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.OFB }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.OFB }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptModeCTR', () => { - const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', {mode: cryptoJs.mode.CTR}).toString(); - expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJs.mode.CTR}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', {mode: cryptoJsWasm.mode.CTR}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.TripleDES.encrypt('Test', 'key', { mode: cryptoJs.mode.CTR }).toString(); + expect(cryptoJs.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJs.mode.CTR }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, 'key', { mode: cryptoJsWasm.mode.CTR }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testEncryptKeySize64', () => { - expect(cryptoJsWasm.TripleDES.encrypt('Test', key64, {iv: iv}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', key64, {iv: iv}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key64, { iv: iv }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', key64, { iv: iv }).toString()); const extendedKey = cryptoJs.enc.Hex.parse('001122334455667700112233445566770011223344556677'); - expect(cryptoJsWasm.TripleDES.encrypt('Test', key64, {iv: iv}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', extendedKey, {iv: iv}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key64, { iv: iv }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', extendedKey, { iv: iv }).toString()); }); test('testEncryptKeySize128', () => { - expect(cryptoJsWasm.TripleDES.encrypt('Test', key128, {iv: iv}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', key128, {iv: iv}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key128, { iv: iv }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', key128, { iv: iv }).toString()); const extendedKey = cryptoJs.enc.Hex.parse('000102030405060708090a0b0c0d0e0f0001020304050607'); - expect(cryptoJsWasm.TripleDES.encrypt('Test', key128, {iv: iv}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', extendedKey, {iv: iv}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key128, { iv: iv }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', extendedKey, { iv: iv }).toString()); }); test('testEncryptKeySize256', () => { - expect(cryptoJsWasm.TripleDES.encrypt('Test', key256, {iv: iv}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', key256, {iv: iv}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key256, { iv: iv }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', key256, { iv: iv }).toString()); const truncatedKey = cryptoJs.enc.Hex.parse('000102030405060708090a0b0c0d0e0f1011121314151617'); - expect(cryptoJsWasm.TripleDES.encrypt('Test', key256, {iv: iv}).toString()) - .toEqual(cryptoJs.TripleDES.encrypt('Test', truncatedKey, {iv: iv}).toString()); + expect(cryptoJsWasm.TripleDES.encrypt('Test', key256, { iv: iv }).toString()) + .toEqual(cryptoJs.TripleDES.encrypt('Test', truncatedKey, { iv: iv }).toString()); }); test('testDecryptKeySize64', () => { - const encrypted = cryptoJs.TripleDES.encrypt('Test', key64, {iv: iv}).toString(); - expect(cryptoJs.TripleDES.decrypt(encrypted, key64, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, key64, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.TripleDES.encrypt('Test', key64, { iv: iv }).toString(); + expect(cryptoJs.TripleDES.decrypt(encrypted, key64, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, key64, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); const extendedKey = cryptoJs.enc.Hex.parse('001122334455667700112233445566770011223344556677'); - expect(cryptoJs.TripleDES.decrypt(encrypted, extendedKey, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, extendedKey, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + expect(cryptoJs.TripleDES.decrypt(encrypted, extendedKey, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, extendedKey, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptKeySize128', () => { - const encrypted = cryptoJs.TripleDES.encrypt('Test', key128, {iv: iv}).toString(); - expect(cryptoJs.TripleDES.decrypt(encrypted, key128, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, key128, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.TripleDES.encrypt('Test', key128, { iv: iv }).toString(); + expect(cryptoJs.TripleDES.decrypt(encrypted, key128, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, key128, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); const extendedKey = cryptoJs.enc.Hex.parse('000102030405060708090a0b0c0d0e0f0001020304050607'); - expect(cryptoJs.TripleDES.decrypt(encrypted, extendedKey, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, extendedKey, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + expect(cryptoJs.TripleDES.decrypt(encrypted, extendedKey, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, extendedKey, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testDecryptKeySize256', () => { - const encrypted = cryptoJs.TripleDES.encrypt('Test', key256, {iv: iv}).toString(); - expect(cryptoJs.TripleDES.decrypt(encrypted, key256, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, key256, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + const encrypted = cryptoJs.TripleDES.encrypt('Test', key256, { iv: iv }).toString(); + expect(cryptoJs.TripleDES.decrypt(encrypted, key256, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, key256, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); const truncatedKey = cryptoJs.enc.Hex.parse('000102030405060708090a0b0c0d0e0f1011121314151617'); - expect(cryptoJs.TripleDES.decrypt(encrypted, truncatedKey, {iv: iv}).toString(cryptoJs.enc.Utf8)).toEqual('Test'); - expect(cryptoJsWasm.TripleDES.decrypt(encrypted, truncatedKey, {iv: iv}).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); + expect(cryptoJs.TripleDES.decrypt(encrypted, truncatedKey, { iv: iv }).toString(cryptoJs.enc.Utf8)).toEqual('Test'); + expect(cryptoJsWasm.TripleDES.decrypt(encrypted, truncatedKey, { iv: iv }).toString(cryptoJsWasm.enc.Utf8)).toEqual('Test'); }); test('testMultiPart', () => { - let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, {iv: iv}); - let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, {iv: iv}); + let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, { iv: iv }); + let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, { iv: iv }); let ciphertext1 = TripleDES.process(data1); let ciphertext2 = TripleDES.process(data2); let ciphertext3 = TripleDES.process(data3); @@ -147,14 +147,14 @@ test('testMultiPart', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.TripleDES.encrypt(data, - key, {iv: iv}).toString()); + key, { iv: iv }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.TripleDES.encrypt(data, - key, {iv: iv}).toString()); + key, { iv: iv }).toString()); }); test('testMultiPartECB', () => { - let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, {iv: iv, mode: cryptoJs.mode.ECB}); - let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, {iv: iv, mode: cryptoJsWasm.mode.ECB}); + let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, { iv: iv, mode: cryptoJs.mode.ECB }); + let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, { iv: iv, mode: cryptoJsWasm.mode.ECB }); let ciphertext1 = TripleDES.process(data1); let ciphertext2 = TripleDES.process(data2); let ciphertext3 = TripleDES.process(data3); @@ -171,14 +171,14 @@ test('testMultiPartECB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.TripleDES.encrypt(data, - key, {mode: cryptoJs.mode.ECB}).toString()); + key, { mode: cryptoJs.mode.ECB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.TripleDES.encrypt(data, - key, {mode: cryptoJsWasm.mode.ECB}).toString()); + key, { mode: cryptoJsWasm.mode.ECB }).toString()); }); test('testMultiPartCFB', () => { - let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, {iv: iv, mode: cryptoJs.mode.CFB}); - let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, {iv: iv, mode: cryptoJsWasm.mode.CFB}); + let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, { iv: iv, mode: cryptoJs.mode.CFB }); + let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, { iv: iv, mode: cryptoJsWasm.mode.CFB }); let ciphertext1 = TripleDES.process(data1); let ciphertext2 = TripleDES.process(data2); let ciphertext3 = TripleDES.process(data3); @@ -195,14 +195,14 @@ test('testMultiPartCFB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.TripleDES.encrypt(data, - key, {iv: iv, mode: cryptoJs.mode.CFB}).toString()); + key, { iv: iv, mode: cryptoJs.mode.CFB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.TripleDES.encrypt(data, - key, {iv: iv, mode: cryptoJsWasm.mode.CFB}).toString()); + key, { iv: iv, mode: cryptoJsWasm.mode.CFB }).toString()); }); test('testMultiPartOFB', () => { - let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, {iv: iv, mode: cryptoJs.mode.OFB}); - let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, {iv: iv, mode: cryptoJsWasm.mode.OFB}); + let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, { iv: iv, mode: cryptoJs.mode.OFB }); + let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, { iv: iv, mode: cryptoJsWasm.mode.OFB }); let ciphertext1 = TripleDES.process(data1); let ciphertext2 = TripleDES.process(data2); let ciphertext3 = TripleDES.process(data3); @@ -219,14 +219,14 @@ test('testMultiPartOFB', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.TripleDES.encrypt(data, - key, {iv: iv, mode: cryptoJs.mode.OFB}).toString()); + key, { iv: iv, mode: cryptoJs.mode.OFB }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.TripleDES.encrypt(data, - key, {iv: iv, mode: cryptoJsWasm.mode.OFB}).toString()); + key, { iv: iv, mode: cryptoJsWasm.mode.OFB }).toString()); }); test('testMultiPartCTR', () => { - let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, {iv: iv, mode: cryptoJs.mode.CTR}); - let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, {iv: iv, mode: cryptoJsWasm.mode.CTR}); + let TripleDES = cryptoJs.algo.TripleDES.createEncryptor(key, { iv: iv, mode: cryptoJs.mode.CTR }); + let TripleDESWasm = cryptoJsWasm.algo.TripleDES.createEncryptor(key, { iv: iv, mode: cryptoJsWasm.mode.CTR }); let ciphertext1 = TripleDES.process(data1); let ciphertext2 = TripleDES.process(data2); let ciphertext3 = TripleDES.process(data3); @@ -243,7 +243,7 @@ test('testMultiPartCTR', () => { expect(ciphertext4.toString()).toEqual(ciphertextWasm4.toString()); expect(ciphertext.toString()).toEqual(ciphertextWasm.toString()); expect(ciphertext.toString(cryptoJs.enc.Base64)).toEqual(cryptoJs.TripleDES.encrypt(data, - key, {iv: iv, mode: cryptoJs.mode.CTR}).toString()); + key, { iv: iv, mode: cryptoJs.mode.CTR }).toString()); expect(ciphertextWasm.toString(cryptoJsWasm.enc.Base64)).toEqual(cryptoJsWasm.TripleDES.encrypt(data, - key, {iv: iv, mode: cryptoJsWasm.mode.CTR}).toString()); + key, { iv: iv, mode: cryptoJsWasm.mode.CTR }).toString()); }); \ No newline at end of file diff --git a/test/md5.test.js b/test/md5.test.js index 0ea2154..4cc2168 100644 --- a/test/md5.test.js +++ b/test/md5.test.js @@ -48,6 +48,16 @@ describe('algo-md5-test', () => { expect(md5.finalize().toString()).toBe('7d017545e0268a6a12f2b507871d0429'); }); + test('testCreate', () => { + let i = 0; + const md5 = C.algo.MD5.create(); + while (i < 100) { + md5.update('12345678901234567890123456789012345678901234567890'); + i++; + } + expect(md5.finalize().toString()).toBe('7d017545e0268a6a12f2b507871d0429'); + }); + test('testInputIntegrity', () => { const message = new C.lib.WordArray([0x12345678]); const expected = message.toString(); diff --git a/types/index.d.ts b/types/index.d.ts index efc27b4..c6d001f 100644 --- a/types/index.d.ts +++ b/types/index.d.ts @@ -894,7 +894,7 @@ declare global { * var wordArray = CryptoJSWasm.lib.WordArray.create([0x00010203, 0x04050607]); * var wordArray = CryptoJSWasm.lib.WordArray.create([0x00010203, 0x04050607], 6); */ - create(words?: number[], sigBytes?: number): WordArray; + create(words?: number[] | Uint8Array | Int8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array, sigBytes?: number): WordArray; /** * Creates a word array filled with random bytes. *