{"version":3,"sources":["jsdelivr-header.js","/npm/stegano@1.0.0/lib/encryptor.js"],"names":[],"mappings":"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","file":"/npm/stegano@1.0.0/lib/encryptor.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/stegano@1.0.0/lib/encryptor.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n    return new (P || (P = Promise))(function (resolve, reject) {\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\n    });\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Encryptor = void 0;\nconst isInteger_1 = __importDefault(require(\"lodash/isInteger\"));\nconst bit_stuffing_1 = require(\"./bit-stuffing\");\nconst buffer_to_bit_coverter_1 = require(\"./buffer-to-bit-coverter\");\nclass Encryptor {\n    constructor() {\n        this.bitStuffing = new bit_stuffing_1.BitStuffing();\n    }\n    encrypt(originalImage, secret, depth) {\n        const image = originalImage.clone();\n        const secretBuffer = Buffer.from(secret, 'utf-8');\n        const escapedSecret = Buffer.from([...this.bitStuffing.escape(secretBuffer)]);\n        const secretBits = buffer_to_bit_coverter_1.convertBufferToBits(escapedSecret);\n        const capacityBits = (image.bitmap.width * image.bitmap.height - 1) * 3 * depth;\n        if (capacityBits < secretBits.length) {\n            throw new Error(`Image too small. Capacity (with depth=${depth}) is ${capacityBits} bits. Secret requires ${secretBits.length} bits`);\n        }\n        const scanIterator = image.scanIterator(0, 0, image.bitmap.width, image.bitmap.height);\n        for (const { x, y, idx } of scanIterator) {\n            if (x === 0 && y === 0) {\n                this.setDepth(image, idx, depth);\n                continue;\n            }\n            const redBits = secretBits.splice(0, depth).join('').padEnd(depth, '0');\n            const redNumber = parseInt(redBits, 2);\n            image.bitmap.data[idx + 0] = this.applyRightMostBits(image.bitmap.data[idx + 0], depth, redNumber);\n            const greenBits = secretBits.splice(0, depth).join('').padEnd(depth, '0');\n            const greenNumber = parseInt(greenBits, 2);\n            image.bitmap.data[idx + 1] = this.applyRightMostBits(image.bitmap.data[idx + 1], depth, greenNumber);\n            const blueBits = secretBits.splice(0, depth).join('').padEnd(depth, '0');\n            const blueNumber = parseInt(blueBits, 2);\n            image.bitmap.data[idx + 2] = this.applyRightMostBits(image.bitmap.data[idx + 2], depth, blueNumber);\n            if (secretBits.length === 0) {\n                break;\n            }\n        }\n        return image;\n    }\n    decrypt(image) {\n        const scanIterator = image.scanIterator(0, 0, image.bitmap.width, image.bitmap.height);\n        let temp = '';\n        let buffer = Buffer.from([]);\n        let frameEndReceived = false;\n        let depth;\n        for (const { x, y, idx } of scanIterator) {\n            if (x === 0 && y === 0) {\n                depth = this.getDepth(image, idx);\n                continue;\n            }\n            const redBits = image.bitmap.data[idx + 0].toString(2).padStart(8, '0').slice(-depth);\n            temp += redBits;\n            const greenBits = image.bitmap.data[idx + 1].toString(2).padStart(8, '0').slice(-depth);\n            temp += greenBits;\n            const blueBits = image.bitmap.data[idx + 2].toString(2).padStart(8, '0').slice(-depth);\n            temp += blueBits;\n            while (temp.length >= 8) {\n                const bits = temp.split('');\n                const first8bits = bits.splice(0, 8);\n                temp = bits.join('');\n                const firstByte = parseInt(first8bits.join(''), 2);\n                buffer = Buffer.concat([buffer, Buffer.from([firstByte])]);\n                if (firstByte === bit_stuffing_1.BitStuffing.FE) {\n                    frameEndReceived = true;\n                    break;\n                }\n            }\n            if (frameEndReceived) {\n                break;\n            }\n        }\n        const unescapedSecret = Buffer.from([...this.bitStuffing.unescape(buffer)]);\n        const secret = unescapedSecret.toString('utf-8');\n        return secret;\n    }\n    /**\n     * Set depth to pixel at [0;0]\n     * @param image - image to be mutated\n     * @param depth - mow many bits used to store message info\n     *\n     * Examples:\n     *  depth == 1 => R := XXXXXXX0 G := XXXXXXX0 B := XXXXXXX1\n     *  depth == 2 => R := XXXXXXX0 G := XXXXXXX1 B := XXXXXXX0\n     *  depth == 3 => R := XXXXXXX0 G := XXXXXXX1 B := XXXXXXX1\n     *  depth == 4 => R := XXXXXXX1 G := XXXXXXX0 B := XXXXXXX0\n     *  depth == 5 => R := XXXXXXX1 G := XXXXXXX0 B := XXXXXXX1\n     *  depth == 6 => R := XXXXXXX1 G := XXXXXXX1 B := XXXXXXX0\n     *  depth == 7 => R := XXXXXXX1 G := XXXXXXX1 B := XXXXXXX1\n     */\n    setDepth(image, idx = 0, depth) {\n        return __awaiter(this, void 0, void 0, function* () {\n            if (!isInteger_1.default(depth) || depth < 1 || depth > 7) {\n                throw new Error('Depth should be an integer from 1 to 7');\n            }\n            const redRightMost = (depth >> 2) % 2;\n            const greenRightMost = (depth >> 1) % 2;\n            const blueRightMost = (depth >> 0) % 2;\n            image.bitmap.data[idx + 0] = this.applyRightMostBits(image.bitmap.data[idx + 0], 1, redRightMost);\n            image.bitmap.data[idx + 1] = this.applyRightMostBits(image.bitmap.data[idx + 1], 1, greenRightMost);\n            image.bitmap.data[idx + 2] = this.applyRightMostBits(image.bitmap.data[idx + 2], 1, blueRightMost);\n        });\n    }\n    applyRightMostBits(value, depth, bits) {\n        const result = value - value % Math.pow(2, depth) + bits % Math.pow(2, depth);\n        return result;\n    }\n    getDepth(image, idx) {\n        const red = image.bitmap.data[idx + 0];\n        const green = image.bitmap.data[idx + 1];\n        const blue = image.bitmap.data[idx + 2];\n        return parseInt(`${red % 2}${green % 2}${blue % 2}`, 2);\n    }\n}\nexports.Encryptor = Encryptor;\n"]}