cerceis-lib
Version:
Contains list of quality of life functions that is written in TypeScript and es6
1 lines • 21.4 kB
Source Map (JSON)
{"version":3,"sources":["../../src/obfuscator/obfuscator.ts"],"sourcesContent":["export type ObfuscatorVersion = \"v1\" | \"v2\" | \"v3\" | \"v4\";\n\nexport interface ObfuscatorOptions {\n version?: ObfuscatorVersion;\n key?: string;\n}\n\nexport class Obfuscator {\n private readonly _v4Prefix = \"cob:v4\";\n private readonly _base64UrlAlphabet = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\";\n\n private readonly _randomKey = (): string =>\n (Date.now() / 1000 | 0).toString(16) +\n \"xxxxxxxxxxxxxxxx\".replace(/x/g, () => (Math.random() * 16 | 0).toString(16)).toLowerCase();\n\n /**\n * Preferred obfuscation API. Defaults to V4.\n */\n public encode(inputStr: string, options: ObfuscatorOptions = {}): string {\n const version = options.version ?? \"v4\";\n\n switch (version) {\n case \"v1\":\n return options.key === undefined ? this.obfuscate(inputStr) : this.obfuscate(inputStr, options.key);\n case \"v2\":\n return this.obfuscatev2(inputStr);\n case \"v3\":\n return this.obfuscatev3(inputStr, this._requireKey(options.key, \"v3\"));\n case \"v4\":\n return this.obfuscatev4(inputStr, this._requireKey(options.key, \"v4\"));\n }\n }\n\n /**\n * Preferred deobfuscation API. V4 payloads are self-identifying.\n */\n public decode(inputStr: string, options: ObfuscatorOptions = {}): string {\n const version = options.version ?? \"v4\";\n\n switch (version) {\n case \"v1\":\n return this.deobfuscate(inputStr, this._requireKey(options.key, \"v1\"));\n case \"v2\":\n return this.deobfuscatev2(inputStr);\n case \"v3\":\n return this.deobfuscatev3(inputStr, this._requireKey(options.key, \"v3\"));\n case \"v4\":\n return this.deobfuscatev4(inputStr, this._requireKey(options.key, \"v4\"));\n }\n }\n\n private _buildKeyValue(key: string): string {\n let kv = \"\";\n for (let i = 0; i < key.length; i++) kv += key.charCodeAt(i);\n return \"l\" + kv.split(\"\").reverse().join(\"\") + \"l\";\n }\n\n /**\n * V1 obfuscation - key-based character code encoding.\n * If no key is provided, a random key is generated and you cannot deobfuscate.\n * @param inputStr String to obfuscate.\n * @param key Optional key for reversibility.\n */\n public obfuscate(inputStr: string, key: string = this._randomKey()): string {\n const kv = this._buildKeyValue(key);\n let result = \"\";\n for (let i = 0; i < inputStr.length; i++) result += inputStr.charCodeAt(i) + kv;\n return result;\n }\n\n /**\n * V1 deobfuscation.\n * @param inputStr String to deobfuscate.\n * @param key Key used during obfuscation.\n */\n public deobfuscate(inputStr: string, key: string): string {\n const kv = this._buildKeyValue(key);\n const parts = inputStr.split(kv).filter((e) => e !== \"\");\n return parts.map((e) => String.fromCharCode(Number(e))).join(\"\");\n }\n\n private _swapPairs(input: string): string {\n let result = \"\";\n for (let i = 0; i < input.length; i++) {\n if (i % 2 === 1) result += input[i] + input[i - 1];\n else if (i === input.length - 1) result += input[i];\n }\n return result;\n }\n\n /**\n * V2 obfuscation - pair-swapping with incremental key shifting.\n */\n public obfuscatev2(inputStr: string): string {\n const sortByLen = (a: string, b: string): string =>\n a.length > b.length ? \"s\" + b + a : a + b;\n\n const reformat = (text: string): string => {\n let result = \"\";\n for (let i = 0; i < text.length; i++) {\n if (i % 2 === 1) {\n result += sortByLen(String(text.charCodeAt(i - 1)), String(text.charCodeAt(i)));\n if (i !== text.length - 1) result += \":\";\n }\n if (i % 2 === 0 && i === text.length - 1)\n result += \"e\" + String(text.charCodeAt(i));\n }\n return result;\n };\n\n const increment = (input: string): string[] => {\n return input.split(\":\").map((e, i) => {\n if (e[0] !== \"e\" && e[0] !== \"s\") return String(Number(e) + (i + i * 2));\n return e;\n });\n };\n\n return increment(reformat(this._swapPairs(inputStr))).reduce((f, l) => f + \":\" + l);\n }\n\n /**\n * V2 deobfuscation.\n */\n public deobfuscatev2(inputStr: string): string {\n try {\n const split = (text: string): [string, string] => {\n const len = text.length;\n if (len <= 3) return [text.slice(0, 1), text.slice(1)];\n if (len <= 5) return [text.slice(0, 2), text.slice(2)];\n return [text.slice(0, 3), text.slice(3)];\n };\n\n let result = \"\";\n inputStr.split(\":\").forEach((e, i) => {\n if (e[0] === \"s\") {\n const [a, b] = split(e.slice(1));\n result += String.fromCharCode(Number(a)) + String.fromCharCode(Number(b));\n } else if (e[0] === \"e\") {\n result += String.fromCharCode(Number(e.slice(1)));\n } else {\n const [a, b] = split(String(Number(e) - (i + i * 2)));\n result += String.fromCharCode(Number(b)) + String.fromCharCode(Number(a));\n }\n });\n return result;\n } catch {\n return \"Errored\";\n }\n }\n\n /**\n * V3 obfuscation - binary rotation with hex encoding.\n * @param inputStr String to obfuscate.\n * @param key Key used to determine rotation amounts.\n */\n public obfuscatev3(inputStr: string, key: string): string {\n const keyValues = this._keyToValues(key);\n let kIdx = 0;\n let hex = \"\";\n const next = (): void => { kIdx = (kIdx + 1) % keyValues.length; };\n\n const rotr = (bits: string, n: number): string => {\n for (let i = 0; i < n; i++) bits = bits[bits.length - 1] + bits.slice(0, bits.length - 1);\n return bits;\n };\n\n for (let i = 0; i < inputStr.length; i++) {\n const bin = inputStr.charCodeAt(i).toString(2).padStart(16, \"0\");\n hex += parseInt(rotr(bin, keyValues[kIdx]), 2).toString(16).padStart(4, \"0\");\n next();\n }\n return hex;\n }\n\n /**\n * V3 deobfuscation.\n */\n public deobfuscatev3(inputStr: string, key: string): string {\n const keyValues = this._keyToValues(key);\n let kIdx = 0;\n let result = \"\";\n const next = (): void => { kIdx = (kIdx + 1) % keyValues.length; };\n\n const rotl = (bits: string, n: number): string => {\n for (let i = 0; i < n; i++) bits = bits.slice(1) + bits[0];\n return bits;\n };\n\n const hex2bin = (hex: string): string =>\n parseInt(hex, 16).toString(2).padStart(16, \"0\");\n\n for (let i = 0; i < inputStr.length / 4; i++) {\n const chunk = inputStr.slice(i * 4, i * 4 + 4);\n result += String.fromCharCode(parseInt(rotl(hex2bin(chunk), keyValues[kIdx]), 2));\n next();\n }\n return result;\n }\n\n /**\n * V4 obfuscation - salted keyed byte-stream masking with base64url output.\n * This is reversible obfuscation, not cryptographic encryption.\n */\n public obfuscatev4(inputStr: string, key: string): string {\n this._requireKey(key, \"v4\");\n\n const salt = this._randomSalt();\n const bytes = new TextEncoder().encode(inputStr);\n const payload = this._base64UrlEncode(this._applyV4(bytes, key, salt, \"encode\"));\n\n return `${this._v4Prefix}:${salt}:${payload}`;\n }\n\n /**\n * V4 deobfuscation.\n */\n public deobfuscatev4(inputStr: string, key: string): string {\n this._requireKey(key, \"v4\");\n\n const parts = inputStr.split(\":\");\n if (parts.length !== 4 || `${parts[0]}:${parts[1]}` !== this._v4Prefix) {\n throw new Error(\"Invalid V4 obfuscator payload\");\n }\n\n const [, , salt, payload] = parts;\n const bytes = this._base64UrlDecode(payload);\n const decoded = this._applyV4(bytes, key, salt, \"decode\");\n\n return new TextDecoder().decode(decoded);\n }\n\n private _applyV4(bytes: Uint8Array, key: string, salt: string, mode: \"encode\" | \"decode\"): Uint8Array {\n const prng = this._xorshift32(this._seedFromKey(key, salt));\n const result = new Uint8Array(bytes.length);\n\n for (let i = 0; i < bytes.length; i++) {\n const random = prng();\n const mask = random & 0xff;\n const shift = ((random >>> 8) + i) & 7;\n\n result[i] = mode === \"encode\"\n ? this._rotateLeftByte(bytes[i] ^ mask, shift)\n : this._rotateRightByte(bytes[i], shift) ^ mask;\n }\n\n return result;\n }\n\n private _seedFromKey(key: string, salt: string): number {\n let hash = 0x811c9dc5;\n const bytes = new TextEncoder().encode(`${salt}:${key}`);\n\n for (const byte of bytes) {\n hash ^= byte;\n hash = Math.imul(hash, 0x01000193) >>> 0;\n }\n\n return hash || 0x6d2b79f5;\n }\n\n private _xorshift32(seed: number): () => number {\n let state = seed >>> 0 || 0x6d2b79f5;\n\n return (): number => {\n state ^= state << 13;\n state >>>= 0;\n state ^= state >>> 17;\n state >>>= 0;\n state ^= state << 5;\n return state >>> 0;\n };\n }\n\n private _rotateLeftByte(value: number, shift: number): number {\n return ((value << shift) | (value >>> (8 - shift))) & 0xff;\n }\n\n private _rotateRightByte(value: number, shift: number): number {\n return ((value >>> shift) | (value << (8 - shift))) & 0xff;\n }\n\n private _randomSalt(): string {\n const bytes = new Uint8Array(4);\n\n if (globalThis.crypto?.getRandomValues) {\n globalThis.crypto.getRandomValues(bytes);\n } else {\n for (let i = 0; i < bytes.length; i++) bytes[i] = Math.floor(Math.random() * 256);\n }\n\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, \"0\")).join(\"\");\n }\n\n private _base64UrlEncode(bytes: Uint8Array): string {\n let output = \"\";\n\n for (let i = 0; i < bytes.length; i += 3) {\n const b0 = bytes[i];\n const b1 = i + 1 < bytes.length ? bytes[i + 1] : 0;\n const b2 = i + 2 < bytes.length ? bytes[i + 2] : 0;\n const triplet = (b0 << 16) | (b1 << 8) | b2;\n\n output += this._base64UrlAlphabet[(triplet >>> 18) & 63];\n output += this._base64UrlAlphabet[(triplet >>> 12) & 63];\n if (i + 1 < bytes.length) output += this._base64UrlAlphabet[(triplet >>> 6) & 63];\n if (i + 2 < bytes.length) output += this._base64UrlAlphabet[triplet & 63];\n }\n\n return output;\n }\n\n private _base64UrlDecode(input: string): Uint8Array {\n if (input.length % 4 === 1 || /[^A-Za-z0-9_-]/.test(input)) {\n throw new Error(\"Invalid base64url payload\");\n }\n\n const bytes: number[] = [];\n\n for (let i = 0; i < input.length; i += 4) {\n const c0 = this._base64UrlValue(input[i]);\n const c1 = this._base64UrlValue(input[i + 1]);\n const c2 = i + 2 < input.length ? this._base64UrlValue(input[i + 2]) : 0;\n const c3 = i + 3 < input.length ? this._base64UrlValue(input[i + 3]) : 0;\n const triplet = (c0 << 18) | (c1 << 12) | (c2 << 6) | c3;\n\n bytes.push((triplet >>> 16) & 0xff);\n if (i + 2 < input.length) bytes.push((triplet >>> 8) & 0xff);\n if (i + 3 < input.length) bytes.push(triplet & 0xff);\n }\n\n return new Uint8Array(bytes);\n }\n\n private _base64UrlValue(char: string | undefined): number {\n if (char === undefined) throw new Error(\"Invalid base64url payload\");\n\n const value = this._base64UrlAlphabet.indexOf(char);\n if (value === -1) throw new Error(\"Invalid base64url payload\");\n\n return value;\n }\n\n private _requireKey(key: string | undefined, version: ObfuscatorVersion): string {\n if (typeof key !== \"string\" || key.length === 0) {\n throw new Error(`${version.toUpperCase()} obfuscation requires a non-empty key`);\n }\n\n return key;\n }\n\n private _keyToValues(key: string): number[] {\n return key.split(\"\").map((c) =>\n String(c.charCodeAt(0)).split(\"\").map(Number).reduce((a, b) => a + b, 0)\n );\n }\n}\n\nexport const obfuscator = new Obfuscator();\n"],"mappings":"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","names":[]}