From 726e117656ef5f153adea486d16d21041fcc06b0 Mon Sep 17 00:00:00 2001 From: Gustavo Silva Date: Tue, 29 Oct 2019 23:12:24 +0000 Subject: [PATCH 1/8] diff.mjs: Allows showing subtraction Adds "Show Subtraction" button to allow seeing only the difference between two texts. When selected and combined, user can see only the characters or words that were added. If not combined, with either removed or added but selected, then nothing is displayed. --- src/core/operations/Diff.mjs | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/core/operations/Diff.mjs b/src/core/operations/Diff.mjs index 7adea178c..921369e82 100644 --- a/src/core/operations/Diff.mjs +++ b/src/core/operations/Diff.mjs @@ -47,6 +47,11 @@ class Diff extends Operation { "type": "boolean", "value": true }, + { + "name": "Show subtraction", + "type": "boolean", + "value": true + }, { "name": "Ignore whitespace", "type": "boolean", @@ -67,6 +72,7 @@ class Diff extends Operation { diffBy, showAdded, showRemoved, + showSubtraction, ignoreWhitespace ] = args, samples = input.split(sampleDelim); @@ -116,8 +122,8 @@ class Diff extends Operation { if (showAdded) output += "" + Utils.escapeHtml(diff[i].value) + ""; } else if (diff[i].removed) { if (showRemoved) output += "" + Utils.escapeHtml(diff[i].value) + ""; - } else { - output += Utils.escapeHtml(diff[i].value); + } else if (!showSubtraction) { + output += Utils.escapeHtml(diff[i].value) + ""; } } From 9108b3923b689cf035744d420e56cd1f1af7e87c Mon Sep 17 00:00:00 2001 From: Gustavo Silva Date: Tue, 29 Oct 2019 23:35:35 +0000 Subject: [PATCH 2/8] diff.mjs: Fixes tests and adds default flag * Sets default flag to `false` for `showSubtraction` flag. * Removes extra span for else case that was causing some tests to fail. Moreover, the previous behavior was defined as that. * Adds custom test for the showSubtraction option, both using the `showAdded` and `showRemoved` flags. --- src/core/operations/Diff.mjs | 4 ++-- tests/operations/tests/StrUtils.mjs | 24 +++++++++++++++++++++++- 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/src/core/operations/Diff.mjs b/src/core/operations/Diff.mjs index 921369e82..841072457 100644 --- a/src/core/operations/Diff.mjs +++ b/src/core/operations/Diff.mjs @@ -50,7 +50,7 @@ class Diff extends Operation { { "name": "Show subtraction", "type": "boolean", - "value": true + "value": false }, { "name": "Ignore whitespace", @@ -123,7 +123,7 @@ class Diff extends Operation { } else if (diff[i].removed) { if (showRemoved) output += "" + Utils.escapeHtml(diff[i].value) + ""; } else if (!showSubtraction) { - output += Utils.escapeHtml(diff[i].value) + ""; + output += Utils.escapeHtml(diff[i].value); } } diff --git a/tests/operations/tests/StrUtils.mjs b/tests/operations/tests/StrUtils.mjs index 9098d2f1e..c78b6b23d 100644 --- a/tests/operations/tests/StrUtils.mjs +++ b/tests/operations/tests/StrUtils.mjs @@ -15,7 +15,29 @@ TestRegister.addTests([ recipeConfig: [ { "op": "Diff", - "args": ["\\n\\n", "Character", true, true, false] + "args": ["\\n\\n", "Character", true, true, false, false] + } + ], + }, + { + name: "Diff added with subtraction, basic usage", + input: "testing23\n\ntesting123", + expectedOutput: "1", + recipeConfig: [ + { + "op": "Diff", + "args": ["\\n\\n", "Character", true, true, true, false] + } + ], + }, + { + name: "Diff removed with subtraction, basic usage", + input: "testing123\n\ntesting3", + expectedOutput: "12", + recipeConfig: [ + { + "op": "Diff", + "args": ["\\n\\n", "Character", true, true, true, false] } ], }, From 2d12a167710d019635c001d5328fef8c3d9263cb Mon Sep 17 00:00:00 2001 From: Jarrod Connolly Date: Wed, 30 Oct 2019 22:09:42 -0700 Subject: [PATCH 3/8] Add Avro to JSON data format conversion --- package-lock.json | 5 ++ package.json | 1 + src/core/config/Categories.json | 3 +- src/core/operations/AvroToJSON.mjs | 79 +++++++++++++++++++++++++++ tests/operations/index.mjs | 1 + tests/operations/tests/AvroToJSON.mjs | 67 +++++++++++++++++++++++ 6 files changed, 155 insertions(+), 1 deletion(-) create mode 100644 src/core/operations/AvroToJSON.mjs create mode 100644 tests/operations/tests/AvroToJSON.mjs diff --git a/package-lock.json b/package-lock.json index b3c6f415e..45f1afd77 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2149,6 +2149,11 @@ } } }, + "avsc": { + "version": "5.4.16", + "resolved": "https://registry.npmjs.org/avsc/-/avsc-5.4.16.tgz", + "integrity": "sha512-Z85B8ZaEU2PWNPRJYuMSp5Hg7Nw3KPKW47lW/Kus7AcwV7fr6uJG3UckagqIPLydIeO/Cm+yjnJG7g0tliICOg==" + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", diff --git a/package.json b/package.json index 518fb29be..84ba3bbda 100644 --- a/package.json +++ b/package.json @@ -86,6 +86,7 @@ "@babel/polyfill": "^7.4.4", "@babel/runtime": "^7.5.5", "arrive": "^2.4.1", + "avsc": "^5.4.16", "babel-plugin-transform-builtin-extend": "1.1.2", "bcryptjs": "^2.4.3", "bignumber.js": "^9.0.0", diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index db2ab3a63..19b702d0f 100755 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -59,7 +59,8 @@ "From Braille", "Parse TLV", "CSV to JSON", - "JSON to CSV" + "JSON to CSV", + "Avro to JSON" ] }, { diff --git a/src/core/operations/AvroToJSON.mjs b/src/core/operations/AvroToJSON.mjs new file mode 100644 index 000000000..ee2b81a91 --- /dev/null +++ b/src/core/operations/AvroToJSON.mjs @@ -0,0 +1,79 @@ +/** + * @author jarrodconnolly [jarrod@nestedquotes.ca] + * @copyright Crown Copyright 2019 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import OperationError from "../errors/OperationError.mjs"; +import avro from "avsc"; + +/** + * Avro to JSON operation + */ +class AvroToJSON extends Operation { + + /** + * AvroToJSON constructor + */ + constructor() { + super(); + + this.name = "Avro to JSON"; + this.module = "Avro"; + this.description = "Converts Avro encoded data into JSON."; + this.infoURL = "https://avro.apache.org/docs/current/spec.html"; + this.inputType = "ArrayBuffer"; + this.outputType = "JSON"; + this.args = [{ + name: "Force Valid JSON", + type: "boolean", + value: true + }]; + } + + /** + * @param {ArrayBuffer} input + * @param {Object[]} args + * @returns {JSON} + */ + run(input, args) { + const self = this; + if (input.byteLength <= 0) { + throw new OperationError("Please provide an input."); + } + + const forceJSON = args[0]; + + return new Promise((resolve, reject) => { + const result = []; + const inpArray = new Uint8Array(input); + const decoder = new avro.streams.BlockDecoder(); + + decoder + .on("data", function (obj) { + result.push(obj); + }) + .on("error", function () { + reject(new OperationError("Error parsing Avro file.")); + }) + .on("end", function () { + if (forceJSON) { + self.presentType = "JSON"; + self.outputType = "JSON"; + resolve(result.length === 1 ? result[0] : result); + } else { + self.presentType = "string"; + self.outputType = "string"; + const data = result.reduce((result, current) => result + JSON.stringify(current) + "\n", ""); + resolve(data); + } + }); + + decoder.write(inpArray); + decoder.end(); + }); + } +} + +export default AvroToJSON; diff --git a/tests/operations/index.mjs b/tests/operations/index.mjs index d64a77377..a15038142 100644 --- a/tests/operations/index.mjs +++ b/tests/operations/index.mjs @@ -91,6 +91,7 @@ import "./tests/Protobuf.mjs"; import "./tests/ParseSSHHostKey.mjs"; import "./tests/DefangIP.mjs"; import "./tests/ParseUDP.mjs"; +import "./tests/AvroToJSON"; // Cannot test operations that use the File type yet // import "./tests/SplitColourChannels.mjs"; diff --git a/tests/operations/tests/AvroToJSON.mjs b/tests/operations/tests/AvroToJSON.mjs new file mode 100644 index 000000000..b6e763adf --- /dev/null +++ b/tests/operations/tests/AvroToJSON.mjs @@ -0,0 +1,67 @@ +/** + * + * Avro to JSON tests. + * + * @author jarrodconnolly [jarrod@nestedquotes.ca] + * @copyright Crown Copyright 2019 + * @license Apache-2.0 + */ + +import TestRegister from "../../lib/TestRegister"; + +TestRegister.addTests([ + { + name: "Avro to JSON: no input (force JSON true)", + input: "", + expectedOutput: "Please provide an input.", + recipeConfig: [ + { + op: "Avro to JSON", + args: [true] + } + ], + }, + { + name: "Avro to JSON: no input (force JSON false)", + input: "", + expectedOutput: "Please provide an input.", + recipeConfig: [ + { + op: "Avro to JSON", + args: [false] + } + ], + }, + { + name: "Avro to JSON: small (force JSON true)", + input: "\x4f\x62\x6a\x01\x04\x16\x61\x76\x72\x6f\x2e\x73\x63\x68\x65\x6d\x61\x96\x01\x7b\x22\x74\x79\x70\x65\x22\x3a\x22\x72\x65" + + "\x63\x6f\x72\x64\x22\x2c\x22\x6e\x61\x6d\x65\x22\x3a\x22\x73\x6d\x61\x6c\x6c\x22\x2c\x22\x66\x69\x65\x6c\x64\x73\x22\x3a" + + "\x5b\x7b\x22\x6e\x61\x6d\x65\x22\x3a\x22\x6e\x61\x6d\x65\x22\x2c\x22\x74\x79\x70\x65\x22\x3a\x22\x73\x74\x72\x69\x6e\x67" + + "\x22\x7d\x5d\x7d\x14\x61\x76\x72\x6f\x2e\x63\x6f\x64\x65\x63\x08\x6e\x75\x6c\x6c\x00\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7" + + "\x5c\xda\xb9\xa6\x2f\x15\x41\x02\x0e\x0c\x6d\x79\x6e\x61\x6d\x65\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7\x5c\xda\xb9\xa6\x2f" + + "\x15\x41", + expectedOutput: "{\n \"name\": \"myname\"\n}", + recipeConfig: [ + { + op: "Avro to JSON", + args: [true] + } + ], + }, + { + name: "Avro to JSON: small (force JSON false)", + input: "\x4f\x62\x6a\x01\x04\x16\x61\x76\x72\x6f\x2e\x73\x63\x68\x65\x6d\x61\x96\x01\x7b\x22\x74\x79\x70\x65\x22\x3a\x22\x72\x65" + + "\x63\x6f\x72\x64\x22\x2c\x22\x6e\x61\x6d\x65\x22\x3a\x22\x73\x6d\x61\x6c\x6c\x22\x2c\x22\x66\x69\x65\x6c\x64\x73\x22\x3a" + + "\x5b\x7b\x22\x6e\x61\x6d\x65\x22\x3a\x22\x6e\x61\x6d\x65\x22\x2c\x22\x74\x79\x70\x65\x22\x3a\x22\x73\x74\x72\x69\x6e\x67" + + "\x22\x7d\x5d\x7d\x14\x61\x76\x72\x6f\x2e\x63\x6f\x64\x65\x63\x08\x6e\x75\x6c\x6c\x00\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7" + + "\x5c\xda\xb9\xa6\x2f\x15\x41\x02\x0e\x0c\x6d\x79\x6e\x61\x6d\x65\x4e\x02\x47\x63\x2e\x37\x02\xe5\xb7\x5c\xda\xb9\xa6\x2f" + + "\x15\x41", + expectedOutput: "{\"name\":\"myname\"}\n", + recipeConfig: [ + { + op: "Avro to JSON", + args: [false] + } + ], + } +]); From 0630c094e00e3a15025613d49a6feb5262126eca Mon Sep 17 00:00:00 2001 From: n1474335 Date: Thu, 31 Oct 2019 13:00:22 +0000 Subject: [PATCH 4/8] 9.7.20 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index b3c6f415e..838096172 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cyberchef", - "version": "9.7.19", + "version": "9.7.20", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 518fb29be..37c1d7732 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cyberchef", - "version": "9.7.19", + "version": "9.7.20", "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.", "author": "n1474335 ", "homepage": "https://gchq.github.io/CyberChef", From 6a1d11b9b5ab475c36b8a0c7e176e06e24088d7f Mon Sep 17 00:00:00 2001 From: n1474335 Date: Thu, 31 Oct 2019 13:39:06 +0000 Subject: [PATCH 5/8] Argument hints are not tooltips instead of bmd-help elements --- src/web/HTMLIngredient.mjs | 53 +++++++++++-------- src/web/stylesheets/components/_operation.css | 4 -- src/web/waiters/RecipeWaiter.mjs | 2 + 3 files changed, 33 insertions(+), 26 deletions(-) diff --git a/src/web/HTMLIngredient.mjs b/src/web/HTMLIngredient.mjs index 03f4e9835..fd496f2aa 100755 --- a/src/web/HTMLIngredient.mjs +++ b/src/web/HTMLIngredient.mjs @@ -54,7 +54,9 @@ class HTMLIngredient { case "binaryString": case "byteArray": html += `
- + - ${this.hint ? "" + this.hint + "" : ""}
`; break; case "shortString": case "binaryShortString": html += `
- + - ${this.hint ? "" + this.hint + "" : ""}
`; break; case "toggleString": html += `
- + - ${this.hint ? "" + this.hint + "" : ""}
@@ -105,7 +108,9 @@ class HTMLIngredient { break; case "number": html += `
- + - ${this.hint ? "" + this.hint + "" : ""}
`; break; case "boolean": html += `
-
`; break; case "option": html += `
- + - ${this.hint ? "" + this.hint + "" : ""}
`; eventFn = this.type === "populateMultiOption" ? @@ -191,7 +196,9 @@ class HTMLIngredient { break; case "editableOption": html += `
- + - ${this.hint ? "" + this.hint + "" : ""}
`; break; case "argSelector": html += `
- + - ${this.hint ? "" + this.hint + "" : ""}
`; this.manager.addDynamicListener(".arg-selector", "change", this.argSelectorChange, this); diff --git a/src/web/stylesheets/components/_operation.css b/src/web/stylesheets/components/_operation.css index a4255fc33..39f53a077 100755 --- a/src/web/stylesheets/components/_operation.css +++ b/src/web/stylesheets/components/_operation.css @@ -159,10 +159,6 @@ div.toggle-string { width: calc(100% - 13px); } -.operation .bmd-form-group .bmd-help { - margin-top: -17px; -} - .input-group .form-control { border-top-left-radius: 4px !important; } diff --git a/src/web/waiters/RecipeWaiter.mjs b/src/web/waiters/RecipeWaiter.mjs index d198098b7..ba0e7b11c 100755 --- a/src/web/waiters/RecipeWaiter.mjs +++ b/src/web/waiters/RecipeWaiter.mjs @@ -399,6 +399,8 @@ class RecipeWaiter { this.buildRecipeOperation(item); document.getElementById("rec-list").appendChild(item); + $(item).find("[data-toggle='tooltip']").tooltip(); + item.dispatchEvent(this.manager.operationadd); return item; } From daad633195fc7f9494f8dacb665f8b7a5dbcecf1 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Thu, 31 Oct 2019 14:17:07 +0000 Subject: [PATCH 6/8] Tidied up Avro to JSON operation --- src/core/operations/AvroToJSON.mjs | 27 +++++++++++-------------- src/core/operations/BSONDeserialise.mjs | 2 +- src/core/operations/BSONSerialise.mjs | 2 +- tests/operations/index.mjs | 2 +- tests/operations/tests/AvroToJSON.mjs | 1 - 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/core/operations/AvroToJSON.mjs b/src/core/operations/AvroToJSON.mjs index ee2b81a91..497a3872b 100644 --- a/src/core/operations/AvroToJSON.mjs +++ b/src/core/operations/AvroToJSON.mjs @@ -20,25 +20,26 @@ class AvroToJSON extends Operation { super(); this.name = "Avro to JSON"; - this.module = "Avro"; + this.module = "Serialise"; this.description = "Converts Avro encoded data into JSON."; - this.infoURL = "https://avro.apache.org/docs/current/spec.html"; + this.infoURL = "https://wikipedia.org/wiki/Apache_Avro"; this.inputType = "ArrayBuffer"; - this.outputType = "JSON"; - this.args = [{ - name: "Force Valid JSON", - type: "boolean", - value: true - }]; + this.outputType = "string"; + this.args = [ + { + name: "Force Valid JSON", + type: "boolean", + value: true + } + ]; } /** * @param {ArrayBuffer} input * @param {Object[]} args - * @returns {JSON} + * @returns {string} */ run(input, args) { - const self = this; if (input.byteLength <= 0) { throw new OperationError("Please provide an input."); } @@ -59,12 +60,8 @@ class AvroToJSON extends Operation { }) .on("end", function () { if (forceJSON) { - self.presentType = "JSON"; - self.outputType = "JSON"; - resolve(result.length === 1 ? result[0] : result); + resolve(result.length === 1 ? JSON.stringify(result[0], null, 4) : JSON.stringify(result, null, 4)); } else { - self.presentType = "string"; - self.outputType = "string"; const data = result.reduce((result, current) => result + JSON.stringify(current) + "\n", ""); resolve(data); } diff --git a/src/core/operations/BSONDeserialise.mjs b/src/core/operations/BSONDeserialise.mjs index a21eaadd3..cb46b357e 100644 --- a/src/core/operations/BSONDeserialise.mjs +++ b/src/core/operations/BSONDeserialise.mjs @@ -20,7 +20,7 @@ class BSONDeserialise extends Operation { super(); this.name = "BSON deserialise"; - this.module = "BSON"; + this.module = "Serialise"; this.description = "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be in a raw bytes format."; this.infoURL = "https://wikipedia.org/wiki/BSON"; this.inputType = "ArrayBuffer"; diff --git a/src/core/operations/BSONSerialise.mjs b/src/core/operations/BSONSerialise.mjs index 6d33c6be6..25eed876d 100644 --- a/src/core/operations/BSONSerialise.mjs +++ b/src/core/operations/BSONSerialise.mjs @@ -20,7 +20,7 @@ class BSONSerialise extends Operation { super(); this.name = "BSON serialise"; - this.module = "BSON"; + this.module = "Serialise"; this.description = "BSON is a computer data interchange format used mainly as a data storage and network transfer format in the MongoDB database. It is a binary form for representing simple data structures, associative arrays (called objects or documents in MongoDB), and various data types of specific interest to MongoDB. The name 'BSON' is based on the term JSON and stands for 'Binary JSON'.

Input data should be valid JSON."; this.infoURL = "https://wikipedia.org/wiki/BSON"; this.inputType = "string"; diff --git a/tests/operations/index.mjs b/tests/operations/index.mjs index a15038142..71c4432cc 100644 --- a/tests/operations/index.mjs +++ b/tests/operations/index.mjs @@ -91,7 +91,7 @@ import "./tests/Protobuf.mjs"; import "./tests/ParseSSHHostKey.mjs"; import "./tests/DefangIP.mjs"; import "./tests/ParseUDP.mjs"; -import "./tests/AvroToJSON"; +import "./tests/AvroToJSON.mjs"; // Cannot test operations that use the File type yet // import "./tests/SplitColourChannels.mjs"; diff --git a/tests/operations/tests/AvroToJSON.mjs b/tests/operations/tests/AvroToJSON.mjs index b6e763adf..045abddbc 100644 --- a/tests/operations/tests/AvroToJSON.mjs +++ b/tests/operations/tests/AvroToJSON.mjs @@ -1,5 +1,4 @@ /** - * * Avro to JSON tests. * * @author jarrodconnolly [jarrod@nestedquotes.ca] From 35103bf155594db8f172e0ae891a6c0c5ea13c87 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Thu, 31 Oct 2019 14:20:55 +0000 Subject: [PATCH 7/8] Updated CHANGELOG --- CHANGELOG.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6eaec2432..1204742fd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ All major and minor version changes will be documented in this file. Details of patch-level version changes can be found in [commit messages](https://github.com/gchq/CyberChef/commits/master). +### [9.8.0] - 2019-10-31 +- 'Avro to JSON' operation added [@jarrodconnolly] | [#865] + ### [9.7.0] - 2019-09-13 - 'Optical Character Recognition' operation added [@MShwed] [@n1474335] | [#632] @@ -185,6 +188,7 @@ All major and minor version changes will be documented in this file. Details of +[9.8.0]: https://github.com/gchq/CyberChef/releases/tag/v9.8.0 [9.7.0]: https://github.com/gchq/CyberChef/releases/tag/v9.7.0 [9.6.0]: https://github.com/gchq/CyberChef/releases/tag/v9.6.0 [9.5.0]: https://github.com/gchq/CyberChef/releases/tag/v9.5.0 @@ -262,6 +266,7 @@ All major and minor version changes will be documented in this file. Details of [@Ge0rg3]: https://github.com/Ge0rg3 [@MShwed]: https://github.com/MShwed [@kassi]: https://github.com/kassi +[@jarrodconnolly]: https://github.com/jarrodconnolly [#95]: https://github.com/gchq/CyberChef/pull/299 [#173]: https://github.com/gchq/CyberChef/pull/173 @@ -322,3 +327,4 @@ All major and minor version changes will be documented in this file. Details of [#625]: https://github.com/gchq/CyberChef/pull/625 [#627]: https://github.com/gchq/CyberChef/pull/627 [#632]: https://github.com/gchq/CyberChef/pull/632 +[#865]: https://github.com/gchq/CyberChef/pull/865 From 734962ac22c020d02deefdb5cb2466f6991b4f52 Mon Sep 17 00:00:00 2001 From: n1474335 Date: Thu, 31 Oct 2019 14:21:03 +0000 Subject: [PATCH 8/8] 9.8.0 --- package-lock.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index 44bfc81cf..dd1d3d79f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "cyberchef", - "version": "9.7.20", + "version": "9.8.0", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 56661a874..2419ae875 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cyberchef", - "version": "9.7.20", + "version": "9.8.0", "description": "The Cyber Swiss Army Knife for encryption, encoding, compression and data analysis.", "author": "n1474335 ", "homepage": "https://gchq.github.io/CyberChef",