diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json index ffffb52c7..c9b058e2d 100755 --- a/src/core/config/Categories.json +++ b/src/core/config/Categories.json @@ -62,7 +62,8 @@ "CSV to JSON", "JSON to CSV", "Avro to JSON", - "CBOR Encode" + "CBOR Encode", + "CBOR Decode" ] }, { diff --git a/src/core/operations/CBORDecode.mjs b/src/core/operations/CBORDecode.mjs new file mode 100644 index 000000000..34f1abd19 --- /dev/null +++ b/src/core/operations/CBORDecode.mjs @@ -0,0 +1,42 @@ +/** + * @author Danh4 [dan.h4@ncsc.gov.uk] + * @copyright Crown Copyright 2020 + * @license Apache-2.0 + */ + +import Operation from "../Operation.mjs"; +import Cbor from "cbor"; + +/** + * CBOR Decode operation + */ +class CBORDecode extends Operation { + + /** + * CBORDecode constructor + */ + constructor() { + super(); + + this.name = "CBOR Decode"; + this.module = "Default"; + this.description = "Decode Concise Binary Object Representation (CBOR) data format (RFC7049) to JSON."; + this.infoURL = "https://cbor.io"; + this.inputType = "ArrayBuffer"; + this.outputType = "JSON"; + this.args = [ + ]; + } + + /** + * @param {ArrayBuffer} input + * @param {Object[]} args + * @returns {JSON} + */ + run(input, args) { + return Cbor.decodeFirstSync(Buffer.from(input).toString("hex")); + } + +} + +export default CBORDecode; diff --git a/tests/operations/index.mjs b/tests/operations/index.mjs index 7697fbdfb..da6a659d9 100644 --- a/tests/operations/index.mjs +++ b/tests/operations/index.mjs @@ -102,6 +102,7 @@ import "./tests/CipherSaber2.mjs"; import "./tests/Colossus.mjs"; import "./tests/ParseObjectIDTimestamp.mjs"; import "./tests/CBOREncode.mjs"; +import "./tests/CBORDecode.mjs"; // Cannot test operations that use the File type yet diff --git a/tests/operations/tests/CBORDecode.mjs b/tests/operations/tests/CBORDecode.mjs new file mode 100644 index 000000000..4505b59c8 --- /dev/null +++ b/tests/operations/tests/CBORDecode.mjs @@ -0,0 +1,145 @@ +/** + * From Hex Tests. + * + * @author Danh4 [dan.h4@ncsc.gov.uk] + * + * @copyright Crown Copyright 2019 + * @license Apache-2.0 + */ + +import TestRegister from "../../lib/TestRegister.mjs"; + +TestRegister.addTests([ + { + name: "CBOR Decode: Can decode integer", + input: "0f", + expectedOutput: "15", + recipeConfig: [ + { + op: "From Hex", + args: [] + }, + { + op: "CBOR Decode", + args: [] + } + ] + }, + { + name: "CBOR Decode: Can decode decimal", + input: "f9 3e 00", + expectedOutput: "1.5", + recipeConfig: [ + { + op: "From Hex", + args: [] + }, + { + op: "CBOR Decode", + args: [] + } + ] + }, + { + name: "From Hex: Can decode text", + input: "64 54 65 78 74", + expectedOutput: "\"Text\"", + recipeConfig: [ + { + op: "From Hex", + args: [] + }, + { + op: "CBOR Decode", + args: [] + } + ] + }, + { + name: "From Hex: Can decode boolean true", + input: "f5", + expectedOutput: "true", + recipeConfig: [ + { + op: "From Hex", + args: [] + }, + { + op: "CBOR Decode", + args: [] + } + ] + }, + { + name: "From Hex: Can decode boolean false", + input: "f4", + expectedOutput: "false", + recipeConfig: [ + { + op: "From Hex", + args: [] + }, + { + op: "CBOR Decode", + args: [] + } + ] + }, + { + name: "From Hex: Can decode map", + input: "a3 61 61 01 61 62 02 61 63 03", + expectedOutput: JSON.stringify({a: 1, b: 2, c: 3}), + recipeConfig: [ + { + op: "From Hex", + args: [] + }, + { + op: "CBOR Decode", + args: [] + }, + { + op: "JSON Minify", + args: [] + } + ] + }, + { + name: "From Hex: Can decode list", + input: "83 00 01 02", + expectedOutput: "[0,1,2]", + recipeConfig: [ + { + op: "From Hex", + args: [] + }, + { + op: "CBOR Decode", + args: [] + }, + { + op: "JSON Minify", + args: [] + } + ] + }, + { + name: "From Hex: Can round trip with encode", + input: JSON.stringify({a: 1, b: false, c: [1, 2, 3]}), + expectedOutput: JSON.stringify({a: 1, b: false, c: [1, 2, 3]}), + recipeConfig: [ + { + op: "CBOR Encode", + args: [] + }, + { + op: "CBOR Decode", + args: [] + }, + { + op: "JSON Minify", + args: [] + } + ] + } +]);