diff --git a/src/core/config/OperationConfig.js b/src/core/config/OperationConfig.js index 7f2e9de4..6e39bd2e 100755 --- a/src/core/config/OperationConfig.js +++ b/src/core/config/OperationConfig.js @@ -1126,12 +1126,12 @@ const OperationConfig = { { name: "Input", type: "option", - value: Cipher.IO_FORMAT3 + value: Cipher.IO_FORMAT4 }, { name: "Output", type: "option", - value: Cipher.IO_FORMAT2 + value: Cipher.IO_FORMAT3 }, { name: "GCM Tag", @@ -1167,12 +1167,12 @@ const OperationConfig = { { name: "Input", type: "option", - value: Cipher.IO_FORMAT2 + value: Cipher.IO_FORMAT3 }, { name: "Output", type: "option", - value: Cipher.IO_FORMAT3 + value: Cipher.IO_FORMAT4 }, ] }, @@ -1202,12 +1202,12 @@ const OperationConfig = { { name: "Input", type: "option", - value: Cipher.IO_FORMAT3 + value: Cipher.IO_FORMAT4 }, { name: "Output", type: "option", - value: Cipher.IO_FORMAT2 + value: Cipher.IO_FORMAT3 }, ] }, @@ -1237,12 +1237,12 @@ const OperationConfig = { { name: "Input", type: "option", - value: Cipher.IO_FORMAT2 + value: Cipher.IO_FORMAT3 }, { name: "Output", type: "option", - value: Cipher.IO_FORMAT3 + value: Cipher.IO_FORMAT4 }, ] }, @@ -1272,12 +1272,12 @@ const OperationConfig = { { name: "Input", type: "option", - value: Cipher.IO_FORMAT3 + value: Cipher.IO_FORMAT4 }, { name: "Output", type: "option", - value: Cipher.IO_FORMAT2 + value: Cipher.IO_FORMAT3 }, ] }, @@ -1307,7 +1307,42 @@ const OperationConfig = { { name: "Input", type: "option", - value: Cipher.IO_FORMAT2 + value: Cipher.IO_FORMAT3 + }, + { + name: "Output", + type: "option", + value: Cipher.IO_FORMAT4 + }, + ] + }, + "Blowfish Decrypt": { + module: "Ciphers", + description: "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.", + inputType: "string", + outputType: "string", + args: [ + { + name: "Key", + type: "toggleString", + value: "", + toggleValues: Cipher.IO_FORMAT1 + }, + { + name: "IV", + type: "toggleString", + value: "", + toggleValues: Cipher.IO_FORMAT1 + }, + { + name: "Mode", + type: "option", + value: Cipher.BLOWFISH_MODES + }, + { + name: "Input", + type: "option", + value: Cipher.BLOWFISH_OUTPUT_TYPES }, { name: "Output", @@ -1316,33 +1351,9 @@ const OperationConfig = { }, ] }, - "Blowfish Decrypt": { - module: "Ciphers", - description: "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.", - inputType: "string", - outputType: "string", - args: [ - { - name: "Key", - type: "toggleString", - value: "", - toggleValues: Cipher.CJS_IO_FORMAT - }, - { - name: "Mode", - type: "option", - value: Cipher.BLOWFISH_MODES - }, - { - name: "Input format", - type: "option", - value: Cipher.IO_FORMAT1 - }, - ] - }, "Blowfish Encrypt": { module: "Ciphers", - description: "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.", + description: "Blowfish is a symmetric-key block cipher designed in 1993 by Bruce Schneier and included in a large number of cipher suites and encryption products. AES now receives more attention.

IV: The Initialization Vector should be 8 bytes long. If not entered, it will default to 8 null bytes.", inputType: "string", outputType: "string", args: [ @@ -1350,7 +1361,13 @@ const OperationConfig = { name: "Key", type: "toggleString", value: "", - toggleValues: Cipher.CJS_IO_FORMAT + toggleValues: Cipher.IO_FORMAT1 + }, + { + name: "IV", + type: "toggleString", + value: "", + toggleValues: Cipher.IO_FORMAT1 }, { name: "Mode", @@ -1358,9 +1375,14 @@ const OperationConfig = { value: Cipher.BLOWFISH_MODES }, { - name: "Output format", + name: "Input", type: "option", - value: Cipher.IO_FORMAT1 + value: Cipher.IO_FORMAT3 + }, + { + name: "Output", + type: "option", + value: Cipher.BLOWFISH_OUTPUT_TYPES }, ] }, diff --git a/src/core/operations/Cipher.js b/src/core/operations/Cipher.js index 4c5d77e0..99927cda 100755 --- a/src/core/operations/Cipher.js +++ b/src/core/operations/Cipher.js @@ -24,12 +24,17 @@ const Cipher = { * @constant * @default */ - IO_FORMAT2: ["Raw", "Hex"], + IO_FORMAT2: ["UTF8", "Latin1", "Hex", "Base64"], /** * @constant * @default */ - IO_FORMAT3: ["Hex", "Raw"], + IO_FORMAT3: ["Raw", "Hex"], + /** + * @constant + * @default + */ + IO_FORMAT4: ["Hex", "Raw"], /** * @constant * @default @@ -270,12 +275,29 @@ DES uses a key length of 8 bytes (64 bits).`; * @constant * @default */ - BLOWFISH_MODES: ["ECB", "CBC", "PCBC", "CFB", "OFB", "CTR"], + BLOWFISH_MODES: ["CBC", "PCBC", "CFB", "OFB", "CTR", "ECB"], /** * @constant * @default */ - BLOWFISH_OUTPUT_TYPES: ["Base64", "Hex", "String", "Raw"], + BLOWFISH_OUTPUT_TYPES: ["Hex", "Base64", "Raw"], + + /** + * Lookup table for Blowfish output types. + * + * @private + */ + _BLOWFISH_OUTPUT_TYPE_LOOKUP: { + Base64: 0, Hex: 1, String: 2, Raw: 3 + }, + /** + * Lookup table for Blowfish modes. + * + * @private + */ + _BLOWFISH_MODE_LOOKUP: { + ECB: 0, CBC: 1, PCBC: 2, CFB: 3, OFB: 4, CTR: 5 + }, /** * Blowfish Encrypt operation. @@ -285,19 +307,24 @@ DES uses a key length of 8 bytes (64 bits).`; * @returns {string} */ runBlowfishEnc: function (input, args) { - let key = Cipher._format[args[0].option].parse(args[0].string).toString(Cipher._format.Latin1), - mode = args[1], - outputFormat = args[2]; + const key = Utils.convertToByteString(args[0].string, args[0].option), + iv = Utils.convertToByteArray(args[1].string, args[1].option), + mode = args[2], + inputType = args[3], + outputType = args[4]; if (key.length === 0) return "Enter a key"; - let encHex = Blowfish.encrypt(input, key, { - outputType: 1, - cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode) - }), - enc = CryptoJS.enc.Hex.parse(encHex); + input = Utils.convertToByteString(input, inputType); - return enc.toString(Cipher._format[outputFormat]); + Blowfish.setIV(Utils.toBase64(iv), 0); + + const enc = Blowfish.encrypt(input, key, { + outputType: Cipher._BLOWFISH_OUTPUT_TYPE_LOOKUP[outputType], + cipherMode: Cipher._BLOWFISH_MODE_LOOKUP[mode] + }); + + return outputType === "Raw" ? Utils.byteArrayToChars(enc) : enc ; }, @@ -309,18 +336,24 @@ DES uses a key length of 8 bytes (64 bits).`; * @returns {string} */ runBlowfishDec: function (input, args) { - let key = Cipher._format[args[0].option].parse(args[0].string).toString(Cipher._format.Latin1), - mode = args[1], - inputFormat = args[2]; + const key = Utils.convertToByteString(args[0].string, args[0].option), + iv = Utils.convertToByteArray(args[1].string, args[1].option), + mode = args[2], + inputType = args[3], + outputType = args[4]; if (key.length === 0) return "Enter a key"; - input = Cipher._format[inputFormat].parse(input); + input = inputType === "Raw" ? Utils.strToByteArray(input) : input; - return Blowfish.decrypt(input.toString(CryptoJS.enc.Base64), key, { - outputType: 0, // This actually means inputType. The library is weird. - cipherMode: Cipher.BLOWFISH_MODES.indexOf(mode) + Blowfish.setIV(Utils.toBase64(iv), 0); + + const result = Blowfish.decrypt(input, key, { + outputType: Cipher._BLOWFISH_OUTPUT_TYPE_LOOKUP[inputType], // This actually means inputType. The library is weird. + cipherMode: Cipher._BLOWFISH_MODE_LOOKUP[mode] }); + + return outputType === "Hex" ? Utils.toHexFast(Utils.strToByteArray(result)) : result; },