Jelajahi Sumber

Merge branch 'features/colour-channel' of https://github.com/artemisbot/CyberChef into artemisbot-features/colour-channel

n1474335 6 tahun lalu
induk
melakukan
02b92c7977

+ 13 - 2
src/core/Utils.mjs

@@ -5,7 +5,7 @@
  */
 
 import utf8 from "utf8";
-import {fromBase64} from "./lib/Base64";
+import {fromBase64, toBase64} from "./lib/Base64";
 import {fromHex} from "./lib/Hex";
 import {fromDecimal} from "./lib/Decimal";
 import {fromBinary} from "./lib/Binary";
@@ -817,6 +817,17 @@ class Utils {
             return html;
         };
 
+        const formatContent = function (buff, type) {
+            if (type.startsWith("image")) {
+                let dataURI = "data:";
+                dataURI += type + ";";
+                dataURI += "base64," + toBase64(buff);
+                return "<img style='max-width: 100%;' src='" + dataURI + "'>";
+            } else {
+                return `<pre>${Utils.escapeHtml(Utils.arrayBufferToStr(buff.buffer))}</pre>`;
+            }
+        };
+
         const formatFile = async function(file, i) {
             const buff = await Utils.readFile(file);
             const blob = new Blob(
@@ -846,7 +857,7 @@ class Utils {
                     </div>
                     <div id='collapse${i}' class='collapse' aria-labelledby='heading${i}' data-parent="#files">
                         <div class='card-body'>
-                            <pre>${Utils.escapeHtml(Utils.arrayBufferToStr(buff.buffer))}</pre>
+                            ${formatContent(buff, file.type)}
                         </div>
                     </div>
                 </div>`;

+ 4 - 0
src/core/config/Categories.json

@@ -366,6 +366,10 @@
             "Generate QR Code",
             "Parse QR Code",
             "Haversine distance",
+            "Render Image",
+            "Remove EXIF",
+            "Extract EXIF",
+            "Split Colour Channels",
             "Numberwang",
             "XKCD Random Number"
         ]

+ 112 - 0
src/core/operations/SplitColourChannels.mjs

@@ -0,0 +1,112 @@
+/**
+ * @author Matt C [matt@artemisbot.uk]
+ * @copyright Crown Copyright 2018
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation";
+import OperationError from "../errors/OperationError";
+import Utils from "../Utils";
+import Magic from "../lib/Magic";
+
+import jimp from "jimp";
+
+/**
+ * Split Colour Channels operation
+ */
+class SplitColourChannels extends Operation {
+
+    /**
+     * SplitColourChannels constructor
+     */
+    constructor() {
+        super();
+
+        this.name = "Split Colour Channels";
+        this.module = "Image";
+        this.description = "Splits given image into its red, green and blue colour channels.";
+        this.infoURL = "https://en.wikipedia.org/wiki/Channel_(digital_image)";
+        this.inputType = "byteArray";
+        this.outputType = "List<File>";
+        this.presentType = "html";
+        this.args = [
+            /* Example arguments. See the project wiki for full details.
+            {
+                name: "First arg",
+                type: "string",
+                value: "Don't Panic"
+            },
+            {
+                name: "Second arg",
+                type: "number",
+                value: 42
+            }
+            */
+        ];
+    }
+
+    /**
+     * @param {byteArray} input
+     * @param {Object[]} args
+     * @returns {List<File>}
+     */
+    async run(input, args) {
+        const type = Magic.magicFileType(input);
+        // Make sure that the input is an image
+        if (type && type.mime.indexOf("image") === 0) {
+            const parsedImage = await jimp.read(Buffer.from(input));
+            const red = new Promise(async (resolve, reject) => {
+                try {
+                    const split = parsedImage.clone()
+                        .color([
+                            {apply: "blue", params: [-255]},
+                            {apply: "green", params: [-255]}
+                        ]).getBufferAsync(jimp.MIME_PNG);
+                    resolve(new File([new Uint8Array((await split).values())], "red.png", {type: "image/png"}));
+                } catch (err) {
+                    reject(new OperationError(`Could not split red channel: ${err}`));
+                }
+            });
+            const green = new Promise(async (resolve, reject) => {
+                try {
+                    const split = parsedImage.clone()
+                        .color([
+                            {apply: "red", params: [-255]},
+                            {apply: "blue", params: [-255]},
+                        ]).getBufferAsync(jimp.MIME_PNG);
+                    resolve(new File([new Uint8Array((await split).values())], "green.png", {type: "image/png"}));
+                } catch (err) {
+                    reject(new OperationError(`Could not split green channel: ${err}`));
+                }
+            });
+            const blue = new Promise(async (resolve, reject) => {
+                try {
+                    const split = parsedImage
+                        .color([
+                            {apply: "red", params: [-255]},
+                            {apply: "green", params: [-255]},
+                        ]).getBufferAsync(jimp.MIME_PNG);
+                    resolve(new File([new Uint8Array((await split).values())], "blue.png", {type: "image/png"}));
+                } catch (err) {
+                    reject(new OperationError(`Could not split blue channel: ${err}`));
+                }
+            });
+            return await Promise.all([red, green, blue]);
+        } else {
+            throw new OperationError("Invalid file type.");
+        }
+    }
+
+    /**
+     * Displays the files in HTML for web apps.
+     *
+     * @param {File[]} files
+     * @returns {html}
+     */
+    async present(files) {
+        return await Utils.displayFilesAsHTML(files);
+    }
+
+}
+
+export default SplitColourChannels;

+ 1 - 0
test/index.mjs

@@ -74,6 +74,7 @@ import "./tests/operations/SeqUtils";
 import "./tests/operations/SetDifference";
 import "./tests/operations/SetIntersection";
 import "./tests/operations/SetUnion";
+//import "./tests/operations/SplitColourChannels";
 import "./tests/operations/StrUtils";
 import "./tests/operations/SymmetricDifference";
 import "./tests/operations/TextEncodingBruteForce";

File diff ditekan karena terlalu besar
+ 10 - 0
test/tests/operations/SplitColourChannels.mjs


Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini