From c6f7c4ecbbac87a6686b7c9bd5d8ef6ef129d9c3 Mon Sep 17 00:00:00 2001 From: Toshit Chawda Date: Sun, 14 Jul 2024 13:52:20 -0700 Subject: [PATCH] dos2unix --- src/client/beacon.ts | 16 +- src/client/css.ts | 22 +- src/client/element.ts | 230 ++-- src/client/history.ts | 36 +- src/client/index.ts | 40 +- src/client/location.ts | 66 +- src/client/native/eval.ts | 54 +- src/client/requests/fetch.ts | 68 +- src/client/requests/websocket.ts | 30 +- src/client/requests/xmlhttprequest.ts | 40 +- src/client/storage.ts | 142 +-- src/client/trustedTypes.ts | 62 +- src/client/worker.ts | 66 +- src/codecs/aes.ts | 1608 ++++++++++++------------- src/codecs/index.ts | 150 +-- src/scramjet.config.ts | 24 +- src/worker/index.ts | 424 +++---- 17 files changed, 1539 insertions(+), 1539 deletions(-) diff --git a/src/client/beacon.ts b/src/client/beacon.ts index b28a6f4..f533e68 100644 --- a/src/client/beacon.ts +++ b/src/client/beacon.ts @@ -1,9 +1,9 @@ -import { encodeUrl } from "./shared"; - -navigator.sendBeacon = new Proxy(navigator.sendBeacon, { - apply(target, thisArg, argArray) { - argArray[0] = encodeUrl(argArray[0]); - - return Reflect.apply(target, thisArg, argArray); - }, +import { encodeUrl } from "./shared"; + +navigator.sendBeacon = new Proxy(navigator.sendBeacon, { + apply(target, thisArg, argArray) { + argArray[0] = encodeUrl(argArray[0]); + + return Reflect.apply(target, thisArg, argArray); + }, }); \ No newline at end of file diff --git a/src/client/css.ts b/src/client/css.ts index 1490622..1cce64e 100644 --- a/src/client/css.ts +++ b/src/client/css.ts @@ -1,12 +1,12 @@ -import { rewriteCss } from "./shared"; - -const cssProperties = ["background", "background-image", "mask", "mask-image", "list-style", "list-style-image", "border-image", "border-image-source", "cursor"]; -// const jsProperties = ["background", "backgroundImage", "mask", "maskImage", "listStyle", "listStyleImage", "borderImage", "borderImageSource", "cursor"]; - -CSSStyleDeclaration.prototype.setProperty = new Proxy(CSSStyleDeclaration.prototype.setProperty, { - apply(target, thisArg, argArray) { - if (cssProperties.includes(argArray[0])) argArray[1] = rewriteCss(argArray[1]); - - return Reflect.apply(target, thisArg, argArray); - }, +import { rewriteCss } from "./shared"; + +const cssProperties = ["background", "background-image", "mask", "mask-image", "list-style", "list-style-image", "border-image", "border-image-source", "cursor"]; +// const jsProperties = ["background", "backgroundImage", "mask", "maskImage", "listStyle", "listStyleImage", "borderImage", "borderImageSource", "cursor"]; + +CSSStyleDeclaration.prototype.setProperty = new Proxy(CSSStyleDeclaration.prototype.setProperty, { + apply(target, thisArg, argArray) { + if (cssProperties.includes(argArray[0])) argArray[1] = rewriteCss(argArray[1]); + + return Reflect.apply(target, thisArg, argArray); + }, }); \ No newline at end of file diff --git a/src/client/element.ts b/src/client/element.ts index 34a97a3..dbcad41 100644 --- a/src/client/element.ts +++ b/src/client/element.ts @@ -1,115 +1,115 @@ -import { decodeUrl } from "../shared/rewriters/url"; -import { encodeUrl, rewriteCss, rewriteHtml, rewriteJs, rewriteSrcset } from "./shared"; - -const attrObject = { - "nonce": [HTMLElement], - "integrity": [HTMLScriptElement, HTMLLinkElement], - "csp": [HTMLIFrameElement], - "src": [HTMLImageElement, HTMLMediaElement, HTMLIFrameElement, HTMLEmbedElement, HTMLScriptElement], - "href": [HTMLAnchorElement, HTMLLinkElement], - "data": [HTMLObjectElement], - "action": [HTMLFormElement], - "formaction": [HTMLButtonElement, HTMLInputElement], - "srcdoc": [HTMLIFrameElement], - "srcset": [HTMLImageElement, HTMLSourceElement], - "imagesrcset": [HTMLLinkElement] -} - -const attrs = Object.keys(attrObject); - -for (const attr of attrs) { - for (const element of attrObject[attr]) { - const descriptor = Object.getOwnPropertyDescriptor(element.prototype, attr); - Object.defineProperty(element.prototype, attr, { - get() { - if (/src|href|data|action|formaction/.test(attr)) { - return decodeUrl(descriptor.get.call(this)); - } - - if (this.__origattrs[attr]) { - return this.__origattrs[attr]; - } - - return descriptor.get.call(this); - }, - - set(value) { - this.__origattrs[attr] = value; - - if (/nonce|integrity|csp/.test(attr)) { - return; - } else if (/src|href|data|action|formaction/.test(attr)) { - // @ts-expect-error - if (value instanceof TrustedScriptURL) { - return; - } - - value = encodeUrl(value); - } else if (attr === "srcdoc") { - value = rewriteHtml(value); - } else if (/(image)?srcset/.test(attr)) { - value = rewriteSrcset(value); - } - - descriptor.set.call(this, value); - }, - }); - } -} - -declare global { - interface Element { - __origattrs: Record; - } -} - -Element.prototype.__origattrs = {}; - -Element.prototype.getAttribute = new Proxy(Element.prototype.getAttribute, { - apply(target, thisArg, argArray) { - if (attrs.includes(argArray[0]) && thisArg.__origattrs[argArray[0]]) { - return thisArg.__origattrs[argArray[0]]; - } - - return Reflect.apply(target, thisArg, argArray); - }, -}); - -Element.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, { - apply(target, thisArg, argArray) { - if (attrs.includes(argArray[0])) { - thisArg.__origattrs[argArray[0]] = argArray[1]; - if (/nonce|integrity|csp/.test(argArray[0])) { - return; - } else if (/src|href|data|action|formaction/.test(argArray[0])) { - argArray[1] = encodeUrl(argArray[1]); - } else if (argArray[0] === "srcdoc") { - argArray[1] = rewriteHtml(argArray[1]); - } else if (/(image)?srcset/.test(argArray[0])) { - argArray[1] = rewriteSrcset(argArray[1]); - } else if (argArray[1] === "style") { - argArray[1] = rewriteCss(argArray[1]); - } - } - - return Reflect.apply(target, thisArg, argArray); - }, -}); - -const innerHTML = Object.getOwnPropertyDescriptor(Element.prototype, "innerHTML"); - -Object.defineProperty(Element.prototype, "innerHTML", { - set(value) { - // @ts-expect-error - if (this instanceof HTMLScriptElement && !(value instanceof TrustedScript)) { - value = rewriteJs(value); - } else if (this instanceof HTMLStyleElement) { - value = rewriteCss(value); - // @ts-expect-error - } else if (!(value instanceof TrustedHTML)) { - value = rewriteHtml(value); - } - - return innerHTML.set.call(this, value); - }, -}) +import { decodeUrl } from "../shared/rewriters/url"; +import { encodeUrl, rewriteCss, rewriteHtml, rewriteJs, rewriteSrcset } from "./shared"; + +const attrObject = { + "nonce": [HTMLElement], + "integrity": [HTMLScriptElement, HTMLLinkElement], + "csp": [HTMLIFrameElement], + "src": [HTMLImageElement, HTMLMediaElement, HTMLIFrameElement, HTMLEmbedElement, HTMLScriptElement], + "href": [HTMLAnchorElement, HTMLLinkElement], + "data": [HTMLObjectElement], + "action": [HTMLFormElement], + "formaction": [HTMLButtonElement, HTMLInputElement], + "srcdoc": [HTMLIFrameElement], + "srcset": [HTMLImageElement, HTMLSourceElement], + "imagesrcset": [HTMLLinkElement] +} + +const attrs = Object.keys(attrObject); + +for (const attr of attrs) { + for (const element of attrObject[attr]) { + const descriptor = Object.getOwnPropertyDescriptor(element.prototype, attr); + Object.defineProperty(element.prototype, attr, { + get() { + if (/src|href|data|action|formaction/.test(attr)) { + return decodeUrl(descriptor.get.call(this)); + } + + if (this.__origattrs[attr]) { + return this.__origattrs[attr]; + } + + return descriptor.get.call(this); + }, + + set(value) { + this.__origattrs[attr] = value; + + if (/nonce|integrity|csp/.test(attr)) { + return; + } else if (/src|href|data|action|formaction/.test(attr)) { + // @ts-expect-error + if (value instanceof TrustedScriptURL) { + return; + } + + value = encodeUrl(value); + } else if (attr === "srcdoc") { + value = rewriteHtml(value); + } else if (/(image)?srcset/.test(attr)) { + value = rewriteSrcset(value); + } + + descriptor.set.call(this, value); + }, + }); + } +} + +declare global { + interface Element { + __origattrs: Record; + } +} + +Element.prototype.__origattrs = {}; + +Element.prototype.getAttribute = new Proxy(Element.prototype.getAttribute, { + apply(target, thisArg, argArray) { + if (attrs.includes(argArray[0]) && thisArg.__origattrs[argArray[0]]) { + return thisArg.__origattrs[argArray[0]]; + } + + return Reflect.apply(target, thisArg, argArray); + }, +}); + +Element.prototype.setAttribute = new Proxy(Element.prototype.setAttribute, { + apply(target, thisArg, argArray) { + if (attrs.includes(argArray[0])) { + thisArg.__origattrs[argArray[0]] = argArray[1]; + if (/nonce|integrity|csp/.test(argArray[0])) { + return; + } else if (/src|href|data|action|formaction/.test(argArray[0])) { + argArray[1] = encodeUrl(argArray[1]); + } else if (argArray[0] === "srcdoc") { + argArray[1] = rewriteHtml(argArray[1]); + } else if (/(image)?srcset/.test(argArray[0])) { + argArray[1] = rewriteSrcset(argArray[1]); + } else if (argArray[1] === "style") { + argArray[1] = rewriteCss(argArray[1]); + } + } + + return Reflect.apply(target, thisArg, argArray); + }, +}); + +const innerHTML = Object.getOwnPropertyDescriptor(Element.prototype, "innerHTML"); + +Object.defineProperty(Element.prototype, "innerHTML", { + set(value) { + // @ts-expect-error + if (this instanceof HTMLScriptElement && !(value instanceof TrustedScript)) { + value = rewriteJs(value); + } else if (this instanceof HTMLStyleElement) { + value = rewriteCss(value); + // @ts-expect-error + } else if (!(value instanceof TrustedHTML)) { + value = rewriteHtml(value); + } + + return innerHTML.set.call(this, value); + }, +}) diff --git a/src/client/history.ts b/src/client/history.ts index 0bc2e2f..2326774 100644 --- a/src/client/history.ts +++ b/src/client/history.ts @@ -1,18 +1,18 @@ -import { decodeUrl } from "./shared"; - -window.history.pushState = new Proxy(window.history.pushState, { - apply(target, thisArg, argArray) { - argArray[3] = decodeUrl(argArray[3]); - - return Reflect.apply(target, thisArg, argArray); - }, -}); - - -window.history.replaceState = new Proxy(window.history.replaceState, { - apply(target, thisArg, argArray) { - argArray[3] = decodeUrl(argArray[3]); - - return Reflect.apply(target, thisArg, argArray); - }, -}); +import { decodeUrl } from "./shared"; + +window.history.pushState = new Proxy(window.history.pushState, { + apply(target, thisArg, argArray) { + argArray[3] = decodeUrl(argArray[3]); + + return Reflect.apply(target, thisArg, argArray); + }, +}); + + +window.history.replaceState = new Proxy(window.history.replaceState, { + apply(target, thisArg, argArray) { + argArray[3] = decodeUrl(argArray[3]); + + return Reflect.apply(target, thisArg, argArray); + }, +}); diff --git a/src/client/index.ts b/src/client/index.ts index 6c5f50f..65277b1 100644 --- a/src/client/index.ts +++ b/src/client/index.ts @@ -1,21 +1,21 @@ -import "./scope.ts"; -import "./window.ts"; -import "./event.ts"; -import "./native/eval.ts"; -import "./location.ts"; -import "./trustedTypes.ts"; -import "./requests/fetch.ts"; -import "./requests/xmlhttprequest.ts"; -import "./requests/websocket.ts" -import "./element.ts"; -import "./storage.ts"; -import "./css.ts"; -import "./history.ts" -import "./worker.ts"; -import "./url.ts"; - -declare global { - interface Window { - $s: any; - } +import "./scope.ts"; +import "./window.ts"; +import "./event.ts"; +import "./native/eval.ts"; +import "./location.ts"; +import "./trustedTypes.ts"; +import "./requests/fetch.ts"; +import "./requests/xmlhttprequest.ts"; +import "./requests/websocket.ts" +import "./element.ts"; +import "./storage.ts"; +import "./css.ts"; +import "./history.ts" +import "./worker.ts"; +import "./url.ts"; + +declare global { + interface Window { + $s: any; + } } \ No newline at end of file diff --git a/src/client/location.ts b/src/client/location.ts index 089738e..67a3b5a 100644 --- a/src/client/location.ts +++ b/src/client/location.ts @@ -1,33 +1,33 @@ -// @ts-nocheck -import { encodeUrl, decodeUrl } from "./shared"; - -function createLocation() { - const loc = new URL(decodeUrl(location.href)); - loc.assign = (url: string) => location.assign(encodeUrl(url)); - loc.reload = () => location.reload(); - loc.replace = (url: string) => location.replace(encodeUrl(url)); - loc.toString = () => loc.href; - - return loc; -} - -export const locationProxy = new Proxy(window.location, { - get(target, prop) { - const loc = createLocation(); - - return loc[prop]; - }, - - set(obj, prop, value) { - const loc = createLocation(); - - if (prop === "href") { - location.href = encodeUrl(value); - } else { - loc[prop] = value; - } - - return true; - } -}) - +// @ts-nocheck +import { encodeUrl, decodeUrl } from "./shared"; + +function createLocation() { + const loc = new URL(decodeUrl(location.href)); + loc.assign = (url: string) => location.assign(encodeUrl(url)); + loc.reload = () => location.reload(); + loc.replace = (url: string) => location.replace(encodeUrl(url)); + loc.toString = () => loc.href; + + return loc; +} + +export const locationProxy = new Proxy(window.location, { + get(target, prop) { + const loc = createLocation(); + + return loc[prop]; + }, + + set(obj, prop, value) { + const loc = createLocation(); + + if (prop === "href") { + location.href = encodeUrl(value); + } else { + loc[prop] = value; + } + + return true; + } +}) + diff --git a/src/client/native/eval.ts b/src/client/native/eval.ts index 6c2e158..82140b1 100644 --- a/src/client/native/eval.ts +++ b/src/client/native/eval.ts @@ -1,28 +1,28 @@ -import { rewriteJs } from "../shared"; - -const FunctionProxy = new Proxy(Function, { - construct(target, argArray) { - if (argArray.length === 1) { - return Reflect.construct(target, rewriteJs(argArray[0])); - } else { - return Reflect.construct(target, rewriteJs(argArray[argArray.length - 1])) - } - }, - apply(target, thisArg, argArray) { - if (argArray.length === 1) { - return Reflect.apply(target, undefined, [rewriteJs(argArray[0])]); - } else { - return Reflect.apply(target, undefined, [...argArray.map((x, index) => index === argArray.length - 1), rewriteJs(argArray[argArray.length - 1])]) - } - }, -}); - -delete window.Function; - -window.Function = FunctionProxy; - -window.eval = new Proxy(window.eval, { - apply(target, thisArg, argArray) { - return Reflect.apply(target, thisArg, [rewriteJs(argArray[0])]); - }, +import { rewriteJs } from "../shared"; + +const FunctionProxy = new Proxy(Function, { + construct(target, argArray) { + if (argArray.length === 1) { + return Reflect.construct(target, rewriteJs(argArray[0])); + } else { + return Reflect.construct(target, rewriteJs(argArray[argArray.length - 1])) + } + }, + apply(target, thisArg, argArray) { + if (argArray.length === 1) { + return Reflect.apply(target, undefined, [rewriteJs(argArray[0])]); + } else { + return Reflect.apply(target, undefined, [...argArray.map((x, index) => index === argArray.length - 1), rewriteJs(argArray[argArray.length - 1])]) + } + }, +}); + +delete window.Function; + +window.Function = FunctionProxy; + +window.eval = new Proxy(window.eval, { + apply(target, thisArg, argArray) { + return Reflect.apply(target, thisArg, [rewriteJs(argArray[0])]); + }, }) \ No newline at end of file diff --git a/src/client/requests/fetch.ts b/src/client/requests/fetch.ts index 2547f53..5d03543 100644 --- a/src/client/requests/fetch.ts +++ b/src/client/requests/fetch.ts @@ -1,35 +1,35 @@ -// ts throws an error if you dont do window.fetch - -import { encodeUrl, rewriteHeaders } from "../shared"; - -window.fetch = new Proxy(window.fetch, { - apply(target, thisArg, argArray) { - argArray[0] = encodeUrl(argArray[0]); - - return Reflect.apply(target, thisArg, argArray); - }, -}); - -Headers = new Proxy(Headers, { - construct(target, argArray, newTarget) { - argArray[0] = rewriteHeaders(argArray[0]); - - return Reflect.construct(target, argArray, newTarget); - }, -}) - -Request = new Proxy(Request, { - construct(target, argArray, newTarget) { - if (typeof argArray[0] === "string") argArray[0] = encodeUrl(argArray[0]); - - return Reflect.construct(target, argArray, newTarget); - }, -}); - -Response.redirect = new Proxy(Response.redirect, { - apply(target, thisArg, argArray) { - argArray[0] = encodeUrl(argArray[0]); - - return Reflect.apply(target, thisArg, argArray); - }, +// ts throws an error if you dont do window.fetch + +import { encodeUrl, rewriteHeaders } from "../shared"; + +window.fetch = new Proxy(window.fetch, { + apply(target, thisArg, argArray) { + argArray[0] = encodeUrl(argArray[0]); + + return Reflect.apply(target, thisArg, argArray); + }, +}); + +Headers = new Proxy(Headers, { + construct(target, argArray, newTarget) { + argArray[0] = rewriteHeaders(argArray[0]); + + return Reflect.construct(target, argArray, newTarget); + }, +}) + +Request = new Proxy(Request, { + construct(target, argArray, newTarget) { + if (typeof argArray[0] === "string") argArray[0] = encodeUrl(argArray[0]); + + return Reflect.construct(target, argArray, newTarget); + }, +}); + +Response.redirect = new Proxy(Response.redirect, { + apply(target, thisArg, argArray) { + argArray[0] = encodeUrl(argArray[0]); + + return Reflect.apply(target, thisArg, argArray); + }, }); \ No newline at end of file diff --git a/src/client/requests/websocket.ts b/src/client/requests/websocket.ts index 35a2bb5..09aa704 100644 --- a/src/client/requests/websocket.ts +++ b/src/client/requests/websocket.ts @@ -1,16 +1,16 @@ -import { BareClient } from "../shared"; -const client = new BareClient(); - -WebSocket = new Proxy(WebSocket, { - construct(target, args) { - return client.createWebSocket( - args[0], - args[1], - target, - { - "User-Agent": navigator.userAgent - }, - ArrayBuffer.prototype - ) - } +import { BareClient } from "../shared"; +const client = new BareClient(); + +WebSocket = new Proxy(WebSocket, { + construct(target, args) { + return client.createWebSocket( + args[0], + args[1], + target, + { + "User-Agent": navigator.userAgent + }, + ArrayBuffer.prototype + ) + } }) \ No newline at end of file diff --git a/src/client/requests/xmlhttprequest.ts b/src/client/requests/xmlhttprequest.ts index ca426ce..d30da2c 100644 --- a/src/client/requests/xmlhttprequest.ts +++ b/src/client/requests/xmlhttprequest.ts @@ -1,20 +1,20 @@ -import { encodeUrl, rewriteHeaders } from "../shared"; - -XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, { - apply(target, thisArg, argArray) { - if (argArray[1]) argArray[1] = encodeUrl(argArray[1]); - - return Reflect.apply(target, thisArg, argArray); - }, -}); - -XMLHttpRequest.prototype.setRequestHeader = new Proxy(XMLHttpRequest.prototype.setRequestHeader, { - apply(target, thisArg, argArray) { - let headerObject = Object.fromEntries([argArray]); - headerObject = rewriteHeaders(headerObject); - - argArray = Object.entries(headerObject)[0]; - - return Reflect.apply(target, thisArg, argArray); - }, -}); +import { encodeUrl, rewriteHeaders } from "../shared"; + +XMLHttpRequest.prototype.open = new Proxy(XMLHttpRequest.prototype.open, { + apply(target, thisArg, argArray) { + if (argArray[1]) argArray[1] = encodeUrl(argArray[1]); + + return Reflect.apply(target, thisArg, argArray); + }, +}); + +XMLHttpRequest.prototype.setRequestHeader = new Proxy(XMLHttpRequest.prototype.setRequestHeader, { + apply(target, thisArg, argArray) { + let headerObject = Object.fromEntries([argArray]); + headerObject = rewriteHeaders(headerObject); + + argArray = Object.entries(headerObject)[0]; + + return Reflect.apply(target, thisArg, argArray); + }, +}); diff --git a/src/client/storage.ts b/src/client/storage.ts index f81bfc6..0609f26 100644 --- a/src/client/storage.ts +++ b/src/client/storage.ts @@ -1,71 +1,71 @@ -import IDBMapSync from "@webreflection/idb-map/sync"; -import { locationProxy } from "./location"; - -const store = new IDBMapSync(locationProxy.host, { - prefix: "Storage", - durability: "relaxed" -}); - -await store.sync(); - -function storageProxy(scope: Storage): Storage { - - return new Proxy(scope, { - get(target, prop) { - switch (prop) { - case "getItem": - return (key: string) => { - return store.get(key); - } - - case "setItem": - return (key: string, value: string) => { - store.set(key, value); - store.sync(); - } - - case "removeItem": - return (key: string) => { - store.delete(key); - store.sync(); - } - - case "clear": - return () => { - store.clear(); - store.sync(); - } - - case "key": - return (index: number) => { - store.keys()[index]; - } - case "length": - return store.size; - default: - return store.get(prop); - } - }, - - //@ts-ignore - set(target, prop, value) { - store.set(prop, value); - store.sync(); - }, - - defineProperty(target, property, attributes) { - store.set(property as string, attributes.value); - - return true; - }, - }) -} - -const localStorageProxy = storageProxy(window.localStorage); -const sessionStorageProxy = storageProxy(window.sessionStorage); - -delete window.localStorage; -delete window.sessionStorage; - -window.localStorage = localStorageProxy; -window.sessionStorage = sessionStorageProxy; +import IDBMapSync from "@webreflection/idb-map/sync"; +import { locationProxy } from "./location"; + +const store = new IDBMapSync(locationProxy.host, { + prefix: "Storage", + durability: "relaxed" +}); + +await store.sync(); + +function storageProxy(scope: Storage): Storage { + + return new Proxy(scope, { + get(target, prop) { + switch (prop) { + case "getItem": + return (key: string) => { + return store.get(key); + } + + case "setItem": + return (key: string, value: string) => { + store.set(key, value); + store.sync(); + } + + case "removeItem": + return (key: string) => { + store.delete(key); + store.sync(); + } + + case "clear": + return () => { + store.clear(); + store.sync(); + } + + case "key": + return (index: number) => { + store.keys()[index]; + } + case "length": + return store.size; + default: + return store.get(prop); + } + }, + + //@ts-ignore + set(target, prop, value) { + store.set(prop, value); + store.sync(); + }, + + defineProperty(target, property, attributes) { + store.set(property as string, attributes.value); + + return true; + }, + }) +} + +const localStorageProxy = storageProxy(window.localStorage); +const sessionStorageProxy = storageProxy(window.sessionStorage); + +delete window.localStorage; +delete window.sessionStorage; + +window.localStorage = localStorageProxy; +window.sessionStorage = sessionStorageProxy; diff --git a/src/client/trustedTypes.ts b/src/client/trustedTypes.ts index 6856a85..51c6b6f 100644 --- a/src/client/trustedTypes.ts +++ b/src/client/trustedTypes.ts @@ -1,32 +1,32 @@ -import { rewriteHtml, rewriteJs, encodeUrl } from "./shared"; - -// @ts-expect-error -trustedTypes.createPolicy = new Proxy(trustedTypes.createPolicy, { - apply(target, thisArg, argArray) { - if (argArray[1].createHTML) { - argArray[1].createHTML = new Proxy(argArray[1].createHTML, { - apply(target1, thisArg1, argArray1) { - return rewriteHtml(target1(...argArray1)); - }, - }); - } - - if (argArray[1].createScript) { - argArray[1].createScript = new Proxy(argArray[1].createScript, { - apply(target1, thisArg1, argArray1) { - return rewriteJs(target1(...argArray1)); - }, - }); - } - - if (argArray[1].createScriptURL) { - argArray[1].createScriptURL = new Proxy(argArray[1].createScriptURL, { - apply(target1, thisArg1, argArray1) { - return encodeUrl(target1(...argArray1)); - }, - }) - } - - return Reflect.apply(target, thisArg, argArray); - }, +import { rewriteHtml, rewriteJs, encodeUrl } from "./shared"; + +// @ts-expect-error +trustedTypes.createPolicy = new Proxy(trustedTypes.createPolicy, { + apply(target, thisArg, argArray) { + if (argArray[1].createHTML) { + argArray[1].createHTML = new Proxy(argArray[1].createHTML, { + apply(target1, thisArg1, argArray1) { + return rewriteHtml(target1(...argArray1)); + }, + }); + } + + if (argArray[1].createScript) { + argArray[1].createScript = new Proxy(argArray[1].createScript, { + apply(target1, thisArg1, argArray1) { + return rewriteJs(target1(...argArray1)); + }, + }); + } + + if (argArray[1].createScriptURL) { + argArray[1].createScriptURL = new Proxy(argArray[1].createScriptURL, { + apply(target1, thisArg1, argArray1) { + return encodeUrl(target1(...argArray1)); + }, + }) + } + + return Reflect.apply(target, thisArg, argArray); + }, }) \ No newline at end of file diff --git a/src/client/worker.ts b/src/client/worker.ts index 42e85b6..882ad08 100644 --- a/src/client/worker.ts +++ b/src/client/worker.ts @@ -1,34 +1,34 @@ -import { encodeUrl } from "./shared"; - -Worker = new Proxy(Worker, { - construct(target, argArray) { - argArray[0] = encodeUrl(argArray[0]); - - // target is a reference to the object that you are proxying - // Reflect.construct is just a wrapper for calling target - // you could do new target(...argArray) and it would work the same effectively - - return Reflect.construct(target, argArray); - } -}) - -Worklet.prototype.addModule = new Proxy(Worklet.prototype.addModule, { - apply(target, thisArg, argArray) { - argArray[0] = encodeUrl(argArray[0]) - - return Reflect.apply(target, thisArg, argArray); - }, -}); - - -// broken - -// window.importScripts = new Proxy(window.importScripts, { -// apply(target, thisArg, argArray) { -// for (const i in argArray) { -// argArray[i] = encodeUrl(argArray[i]); -// } - -// return Reflect.apply(target, thisArg, argArray); -// }, +import { encodeUrl } from "./shared"; + +Worker = new Proxy(Worker, { + construct(target, argArray) { + argArray[0] = encodeUrl(argArray[0]); + + // target is a reference to the object that you are proxying + // Reflect.construct is just a wrapper for calling target + // you could do new target(...argArray) and it would work the same effectively + + return Reflect.construct(target, argArray); + } +}) + +Worklet.prototype.addModule = new Proxy(Worklet.prototype.addModule, { + apply(target, thisArg, argArray) { + argArray[0] = encodeUrl(argArray[0]) + + return Reflect.apply(target, thisArg, argArray); + }, +}); + + +// broken + +// window.importScripts = new Proxy(window.importScripts, { +// apply(target, thisArg, argArray) { +// for (const i in argArray) { +// argArray[i] = encodeUrl(argArray[i]); +// } + +// return Reflect.apply(target, thisArg, argArray); +// }, // }); \ No newline at end of file diff --git a/src/codecs/aes.ts b/src/codecs/aes.ts index 98767d4..016a9f3 100644 --- a/src/codecs/aes.ts +++ b/src/codecs/aes.ts @@ -1,805 +1,805 @@ -/* eslint-disable */ - -var Nr = 14; -var Nk = 8; -var Decrypt = false; -function enc_utf8(s) { - try { - return unescape(encodeURIComponent(s)); - } catch (e) { - throw "Error on UTF-8 encode"; - } -}; -function dec_utf8(s) { - try { - return decodeURIComponent(escape(s)); - } catch (e) { - throw "Bad Key"; - } -}; -function padBlock(byteArr) { - var array = [], - cpad, - i; - if (byteArr.length < 16) { - cpad = 16 - byteArr.length; - array = [ - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - cpad, - ]; - } - for (i = 0; i < byteArr.length; i++) { - array[i] = byteArr[i]; - } - return array; -}; -function block2s(block, lastBlock) { - var string = "", - padding, - i; - if (lastBlock) { - padding = block[15]; - if (padding > 16) { - throw "Decryption error: Maybe bad key"; - } - if (padding === 16) { - return ""; - } - for (i = 0; i < 16 - padding; i++) { - string += String.fromCharCode(block[i]); - } - } else { - for (i = 0; i < 16; i++) { - string += String.fromCharCode(block[i]); - } - } - return string; -}; -function a2h(numArr) { - var string = "", - i; - for (i = 0; i < numArr.length; i++) { - string += (numArr[i] < 16 ? "0" : "") + numArr[i].toString(16); - } - return string; -}; -function h2a(s) { - var ret = []; - s.replace(/(..)/g, function (s) { - ret.push(parseInt(s, 16)); - }); - return ret; -}; -function s2a(string, binary) { - var array = [], - i; - - if (!binary) { - string = enc_utf8(string); - } - - for (i = 0; i < string.length; i++) { - array[i] = string.charCodeAt(i); - } - - return array; -}; -function size(newsize) { - switch (newsize) { - case 128: - Nr = 10; - Nk = 4; - break; - case 192: - Nr = 12; - Nk = 6; - break; - case 256: - Nr = 14; - Nk = 8; - break; - default: - throw "Invalid Key Size Specified:" + newsize; - } -}; -function randArr(num) { - var result = [], - i; - for (i = 0; i < num; i++) { - result = result.concat(Math.floor(Math.random() * 256)); - } - return result; -}; -function openSSLKey(passwordArr, saltArr) { - var rounds = Nr >= 12 ? 3 : 2, - key = [], - iv = [], - md5_hash = [], - result = [], - data00 = passwordArr.concat(saltArr), - i; - md5_hash[0] = MD5(data00); - result = md5_hash[0]; - for (i = 1; i < rounds; i++) { - md5_hash[i] = MD5(md5_hash[i - 1].concat(data00)); - result = result.concat(md5_hash[i]); - } - key = result.slice(0, 4 * Nk); - iv = result.slice(4 * Nk, 4 * Nk + 16); - return { - key: key, - iv: iv, - }; -}; -function rawEncrypt(plaintext, key, iv) { - key = expandKey(key); - var numBlocks = Math.ceil(plaintext.length / 16), - blocks = [], - i, - cipherBlocks = []; - for (i = 0; i < numBlocks; i++) { - blocks[i] = padBlock(plaintext.slice(i * 16, i * 16 + 16)); - } - if (plaintext.length % 16 === 0) { - blocks.push([ - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - ]); - numBlocks++; - } - for (i = 0; i < blocks.length; i++) { - blocks[i] = - i === 0 - ? xorBlocks(blocks[i], iv) - : xorBlocks(blocks[i], cipherBlocks[i - 1]); - cipherBlocks[i] = encryptBlock(blocks[i], key); - } - return cipherBlocks; -}; -function rawDecrypt(cryptArr, key, iv, binary) { - key = expandKey(key); - var numBlocks = cryptArr.length / 16, - cipherBlocks = [], - i, - plainBlocks = [], - string = ""; - for (i = 0; i < numBlocks; i++) { - cipherBlocks.push(cryptArr.slice(i * 16, (i + 1) * 16)); - } - for (i = cipherBlocks.length - 1; i >= 0; i--) { - plainBlocks[i] = decryptBlock(cipherBlocks[i], key); - plainBlocks[i] = - i === 0 - ? xorBlocks(plainBlocks[i], iv) - : xorBlocks(plainBlocks[i], cipherBlocks[i - 1]); - } - for (i = 0; i < numBlocks - 1; i++) { - string += block2s(plainBlocks[i], false); - } - string += block2s(plainBlocks[i], true); - return binary ? string : dec_utf8(string); -}; -function encryptBlock(block, words) { - Decrypt = false; - var state = addRoundKey(block, words, 0), - round; - for (round = 1; round < Nr + 1; round++) { - state = subBytes(state); - state = shiftRows(state); - if (round < Nr) { - state = mixColumns(state); - } - state = addRoundKey(state, words, round); - } - - return state; -}; -function decryptBlock(block, words) { - Decrypt = true; - var state = addRoundKey(block, words, Nr), - round; - for (round = Nr - 1; round > -1; round--) { - state = shiftRows(state); - state = subBytes(state); - state = addRoundKey(state, words, round); - if (round > 0) { - state = mixColumns(state); - } - } - - return state; -}; -function subBytes(state) { - var S = Decrypt ? SBoxInv : SBox, - temp = [], - i; - for (i = 0; i < 16; i++) { - temp[i] = S[state[i]]; - } - return temp; -}; -function shiftRows(state) { - var temp = [], - shiftBy = Decrypt - ? [0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3] - : [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11], - i; - for (i = 0; i < 16; i++) { - temp[i] = state[shiftBy[i]]; - } - return temp; -}; -function mixColumns(state) { - var t = [], - c; - if (!Decrypt) { - for (c = 0; c < 4; c++) { - t[c * 4] = - G2X[state[c * 4]] ^ - G3X[state[1 + c * 4]] ^ - state[2 + c * 4] ^ - state[3 + c * 4]; - t[1 + c * 4] = - state[c * 4] ^ - G2X[state[1 + c * 4]] ^ - G3X[state[2 + c * 4]] ^ - state[3 + c * 4]; - t[2 + c * 4] = - state[c * 4] ^ - state[1 + c * 4] ^ - G2X[state[2 + c * 4]] ^ - G3X[state[3 + c * 4]]; - t[3 + c * 4] = - G3X[state[c * 4]] ^ - state[1 + c * 4] ^ - state[2 + c * 4] ^ - G2X[state[3 + c * 4]]; - } - } else { - for (c = 0; c < 4; c++) { - t[c * 4] = - GEX[state[c * 4]] ^ - GBX[state[1 + c * 4]] ^ - GDX[state[2 + c * 4]] ^ - G9X[state[3 + c * 4]]; - t[1 + c * 4] = - G9X[state[c * 4]] ^ - GEX[state[1 + c * 4]] ^ - GBX[state[2 + c * 4]] ^ - GDX[state[3 + c * 4]]; - t[2 + c * 4] = - GDX[state[c * 4]] ^ - G9X[state[1 + c * 4]] ^ - GEX[state[2 + c * 4]] ^ - GBX[state[3 + c * 4]]; - t[3 + c * 4] = - GBX[state[c * 4]] ^ - GDX[state[1 + c * 4]] ^ - G9X[state[2 + c * 4]] ^ - GEX[state[3 + c * 4]]; - } - } - - return t; -}; -function addRoundKey(state, words, round) { - var temp = [], - i; - for (i = 0; i < 16; i++) { - temp[i] = state[i] ^ words[round][i]; - } - return temp; -}; -function xorBlocks(block1, block2) { - var temp = [], - i; - for (i = 0; i < 16; i++) { - temp[i] = block1[i] ^ block2[i]; - } - return temp; -}; -function expandKey(key) { - var w = [], - temp = [], - i, - r, - t, - flat = [], - j; - - for (i = 0; i < Nk; i++) { - r = [key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]]; - w[i] = r; - } - - for (i = Nk; i < 4 * (Nr + 1); i++) { - w[i] = []; - for (t = 0; t < 4; t++) { - temp[t] = w[i - 1][t]; - } - if (i % Nk === 0) { - temp = subWord(rotWord(temp)); - temp[0] ^= Rcon[i / Nk - 1]; - } else if (Nk > 6 && i % Nk === 4) { - temp = subWord(temp); - } - for (t = 0; t < 4; t++) { - w[i][t] = w[i - Nk][t] ^ temp[t]; - } - } - for (i = 0; i < Nr + 1; i++) { - flat[i] = []; - for (j = 0; j < 4; j++) { - flat[i].push( - w[i * 4 + j][0], - w[i * 4 + j][1], - w[i * 4 + j][2], - w[i * 4 + j][3] - ); - } - } - return flat; -}; -function subWord(w) { - for (var i = 0; i < 4; i++) { - w[i] = SBox[w[i]]; - } - return w; -}; -function rotWord(w) { - var tmp = w[0], - i; - for (i = 0; i < 3; i++) { - w[i] = w[i + 1]; - } - w[3] = tmp; - return w; -}; -function strhex(str, size) { - var i, - ret = []; - for (i = 0; i < str.length; i += size) { - ret[i / size] = parseInt(str.substr(i, size), 16); - } - return ret; -}; -function invertArr(arr) { - var i, - ret = []; - for (i = 0; i < arr.length; i++) { - ret[arr[i]] = i; - } - return ret; -}; -function Gxx(a, b) { - var i, ret; - - ret = 0; - for (i = 0; i < 8; i++) { - ret = (b & 1) === 1 ? ret ^ a : ret; - a = a > 0x7f ? 0x11b ^ (a << 1) : a << 1; - b >>>= 1; - } - - return ret; -}; -function Gx(x) { - var i, - r = []; - for (i = 0; i < 256; i++) { - r[i] = Gxx(x, i); - } - return r; -}; -var SBox = strhex( - "637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16", - 2 -); -var SBoxInv = invertArr(SBox); -var Rcon = strhex( - "01020408102040801b366cd8ab4d9a2f5ebc63c697356ad4b37dfaefc591", - 2 -); -var G2X = Gx(2); -var G3X = Gx(3); -var G9X = Gx(9); -var GBX = Gx(0xb); -var GDX = Gx(0xd); -var GEX = Gx(0xe); -function enc(string, pass, binary) { - var salt = randArr(8), - pbe = openSSLKey(s2a(pass, binary), salt), - key = pbe.key, - iv = pbe.iv, - cipherBlocks, - saltBlock = [[83, 97, 108, 116, 101, 100, 95, 95].concat(salt)]; - string = s2a(string, binary); - cipherBlocks = rawEncrypt(string, key, iv); - - cipherBlocks = saltBlock.concat(cipherBlocks); - return Base64.encode(cipherBlocks); -}; -function dec(string, pass, binary) { - var cryptArr = Base64.decode(string), - salt = cryptArr.slice(8, 16), - pbe = openSSLKey(s2a(pass, binary), salt), - key = pbe.key, - iv = pbe.iv; - cryptArr = cryptArr.slice(16, cryptArr.length); - - string = rawDecrypt(cryptArr, key, iv, binary); - return string; -}; -function MD5(numArr) { - function rotateLeft(lValue, iShiftBits) { - return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); - } - - function addUnsigned(lX, lY) { - var lX4, lY4, lX8, lY8, lResult; - lX8 = lX & 0x80000000; - lY8 = lY & 0x80000000; - lX4 = lX & 0x40000000; - lY4 = lY & 0x40000000; - lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff); - if (lX4 & lY4) { - return lResult ^ 0x80000000 ^ lX8 ^ lY8; - } - if (lX4 | lY4) { - if (lResult & 0x40000000) { - return lResult ^ 0xc0000000 ^ lX8 ^ lY8; - } else { - return lResult ^ 0x40000000 ^ lX8 ^ lY8; - } - } else { - return lResult ^ lX8 ^ lY8; - } - } - - function f(x, y, z) { - return (x & y) | (~x & z); - } - function g(x, y, z) { - return (x & z) | (y & ~z); - } - function h(x, y, z) { - return x ^ y ^ z; - } - function funcI(x, y, z) { - return y ^ (x | ~z); - } - - function ff(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(f(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - } - - function gg(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(g(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - } - - function hh(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(h(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - } - - function ii(a, b, c, d, x, s, ac) { - a = addUnsigned(a, addUnsigned(addUnsigned(funcI(b, c, d), x), ac)); - return addUnsigned(rotateLeft(a, s), b); - } - - function convertToWordArray(numArr) { - var lWordCount, - lMessageLength = numArr.length, - lNumberOfWords_temp1 = lMessageLength + 8, - lNumberOfWords_temp2 = - (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64, - lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16, - lWordArray = [], - lBytePosition = 0, - lByteCount = 0; - while (lByteCount < lMessageLength) { - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = - lWordArray[lWordCount] | (numArr[lByteCount] << lBytePosition); - lByteCount++; - } - lWordCount = (lByteCount - (lByteCount % 4)) / 4; - lBytePosition = (lByteCount % 4) * 8; - lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); - lWordArray[lNumberOfWords - 2] = lMessageLength << 3; - lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; - return lWordArray; - } - - function wordToHex(lValue) { - var lByte, - lCount, - wordToHexArr = []; - for (lCount = 0; lCount <= 3; lCount++) { - lByte = (lValue >>> (lCount * 8)) & 255; - wordToHexArr = wordToHexArr.concat(lByte); - } - return wordToHexArr; - } - - var x = [], - k, - AA, - BB, - CC, - DD, - a, - b, - c, - d, - rnd = strhex( - "67452301efcdab8998badcfe10325476d76aa478e8c7b756242070dbc1bdceeef57c0faf4787c62aa8304613fd469501698098d88b44f7afffff5bb1895cd7be6b901122fd987193a679438e49b40821f61e2562c040b340265e5a51e9b6c7aad62f105d02441453d8a1e681e7d3fbc821e1cde6c33707d6f4d50d87455a14eda9e3e905fcefa3f8676f02d98d2a4c8afffa39428771f6816d9d6122fde5380ca4beea444bdecfa9f6bb4b60bebfbc70289b7ec6eaa127fad4ef308504881d05d9d4d039e6db99e51fa27cf8c4ac5665f4292244432aff97ab9423a7fc93a039655b59c38f0ccc92ffeff47d85845dd16fa87e4ffe2ce6e0a30143144e0811a1f7537e82bd3af2352ad7d2bbeb86d391", - 8 - ); - - x = convertToWordArray(numArr); - - a = rnd[0]; - b = rnd[1]; - c = rnd[2]; - d = rnd[3]; - - for (k = 0; k < x.length; k += 16) { - AA = a; - BB = b; - CC = c; - DD = d; - a = ff(a, b, c, d, x[k + 0], 7, rnd[4]); - d = ff(d, a, b, c, x[k + 1], 12, rnd[5]); - c = ff(c, d, a, b, x[k + 2], 17, rnd[6]); - b = ff(b, c, d, a, x[k + 3], 22, rnd[7]); - a = ff(a, b, c, d, x[k + 4], 7, rnd[8]); - d = ff(d, a, b, c, x[k + 5], 12, rnd[9]); - c = ff(c, d, a, b, x[k + 6], 17, rnd[10]); - b = ff(b, c, d, a, x[k + 7], 22, rnd[11]); - a = ff(a, b, c, d, x[k + 8], 7, rnd[12]); - d = ff(d, a, b, c, x[k + 9], 12, rnd[13]); - c = ff(c, d, a, b, x[k + 10], 17, rnd[14]); - b = ff(b, c, d, a, x[k + 11], 22, rnd[15]); - a = ff(a, b, c, d, x[k + 12], 7, rnd[16]); - d = ff(d, a, b, c, x[k + 13], 12, rnd[17]); - c = ff(c, d, a, b, x[k + 14], 17, rnd[18]); - b = ff(b, c, d, a, x[k + 15], 22, rnd[19]); - a = gg(a, b, c, d, x[k + 1], 5, rnd[20]); - d = gg(d, a, b, c, x[k + 6], 9, rnd[21]); - c = gg(c, d, a, b, x[k + 11], 14, rnd[22]); - b = gg(b, c, d, a, x[k + 0], 20, rnd[23]); - a = gg(a, b, c, d, x[k + 5], 5, rnd[24]); - d = gg(d, a, b, c, x[k + 10], 9, rnd[25]); - c = gg(c, d, a, b, x[k + 15], 14, rnd[26]); - b = gg(b, c, d, a, x[k + 4], 20, rnd[27]); - a = gg(a, b, c, d, x[k + 9], 5, rnd[28]); - d = gg(d, a, b, c, x[k + 14], 9, rnd[29]); - c = gg(c, d, a, b, x[k + 3], 14, rnd[30]); - b = gg(b, c, d, a, x[k + 8], 20, rnd[31]); - a = gg(a, b, c, d, x[k + 13], 5, rnd[32]); - d = gg(d, a, b, c, x[k + 2], 9, rnd[33]); - c = gg(c, d, a, b, x[k + 7], 14, rnd[34]); - b = gg(b, c, d, a, x[k + 12], 20, rnd[35]); - a = hh(a, b, c, d, x[k + 5], 4, rnd[36]); - d = hh(d, a, b, c, x[k + 8], 11, rnd[37]); - c = hh(c, d, a, b, x[k + 11], 16, rnd[38]); - b = hh(b, c, d, a, x[k + 14], 23, rnd[39]); - a = hh(a, b, c, d, x[k + 1], 4, rnd[40]); - d = hh(d, a, b, c, x[k + 4], 11, rnd[41]); - c = hh(c, d, a, b, x[k + 7], 16, rnd[42]); - b = hh(b, c, d, a, x[k + 10], 23, rnd[43]); - a = hh(a, b, c, d, x[k + 13], 4, rnd[44]); - d = hh(d, a, b, c, x[k + 0], 11, rnd[45]); - c = hh(c, d, a, b, x[k + 3], 16, rnd[46]); - b = hh(b, c, d, a, x[k + 6], 23, rnd[47]); - a = hh(a, b, c, d, x[k + 9], 4, rnd[48]); - d = hh(d, a, b, c, x[k + 12], 11, rnd[49]); - c = hh(c, d, a, b, x[k + 15], 16, rnd[50]); - b = hh(b, c, d, a, x[k + 2], 23, rnd[51]); - a = ii(a, b, c, d, x[k + 0], 6, rnd[52]); - d = ii(d, a, b, c, x[k + 7], 10, rnd[53]); - c = ii(c, d, a, b, x[k + 14], 15, rnd[54]); - b = ii(b, c, d, a, x[k + 5], 21, rnd[55]); - a = ii(a, b, c, d, x[k + 12], 6, rnd[56]); - d = ii(d, a, b, c, x[k + 3], 10, rnd[57]); - c = ii(c, d, a, b, x[k + 10], 15, rnd[58]); - b = ii(b, c, d, a, x[k + 1], 21, rnd[59]); - a = ii(a, b, c, d, x[k + 8], 6, rnd[60]); - d = ii(d, a, b, c, x[k + 15], 10, rnd[61]); - c = ii(c, d, a, b, x[k + 6], 15, rnd[62]); - b = ii(b, c, d, a, x[k + 13], 21, rnd[63]); - a = ii(a, b, c, d, x[k + 4], 6, rnd[64]); - d = ii(d, a, b, c, x[k + 11], 10, rnd[65]); - c = ii(c, d, a, b, x[k + 2], 15, rnd[66]); - b = ii(b, c, d, a, x[k + 9], 21, rnd[67]); - a = addUnsigned(a, AA); - b = addUnsigned(b, BB); - c = addUnsigned(c, CC); - d = addUnsigned(d, DD); - } - - return wordToHex(a).concat(wordToHex(b), wordToHex(c), wordToHex(d)); -}; -// function encString (plaintext, key, iv) { -// var i; -// plaintext = s2a(plaintext, false); - -// key = s2a(key, false); -// for (i = key.length; i < 32; i++) { -// key[i] = 0; -// } - -// if (iv === undefined) { -// } else { -// iv = s2a(iv, false); -// for (i = iv.length; i < 16; i++) { -// iv[i] = 0; -// } -// } - -// var ct = rawEncrypt(plaintext, key, iv); -// var ret = [iv]; -// for (i = 0; i < ct.length; i++) { -// ret[ret.length] = ct[i]; -// } -// return Base64.encode(ret); -// }; -// function decString (ciphertext, key) { -// // var tmp = Base64.decode(ciphertext); -// var tmp = atob(ciphertext); -// var iv = tmp.slice(0, 16); -// var ct = tmp.slice(16, tmp.length); -// var i; - -// key = s2a(key, false); -// for (i = key.length; i < 32; i++) { -// key[i] = 0; -// } - -// var pt = rawDecrypt(ct, key, iv, false); -// return pt; -// }; -// function Base64() { -// var _chars = -// "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", -// chars = _chars.split(""), -// encode = function (b, withBreaks) { -// var flatArr = [], -// b64 = "", -// i, -// broken_b64, -// totalChunks = Math.floor((b.length * 16) / 3); -// for (i = 0; i < b.length * 16; i++) { -// flatArr.push(b[Math.floor(i / 16)][i % 16]); -// } -// for (i = 0; i < flatArr.length; i = i + 3) { -// b64 += chars[flatArr[i] >> 2]; -// b64 += chars[((flatArr[i] & 3) << 4) | (flatArr[i + 1] >> 4)]; -// if (flatArr[i + 1] !== undefined) { -// b64 += chars[((flatArr[i + 1] & 15) << 2) | (flatArr[i + 2] >> 6)]; -// } else { -// b64 += "="; -// } -// if (flatArr[i + 2] !== undefined) { -// b64 += chars[flatArr[i + 2] & 63]; -// } else { -// b64 += "="; -// } -// } -// broken_b64 = b64.slice(0, 64) + "\n"; -// for (i = 1; i < Math.ceil(b64.length / 64); i++) { -// broken_b64 += -// b64.slice(i * 64, i * 64 + 64) + -// (Math.ceil(b64.length / 64) === i + 1 ? "" : "\n"); -// } -// return broken_b64; -// }, -// decode = function (string) { -// string = string.replace(/\n/g, ""); -// var flatArr = [], -// c = [], -// b = [], -// i; -// for (i = 0; i < string.length; i = i + 4) { -// c[0] = _chars.indexOf(string.charAt(i)); -// c[1] = _chars.indexOf(string.charAt(i + 1)); -// c[2] = _chars.indexOf(string.charAt(i + 2)); -// c[3] = _chars.indexOf(string.charAt(i + 3)); - -// b[0] = (c[0] << 2) | (c[1] >> 4); -// b[1] = ((c[1] & 15) << 4) | (c[2] >> 2); -// b[2] = ((c[2] & 3) << 6) | c[3]; -// flatArr.push(b[0], b[1], b[2]); -// } -// flatArr = flatArr.slice(0, flatArr.length - (flatArr.length % 16)); -// return flatArr; -// }; - -// if (typeof Array.indexOf === "function") { -// _chars = chars; -// } - -// return { -// encode: encode, -// decode: decode, -// }; -// } - -const Base64 = { - encode: function (b) { - var _chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", - chars = _chars.split(""), - flatArr = [], - b64 = "", - i, - broken_b64, - totalChunks = Math.floor((b.length * 16) / 3); - for (i = 0; i < b.length * 16; i++) { - flatArr.push(b[Math.floor(i / 16)][i % 16]); - } - for (i = 0; i < flatArr.length; i = i + 3) { - b64 += chars[flatArr[i] >> 2]; - b64 += chars[((flatArr[i] & 3) << 4) | (flatArr[i + 1] >> 4)]; - if (flatArr[i + 1] !== undefined) { - b64 += chars[((flatArr[i + 1] & 15) << 2) | (flatArr[i + 2] >> 6)]; - } else { - b64 += "="; - } - if (flatArr[i + 2] !== undefined) { - b64 += chars[flatArr[i + 2] & 63]; - } else { - b64 += "="; - } - } - broken_b64 = b64.slice(0, 64) + "\n"; - for (i = 1; i < Math.ceil(b64.length / 64); i++) { - broken_b64 += - b64.slice(i * 64, i * 64 + 64) + - (Math.ceil(b64.length / 64) === i + 1 ? "" : "\n"); - } - return broken_b64; - }, - decode: function (string) { - string = string.replace(/\n/g, ""); - var _chars = - "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", - chars = _chars.split(""), - flatArr = [], - c = [], - b = [], - i; - for (i = 0; i < string.length; i = i + 4) { - c[0] = _chars.indexOf(string.charAt(i)); - c[1] = _chars.indexOf(string.charAt(i + 1)); - c[2] = _chars.indexOf(string.charAt(i + 2)); - c[3] = _chars.indexOf(string.charAt(i + 3)); - - b[0] = (c[0] << 2) | (c[1] >> 4); - b[1] = ((c[1] & 15) << 4) | (c[2] >> 2); - b[2] = ((c[2] & 3) << 6) | c[3]; - flatArr.push(b[0], b[1], b[2]); - } - flatArr = flatArr.slice(0, flatArr.length - (flatArr.length % 16)); - return flatArr; - } -} - +/* eslint-disable */ + +var Nr = 14; +var Nk = 8; +var Decrypt = false; +function enc_utf8(s) { + try { + return unescape(encodeURIComponent(s)); + } catch (e) { + throw "Error on UTF-8 encode"; + } +}; +function dec_utf8(s) { + try { + return decodeURIComponent(escape(s)); + } catch (e) { + throw "Bad Key"; + } +}; +function padBlock(byteArr) { + var array = [], + cpad, + i; + if (byteArr.length < 16) { + cpad = 16 - byteArr.length; + array = [ + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + cpad, + ]; + } + for (i = 0; i < byteArr.length; i++) { + array[i] = byteArr[i]; + } + return array; +}; +function block2s(block, lastBlock) { + var string = "", + padding, + i; + if (lastBlock) { + padding = block[15]; + if (padding > 16) { + throw "Decryption error: Maybe bad key"; + } + if (padding === 16) { + return ""; + } + for (i = 0; i < 16 - padding; i++) { + string += String.fromCharCode(block[i]); + } + } else { + for (i = 0; i < 16; i++) { + string += String.fromCharCode(block[i]); + } + } + return string; +}; +function a2h(numArr) { + var string = "", + i; + for (i = 0; i < numArr.length; i++) { + string += (numArr[i] < 16 ? "0" : "") + numArr[i].toString(16); + } + return string; +}; +function h2a(s) { + var ret = []; + s.replace(/(..)/g, function (s) { + ret.push(parseInt(s, 16)); + }); + return ret; +}; +function s2a(string, binary) { + var array = [], + i; + + if (!binary) { + string = enc_utf8(string); + } + + for (i = 0; i < string.length; i++) { + array[i] = string.charCodeAt(i); + } + + return array; +}; +function size(newsize) { + switch (newsize) { + case 128: + Nr = 10; + Nk = 4; + break; + case 192: + Nr = 12; + Nk = 6; + break; + case 256: + Nr = 14; + Nk = 8; + break; + default: + throw "Invalid Key Size Specified:" + newsize; + } +}; +function randArr(num) { + var result = [], + i; + for (i = 0; i < num; i++) { + result = result.concat(Math.floor(Math.random() * 256)); + } + return result; +}; +function openSSLKey(passwordArr, saltArr) { + var rounds = Nr >= 12 ? 3 : 2, + key = [], + iv = [], + md5_hash = [], + result = [], + data00 = passwordArr.concat(saltArr), + i; + md5_hash[0] = MD5(data00); + result = md5_hash[0]; + for (i = 1; i < rounds; i++) { + md5_hash[i] = MD5(md5_hash[i - 1].concat(data00)); + result = result.concat(md5_hash[i]); + } + key = result.slice(0, 4 * Nk); + iv = result.slice(4 * Nk, 4 * Nk + 16); + return { + key: key, + iv: iv, + }; +}; +function rawEncrypt(plaintext, key, iv) { + key = expandKey(key); + var numBlocks = Math.ceil(plaintext.length / 16), + blocks = [], + i, + cipherBlocks = []; + for (i = 0; i < numBlocks; i++) { + blocks[i] = padBlock(plaintext.slice(i * 16, i * 16 + 16)); + } + if (plaintext.length % 16 === 0) { + blocks.push([ + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + ]); + numBlocks++; + } + for (i = 0; i < blocks.length; i++) { + blocks[i] = + i === 0 + ? xorBlocks(blocks[i], iv) + : xorBlocks(blocks[i], cipherBlocks[i - 1]); + cipherBlocks[i] = encryptBlock(blocks[i], key); + } + return cipherBlocks; +}; +function rawDecrypt(cryptArr, key, iv, binary) { + key = expandKey(key); + var numBlocks = cryptArr.length / 16, + cipherBlocks = [], + i, + plainBlocks = [], + string = ""; + for (i = 0; i < numBlocks; i++) { + cipherBlocks.push(cryptArr.slice(i * 16, (i + 1) * 16)); + } + for (i = cipherBlocks.length - 1; i >= 0; i--) { + plainBlocks[i] = decryptBlock(cipherBlocks[i], key); + plainBlocks[i] = + i === 0 + ? xorBlocks(plainBlocks[i], iv) + : xorBlocks(plainBlocks[i], cipherBlocks[i - 1]); + } + for (i = 0; i < numBlocks - 1; i++) { + string += block2s(plainBlocks[i], false); + } + string += block2s(plainBlocks[i], true); + return binary ? string : dec_utf8(string); +}; +function encryptBlock(block, words) { + Decrypt = false; + var state = addRoundKey(block, words, 0), + round; + for (round = 1; round < Nr + 1; round++) { + state = subBytes(state); + state = shiftRows(state); + if (round < Nr) { + state = mixColumns(state); + } + state = addRoundKey(state, words, round); + } + + return state; +}; +function decryptBlock(block, words) { + Decrypt = true; + var state = addRoundKey(block, words, Nr), + round; + for (round = Nr - 1; round > -1; round--) { + state = shiftRows(state); + state = subBytes(state); + state = addRoundKey(state, words, round); + if (round > 0) { + state = mixColumns(state); + } + } + + return state; +}; +function subBytes(state) { + var S = Decrypt ? SBoxInv : SBox, + temp = [], + i; + for (i = 0; i < 16; i++) { + temp[i] = S[state[i]]; + } + return temp; +}; +function shiftRows(state) { + var temp = [], + shiftBy = Decrypt + ? [0, 13, 10, 7, 4, 1, 14, 11, 8, 5, 2, 15, 12, 9, 6, 3] + : [0, 5, 10, 15, 4, 9, 14, 3, 8, 13, 2, 7, 12, 1, 6, 11], + i; + for (i = 0; i < 16; i++) { + temp[i] = state[shiftBy[i]]; + } + return temp; +}; +function mixColumns(state) { + var t = [], + c; + if (!Decrypt) { + for (c = 0; c < 4; c++) { + t[c * 4] = + G2X[state[c * 4]] ^ + G3X[state[1 + c * 4]] ^ + state[2 + c * 4] ^ + state[3 + c * 4]; + t[1 + c * 4] = + state[c * 4] ^ + G2X[state[1 + c * 4]] ^ + G3X[state[2 + c * 4]] ^ + state[3 + c * 4]; + t[2 + c * 4] = + state[c * 4] ^ + state[1 + c * 4] ^ + G2X[state[2 + c * 4]] ^ + G3X[state[3 + c * 4]]; + t[3 + c * 4] = + G3X[state[c * 4]] ^ + state[1 + c * 4] ^ + state[2 + c * 4] ^ + G2X[state[3 + c * 4]]; + } + } else { + for (c = 0; c < 4; c++) { + t[c * 4] = + GEX[state[c * 4]] ^ + GBX[state[1 + c * 4]] ^ + GDX[state[2 + c * 4]] ^ + G9X[state[3 + c * 4]]; + t[1 + c * 4] = + G9X[state[c * 4]] ^ + GEX[state[1 + c * 4]] ^ + GBX[state[2 + c * 4]] ^ + GDX[state[3 + c * 4]]; + t[2 + c * 4] = + GDX[state[c * 4]] ^ + G9X[state[1 + c * 4]] ^ + GEX[state[2 + c * 4]] ^ + GBX[state[3 + c * 4]]; + t[3 + c * 4] = + GBX[state[c * 4]] ^ + GDX[state[1 + c * 4]] ^ + G9X[state[2 + c * 4]] ^ + GEX[state[3 + c * 4]]; + } + } + + return t; +}; +function addRoundKey(state, words, round) { + var temp = [], + i; + for (i = 0; i < 16; i++) { + temp[i] = state[i] ^ words[round][i]; + } + return temp; +}; +function xorBlocks(block1, block2) { + var temp = [], + i; + for (i = 0; i < 16; i++) { + temp[i] = block1[i] ^ block2[i]; + } + return temp; +}; +function expandKey(key) { + var w = [], + temp = [], + i, + r, + t, + flat = [], + j; + + for (i = 0; i < Nk; i++) { + r = [key[4 * i], key[4 * i + 1], key[4 * i + 2], key[4 * i + 3]]; + w[i] = r; + } + + for (i = Nk; i < 4 * (Nr + 1); i++) { + w[i] = []; + for (t = 0; t < 4; t++) { + temp[t] = w[i - 1][t]; + } + if (i % Nk === 0) { + temp = subWord(rotWord(temp)); + temp[0] ^= Rcon[i / Nk - 1]; + } else if (Nk > 6 && i % Nk === 4) { + temp = subWord(temp); + } + for (t = 0; t < 4; t++) { + w[i][t] = w[i - Nk][t] ^ temp[t]; + } + } + for (i = 0; i < Nr + 1; i++) { + flat[i] = []; + for (j = 0; j < 4; j++) { + flat[i].push( + w[i * 4 + j][0], + w[i * 4 + j][1], + w[i * 4 + j][2], + w[i * 4 + j][3] + ); + } + } + return flat; +}; +function subWord(w) { + for (var i = 0; i < 4; i++) { + w[i] = SBox[w[i]]; + } + return w; +}; +function rotWord(w) { + var tmp = w[0], + i; + for (i = 0; i < 3; i++) { + w[i] = w[i + 1]; + } + w[3] = tmp; + return w; +}; +function strhex(str, size) { + var i, + ret = []; + for (i = 0; i < str.length; i += size) { + ret[i / size] = parseInt(str.substr(i, size), 16); + } + return ret; +}; +function invertArr(arr) { + var i, + ret = []; + for (i = 0; i < arr.length; i++) { + ret[arr[i]] = i; + } + return ret; +}; +function Gxx(a, b) { + var i, ret; + + ret = 0; + for (i = 0; i < 8; i++) { + ret = (b & 1) === 1 ? ret ^ a : ret; + a = a > 0x7f ? 0x11b ^ (a << 1) : a << 1; + b >>>= 1; + } + + return ret; +}; +function Gx(x) { + var i, + r = []; + for (i = 0; i < 256; i++) { + r[i] = Gxx(x, i); + } + return r; +}; +var SBox = strhex( + "637c777bf26b6fc53001672bfed7ab76ca82c97dfa5947f0add4a2af9ca472c0b7fd9326363ff7cc34a5e5f171d8311504c723c31896059a071280e2eb27b27509832c1a1b6e5aa0523bd6b329e32f8453d100ed20fcb15b6acbbe394a4c58cfd0efaafb434d338545f9027f503c9fa851a3408f929d38f5bcb6da2110fff3d2cd0c13ec5f974417c4a77e3d645d197360814fdc222a908846eeb814de5e0bdbe0323a0a4906245cc2d3ac629195e479e7c8376d8dd54ea96c56f4ea657aae08ba78252e1ca6b4c6e8dd741f4bbd8b8a703eb5664803f60e613557b986c11d9ee1f8981169d98e949b1e87e9ce5528df8ca1890dbfe6426841992d0fb054bb16", + 2 +); +var SBoxInv = invertArr(SBox); +var Rcon = strhex( + "01020408102040801b366cd8ab4d9a2f5ebc63c697356ad4b37dfaefc591", + 2 +); +var G2X = Gx(2); +var G3X = Gx(3); +var G9X = Gx(9); +var GBX = Gx(0xb); +var GDX = Gx(0xd); +var GEX = Gx(0xe); +function enc(string, pass, binary) { + var salt = randArr(8), + pbe = openSSLKey(s2a(pass, binary), salt), + key = pbe.key, + iv = pbe.iv, + cipherBlocks, + saltBlock = [[83, 97, 108, 116, 101, 100, 95, 95].concat(salt)]; + string = s2a(string, binary); + cipherBlocks = rawEncrypt(string, key, iv); + + cipherBlocks = saltBlock.concat(cipherBlocks); + return Base64.encode(cipherBlocks); +}; +function dec(string, pass, binary) { + var cryptArr = Base64.decode(string), + salt = cryptArr.slice(8, 16), + pbe = openSSLKey(s2a(pass, binary), salt), + key = pbe.key, + iv = pbe.iv; + cryptArr = cryptArr.slice(16, cryptArr.length); + + string = rawDecrypt(cryptArr, key, iv, binary); + return string; +}; +function MD5(numArr) { + function rotateLeft(lValue, iShiftBits) { + return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); + } + + function addUnsigned(lX, lY) { + var lX4, lY4, lX8, lY8, lResult; + lX8 = lX & 0x80000000; + lY8 = lY & 0x80000000; + lX4 = lX & 0x40000000; + lY4 = lY & 0x40000000; + lResult = (lX & 0x3fffffff) + (lY & 0x3fffffff); + if (lX4 & lY4) { + return lResult ^ 0x80000000 ^ lX8 ^ lY8; + } + if (lX4 | lY4) { + if (lResult & 0x40000000) { + return lResult ^ 0xc0000000 ^ lX8 ^ lY8; + } else { + return lResult ^ 0x40000000 ^ lX8 ^ lY8; + } + } else { + return lResult ^ lX8 ^ lY8; + } + } + + function f(x, y, z) { + return (x & y) | (~x & z); + } + function g(x, y, z) { + return (x & z) | (y & ~z); + } + function h(x, y, z) { + return x ^ y ^ z; + } + function funcI(x, y, z) { + return y ^ (x | ~z); + } + + function ff(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(f(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + } + + function gg(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(g(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + } + + function hh(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(h(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + } + + function ii(a, b, c, d, x, s, ac) { + a = addUnsigned(a, addUnsigned(addUnsigned(funcI(b, c, d), x), ac)); + return addUnsigned(rotateLeft(a, s), b); + } + + function convertToWordArray(numArr) { + var lWordCount, + lMessageLength = numArr.length, + lNumberOfWords_temp1 = lMessageLength + 8, + lNumberOfWords_temp2 = + (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64, + lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16, + lWordArray = [], + lBytePosition = 0, + lByteCount = 0; + while (lByteCount < lMessageLength) { + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = + lWordArray[lWordCount] | (numArr[lByteCount] << lBytePosition); + lByteCount++; + } + lWordCount = (lByteCount - (lByteCount % 4)) / 4; + lBytePosition = (lByteCount % 4) * 8; + lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); + lWordArray[lNumberOfWords - 2] = lMessageLength << 3; + lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; + return lWordArray; + } + + function wordToHex(lValue) { + var lByte, + lCount, + wordToHexArr = []; + for (lCount = 0; lCount <= 3; lCount++) { + lByte = (lValue >>> (lCount * 8)) & 255; + wordToHexArr = wordToHexArr.concat(lByte); + } + return wordToHexArr; + } + + var x = [], + k, + AA, + BB, + CC, + DD, + a, + b, + c, + d, + rnd = strhex( + "67452301efcdab8998badcfe10325476d76aa478e8c7b756242070dbc1bdceeef57c0faf4787c62aa8304613fd469501698098d88b44f7afffff5bb1895cd7be6b901122fd987193a679438e49b40821f61e2562c040b340265e5a51e9b6c7aad62f105d02441453d8a1e681e7d3fbc821e1cde6c33707d6f4d50d87455a14eda9e3e905fcefa3f8676f02d98d2a4c8afffa39428771f6816d9d6122fde5380ca4beea444bdecfa9f6bb4b60bebfbc70289b7ec6eaa127fad4ef308504881d05d9d4d039e6db99e51fa27cf8c4ac5665f4292244432aff97ab9423a7fc93a039655b59c38f0ccc92ffeff47d85845dd16fa87e4ffe2ce6e0a30143144e0811a1f7537e82bd3af2352ad7d2bbeb86d391", + 8 + ); + + x = convertToWordArray(numArr); + + a = rnd[0]; + b = rnd[1]; + c = rnd[2]; + d = rnd[3]; + + for (k = 0; k < x.length; k += 16) { + AA = a; + BB = b; + CC = c; + DD = d; + a = ff(a, b, c, d, x[k + 0], 7, rnd[4]); + d = ff(d, a, b, c, x[k + 1], 12, rnd[5]); + c = ff(c, d, a, b, x[k + 2], 17, rnd[6]); + b = ff(b, c, d, a, x[k + 3], 22, rnd[7]); + a = ff(a, b, c, d, x[k + 4], 7, rnd[8]); + d = ff(d, a, b, c, x[k + 5], 12, rnd[9]); + c = ff(c, d, a, b, x[k + 6], 17, rnd[10]); + b = ff(b, c, d, a, x[k + 7], 22, rnd[11]); + a = ff(a, b, c, d, x[k + 8], 7, rnd[12]); + d = ff(d, a, b, c, x[k + 9], 12, rnd[13]); + c = ff(c, d, a, b, x[k + 10], 17, rnd[14]); + b = ff(b, c, d, a, x[k + 11], 22, rnd[15]); + a = ff(a, b, c, d, x[k + 12], 7, rnd[16]); + d = ff(d, a, b, c, x[k + 13], 12, rnd[17]); + c = ff(c, d, a, b, x[k + 14], 17, rnd[18]); + b = ff(b, c, d, a, x[k + 15], 22, rnd[19]); + a = gg(a, b, c, d, x[k + 1], 5, rnd[20]); + d = gg(d, a, b, c, x[k + 6], 9, rnd[21]); + c = gg(c, d, a, b, x[k + 11], 14, rnd[22]); + b = gg(b, c, d, a, x[k + 0], 20, rnd[23]); + a = gg(a, b, c, d, x[k + 5], 5, rnd[24]); + d = gg(d, a, b, c, x[k + 10], 9, rnd[25]); + c = gg(c, d, a, b, x[k + 15], 14, rnd[26]); + b = gg(b, c, d, a, x[k + 4], 20, rnd[27]); + a = gg(a, b, c, d, x[k + 9], 5, rnd[28]); + d = gg(d, a, b, c, x[k + 14], 9, rnd[29]); + c = gg(c, d, a, b, x[k + 3], 14, rnd[30]); + b = gg(b, c, d, a, x[k + 8], 20, rnd[31]); + a = gg(a, b, c, d, x[k + 13], 5, rnd[32]); + d = gg(d, a, b, c, x[k + 2], 9, rnd[33]); + c = gg(c, d, a, b, x[k + 7], 14, rnd[34]); + b = gg(b, c, d, a, x[k + 12], 20, rnd[35]); + a = hh(a, b, c, d, x[k + 5], 4, rnd[36]); + d = hh(d, a, b, c, x[k + 8], 11, rnd[37]); + c = hh(c, d, a, b, x[k + 11], 16, rnd[38]); + b = hh(b, c, d, a, x[k + 14], 23, rnd[39]); + a = hh(a, b, c, d, x[k + 1], 4, rnd[40]); + d = hh(d, a, b, c, x[k + 4], 11, rnd[41]); + c = hh(c, d, a, b, x[k + 7], 16, rnd[42]); + b = hh(b, c, d, a, x[k + 10], 23, rnd[43]); + a = hh(a, b, c, d, x[k + 13], 4, rnd[44]); + d = hh(d, a, b, c, x[k + 0], 11, rnd[45]); + c = hh(c, d, a, b, x[k + 3], 16, rnd[46]); + b = hh(b, c, d, a, x[k + 6], 23, rnd[47]); + a = hh(a, b, c, d, x[k + 9], 4, rnd[48]); + d = hh(d, a, b, c, x[k + 12], 11, rnd[49]); + c = hh(c, d, a, b, x[k + 15], 16, rnd[50]); + b = hh(b, c, d, a, x[k + 2], 23, rnd[51]); + a = ii(a, b, c, d, x[k + 0], 6, rnd[52]); + d = ii(d, a, b, c, x[k + 7], 10, rnd[53]); + c = ii(c, d, a, b, x[k + 14], 15, rnd[54]); + b = ii(b, c, d, a, x[k + 5], 21, rnd[55]); + a = ii(a, b, c, d, x[k + 12], 6, rnd[56]); + d = ii(d, a, b, c, x[k + 3], 10, rnd[57]); + c = ii(c, d, a, b, x[k + 10], 15, rnd[58]); + b = ii(b, c, d, a, x[k + 1], 21, rnd[59]); + a = ii(a, b, c, d, x[k + 8], 6, rnd[60]); + d = ii(d, a, b, c, x[k + 15], 10, rnd[61]); + c = ii(c, d, a, b, x[k + 6], 15, rnd[62]); + b = ii(b, c, d, a, x[k + 13], 21, rnd[63]); + a = ii(a, b, c, d, x[k + 4], 6, rnd[64]); + d = ii(d, a, b, c, x[k + 11], 10, rnd[65]); + c = ii(c, d, a, b, x[k + 2], 15, rnd[66]); + b = ii(b, c, d, a, x[k + 9], 21, rnd[67]); + a = addUnsigned(a, AA); + b = addUnsigned(b, BB); + c = addUnsigned(c, CC); + d = addUnsigned(d, DD); + } + + return wordToHex(a).concat(wordToHex(b), wordToHex(c), wordToHex(d)); +}; +// function encString (plaintext, key, iv) { +// var i; +// plaintext = s2a(plaintext, false); + +// key = s2a(key, false); +// for (i = key.length; i < 32; i++) { +// key[i] = 0; +// } + +// if (iv === undefined) { +// } else { +// iv = s2a(iv, false); +// for (i = iv.length; i < 16; i++) { +// iv[i] = 0; +// } +// } + +// var ct = rawEncrypt(plaintext, key, iv); +// var ret = [iv]; +// for (i = 0; i < ct.length; i++) { +// ret[ret.length] = ct[i]; +// } +// return Base64.encode(ret); +// }; +// function decString (ciphertext, key) { +// // var tmp = Base64.decode(ciphertext); +// var tmp = atob(ciphertext); +// var iv = tmp.slice(0, 16); +// var ct = tmp.slice(16, tmp.length); +// var i; + +// key = s2a(key, false); +// for (i = key.length; i < 32; i++) { +// key[i] = 0; +// } + +// var pt = rawDecrypt(ct, key, iv, false); +// return pt; +// }; +// function Base64() { +// var _chars = +// "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", +// chars = _chars.split(""), +// encode = function (b, withBreaks) { +// var flatArr = [], +// b64 = "", +// i, +// broken_b64, +// totalChunks = Math.floor((b.length * 16) / 3); +// for (i = 0; i < b.length * 16; i++) { +// flatArr.push(b[Math.floor(i / 16)][i % 16]); +// } +// for (i = 0; i < flatArr.length; i = i + 3) { +// b64 += chars[flatArr[i] >> 2]; +// b64 += chars[((flatArr[i] & 3) << 4) | (flatArr[i + 1] >> 4)]; +// if (flatArr[i + 1] !== undefined) { +// b64 += chars[((flatArr[i + 1] & 15) << 2) | (flatArr[i + 2] >> 6)]; +// } else { +// b64 += "="; +// } +// if (flatArr[i + 2] !== undefined) { +// b64 += chars[flatArr[i + 2] & 63]; +// } else { +// b64 += "="; +// } +// } +// broken_b64 = b64.slice(0, 64) + "\n"; +// for (i = 1; i < Math.ceil(b64.length / 64); i++) { +// broken_b64 += +// b64.slice(i * 64, i * 64 + 64) + +// (Math.ceil(b64.length / 64) === i + 1 ? "" : "\n"); +// } +// return broken_b64; +// }, +// decode = function (string) { +// string = string.replace(/\n/g, ""); +// var flatArr = [], +// c = [], +// b = [], +// i; +// for (i = 0; i < string.length; i = i + 4) { +// c[0] = _chars.indexOf(string.charAt(i)); +// c[1] = _chars.indexOf(string.charAt(i + 1)); +// c[2] = _chars.indexOf(string.charAt(i + 2)); +// c[3] = _chars.indexOf(string.charAt(i + 3)); + +// b[0] = (c[0] << 2) | (c[1] >> 4); +// b[1] = ((c[1] & 15) << 4) | (c[2] >> 2); +// b[2] = ((c[2] & 3) << 6) | c[3]; +// flatArr.push(b[0], b[1], b[2]); +// } +// flatArr = flatArr.slice(0, flatArr.length - (flatArr.length % 16)); +// return flatArr; +// }; + +// if (typeof Array.indexOf === "function") { +// _chars = chars; +// } + +// return { +// encode: encode, +// decode: decode, +// }; +// } + +const Base64 = { + encode: function (b) { + var _chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", + chars = _chars.split(""), + flatArr = [], + b64 = "", + i, + broken_b64, + totalChunks = Math.floor((b.length * 16) / 3); + for (i = 0; i < b.length * 16; i++) { + flatArr.push(b[Math.floor(i / 16)][i % 16]); + } + for (i = 0; i < flatArr.length; i = i + 3) { + b64 += chars[flatArr[i] >> 2]; + b64 += chars[((flatArr[i] & 3) << 4) | (flatArr[i + 1] >> 4)]; + if (flatArr[i + 1] !== undefined) { + b64 += chars[((flatArr[i + 1] & 15) << 2) | (flatArr[i + 2] >> 6)]; + } else { + b64 += "="; + } + if (flatArr[i + 2] !== undefined) { + b64 += chars[flatArr[i + 2] & 63]; + } else { + b64 += "="; + } + } + broken_b64 = b64.slice(0, 64) + "\n"; + for (i = 1; i < Math.ceil(b64.length / 64); i++) { + broken_b64 += + b64.slice(i * 64, i * 64 + 64) + + (Math.ceil(b64.length / 64) === i + 1 ? "" : "\n"); + } + return broken_b64; + }, + decode: function (string) { + string = string.replace(/\n/g, ""); + var _chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", + chars = _chars.split(""), + flatArr = [], + c = [], + b = [], + i; + for (i = 0; i < string.length; i = i + 4) { + c[0] = _chars.indexOf(string.charAt(i)); + c[1] = _chars.indexOf(string.charAt(i + 1)); + c[2] = _chars.indexOf(string.charAt(i + 2)); + c[3] = _chars.indexOf(string.charAt(i + 3)); + + b[0] = (c[0] << 2) | (c[1] >> 4); + b[1] = ((c[1] & 15) << 4) | (c[2] >> 2); + b[2] = ((c[2] & 3) << 6) | c[3]; + flatArr.push(b[0], b[1], b[2]); + } + flatArr = flatArr.slice(0, flatArr.length - (flatArr.length % 16)); + return flatArr; + } +} + export { enc, dec }; \ No newline at end of file diff --git a/src/codecs/index.ts b/src/codecs/index.ts index 5b64a77..f8b3958 100644 --- a/src/codecs/index.ts +++ b/src/codecs/index.ts @@ -1,76 +1,76 @@ -import { enc, dec } from "./aes"; - -// for some reason eslint was parsing the type inside of the function params as a variable -export interface Codec { - // eslint-disable-next-line - encode: (str: string | undefined) => string; - // eslint-disable-next-line - decode: (str: string | undefined) => string; -} - -const xor = { - encode: (str: string | undefined, key: number = 2) => { - if (!str) return str; - - return encodeURIComponent(str.split("").map((e, i) => i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e).join("")); - }, - decode: (str: string | undefined, key: number = 2) => { - if (!str) return str; - - return decodeURIComponent(str).split("").map((e, i) => i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e).join(""); - } -} - -const plain = { - encode: (str: string | undefined) => { - if (!str) return str; - - return encodeURIComponent(str); - }, - decode: (str: string | undefined) => { - if (!str) return str; - - return decodeURIComponent(str); - } -} - -/* -const aes = { - encode: (str: string | undefined) => { - if (!str) return str; - - return encodeURIComponent(enc(str, "dynamic").substring(10)); - }, - decode: (str: string | undefined) => { - if (!str) return str; - - return dec("U2FsdGVkX1" + decodeURIComponent(str), "dynamic"); - } -} -*/ - -const none = { - encode: (str: string | undefined) => str, - decode: (str: string | undefined) => str, -} - -const base64 = { - encode: (str: string | undefined) => { - if (!str) return str; - - return decodeURIComponent(btoa(str)); - }, - decode: (str: string | undefined) => { - if (!str) return str; - - return atob(str); - } -} - -if (!self.$scramjet) { - //@ts-expect-error really dumb workaround - self.$scramjet = {} -} -self.$scramjet.codecs = { - none, plain, base64, xor +import { enc, dec } from "./aes"; + +// for some reason eslint was parsing the type inside of the function params as a variable +export interface Codec { + // eslint-disable-next-line + encode: (str: string | undefined) => string; + // eslint-disable-next-line + decode: (str: string | undefined) => string; +} + +const xor = { + encode: (str: string | undefined, key: number = 2) => { + if (!str) return str; + + return encodeURIComponent(str.split("").map((e, i) => i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e).join("")); + }, + decode: (str: string | undefined, key: number = 2) => { + if (!str) return str; + + return decodeURIComponent(str).split("").map((e, i) => i % key ? String.fromCharCode(e.charCodeAt(0) ^ key) : e).join(""); + } +} + +const plain = { + encode: (str: string | undefined) => { + if (!str) return str; + + return encodeURIComponent(str); + }, + decode: (str: string | undefined) => { + if (!str) return str; + + return decodeURIComponent(str); + } +} + +/* +const aes = { + encode: (str: string | undefined) => { + if (!str) return str; + + return encodeURIComponent(enc(str, "dynamic").substring(10)); + }, + decode: (str: string | undefined) => { + if (!str) return str; + + return dec("U2FsdGVkX1" + decodeURIComponent(str), "dynamic"); + } +} +*/ + +const none = { + encode: (str: string | undefined) => str, + decode: (str: string | undefined) => str, +} + +const base64 = { + encode: (str: string | undefined) => { + if (!str) return str; + + return decodeURIComponent(btoa(str)); + }, + decode: (str: string | undefined) => { + if (!str) return str; + + return atob(str); + } +} + +if (!self.$scramjet) { + //@ts-expect-error really dumb workaround + self.$scramjet = {} +} +self.$scramjet.codecs = { + none, plain, base64, xor } \ No newline at end of file diff --git a/src/scramjet.config.ts b/src/scramjet.config.ts index d00051c..fbe6997 100644 --- a/src/scramjet.config.ts +++ b/src/scramjet.config.ts @@ -1,13 +1,13 @@ -if (!self.$scramjet) { - //@ts-expect-error really dumb workaround - self.$scramjet = {} -} -self.$scramjet.config = { - prefix: "/scramjet/", - codec: self.$scramjet.codecs.plain, - config: "/scram/scramjet.config.js", - shared: "/scram/scramjet.shared.js", - worker: "/scram/scramjet.worker.js", - client: "/scram/scramjet.client.js", - codecs: "/scram/scramjet.codecs.js" +if (!self.$scramjet) { + //@ts-expect-error really dumb workaround + self.$scramjet = {} +} +self.$scramjet.config = { + prefix: "/scramjet/", + codec: self.$scramjet.codecs.plain, + config: "/scram/scramjet.config.js", + shared: "/scram/scramjet.shared.js", + worker: "/scram/scramjet.worker.js", + client: "/scram/scramjet.client.js", + codecs: "/scram/scramjet.codecs.js" } \ No newline at end of file diff --git a/src/worker/index.ts b/src/worker/index.ts index c1b1acd..ac7a525 100644 --- a/src/worker/index.ts +++ b/src/worker/index.ts @@ -1,212 +1,212 @@ -import { BareResponseFetch } from "@mercuryworkshop/bare-mux"; -import IDBMap from "@webreflection/idb-map"; - -declare global { - interface Window { - ScramjetServiceWorker; - } -} - -self.ScramjetServiceWorker = class ScramjetServiceWorker { - client: typeof self.$scramjet.shared.BareClient.prototype; - config: typeof self.$scramjet.config; - - constructor(config = self.$scramjet.config) { - this.client = new self.$scramjet.shared.BareClient(); - if (!config.prefix) config.prefix = "/scramjet/"; - this.config = config; - } - - route({ request }: FetchEvent) { - if (request.url.startsWith(location.origin + this.config.prefix)) return true; - else return false; - } - - async fetch({ request }: FetchEvent) { - const urlParam = new URLSearchParams(new URL(request.url).search); - const { encodeUrl, decodeUrl, rewriteHeaders, rewriteHtml, rewriteJs, rewriteCss, rewriteWorkers } = self.$scramjet.shared; - - if (urlParam.has("url")) { - return Response.redirect(encodeUrl(urlParam.get("url"), new URL(urlParam.get("url")))) - } - - try { - const url = new URL(decodeUrl(request.url)); - - const cookieStore = new IDBMap(url.origin, { durability: "relaxed", prefix: "Cookies" }); - - const response: BareResponseFetch = await this.client.fetch(url, { - method: request.method, - body: request.body, - headers: request.headers, - credentials: "omit", - mode: request.mode === "cors" ? request.mode : "same-origin", - cache: request.cache, - redirect: request.redirect, - //@ts-ignore why the fuck is this not typed mircosoft - duplex: "half", - }); - - let responseBody; - const responseHeaders = rewriteHeaders(response.rawHeaders, url); - - for (const cookie of (responseHeaders["set-cookie"] || []) as string[]) { - let cookieParsed = cookie.split(";").map(x=>x.trim().split("=")); - let [key, value] = cookieParsed.shift(); - value = value.replace("\"", ""); - cookieStore.set(key, { value: value, args: cookieParsed }); - } - - if (response.body) { - switch (request.destination) { - case "iframe": - case "document": - if (responseHeaders["content-type"].toString().startsWith("text/html")) { - responseBody = rewriteHtml(await response.text(), url); - } else { - responseBody = response.body; - } - break; - case "script": - responseBody = rewriteJs(await response.text(), url); - break; - case "style": - responseBody = rewriteCss(await response.text(), url); - break; - case "sharedworker": - case "worker": - responseBody = rewriteWorkers(await response.text(), url); - break; - default: - responseBody = response.body; - break; - } - } - // downloads - if (["document", "iframe"].includes(request.destination)) { - const header = responseHeaders["content-disposition"]; - - // validate header and test for filename - if (!/\s*?((inline|attachment);\s*?)filename=/i.test(header)) { - // if filename= wasn"t specified then maybe the remote specified to download this as an attachment? - // if it"s invalid then we can still possibly test for the attachment/inline type - const type = /^\s*?attachment/i.test(header) - ? "attachment" - : "inline"; - - // set the filename - const [filename] = new URL(response.finalURL).pathname - .split("/") - .slice(-1); - - responseHeaders[ - "content-disposition" - ] = `${type}; filename=${JSON.stringify(filename)}`; - } - } - if (responseHeaders["accept"] === "text/event-stream") { - responseHeaders["content-type"] = "text/event-stream"; - } - if (crossOriginIsolated) { - responseHeaders["Cross-Origin-Embedder-Policy"] = "require-corp"; - } - - return new Response(responseBody, { - headers: responseHeaders as HeadersInit, - status: response.status, - statusText: response.statusText - }) - } catch (err) { - if (!["document", "iframe"].includes(request.destination)) - return new Response(undefined, { status: 500 }); - - console.error(err); - - return renderError(err, decodeUrl(request.url)); - } - } -} - - -function errorTemplate( - trace: string, - fetchedURL: string, -) { - // turn script into a data URI so we don"t have to escape any HTML values - const script = ` - errorTrace.value = ${JSON.stringify(trace)}; - fetchedURL.textContent = ${JSON.stringify(fetchedURL)}; - for (const node of document.querySelectorAll("#hostname")) node.textContent = ${JSON.stringify( - location.hostname - )}; - reload.addEventListener("click", () => location.reload()); - version.textContent = "0.0.1"; - ` - - return ( - ` - - - - Error - - - -

Error processing your request

-
-

Failed to load

-

Internal Server Error

- -

Try:

-
    -
  • Checking your internet connection
  • -
  • Verifying you entered the correct address
  • -
  • Clearing the site data
  • -
  • Contacting "s administrator
  • -
  • Verify the server isn"t censored
  • -
-

If you"re the administrator of , try:

-
    -
  • Restarting your server
  • -
  • Updating Scramjet
  • -
  • Troubleshooting the error on the GitHub repository
  • -
- -
-

Scramjet v

- - - - ` - ); -} - -/** - * - * @param {unknown} err - * @param {string} fetchedURL - */ -function renderError(err, fetchedURL) { - const headers = { - "content-type": "text/html", - }; - if (crossOriginIsolated) { - headers["Cross-Origin-Embedd'er-Policy"] = "require-corp"; - } - - return new Response( - errorTemplate( - String(err), - fetchedURL - ), - { - status: 500, - headers: headers - } - ); -} - +import { BareResponseFetch } from "@mercuryworkshop/bare-mux"; +import IDBMap from "@webreflection/idb-map"; + +declare global { + interface Window { + ScramjetServiceWorker; + } +} + +self.ScramjetServiceWorker = class ScramjetServiceWorker { + client: typeof self.$scramjet.shared.BareClient.prototype; + config: typeof self.$scramjet.config; + + constructor(config = self.$scramjet.config) { + this.client = new self.$scramjet.shared.BareClient(); + if (!config.prefix) config.prefix = "/scramjet/"; + this.config = config; + } + + route({ request }: FetchEvent) { + if (request.url.startsWith(location.origin + this.config.prefix)) return true; + else return false; + } + + async fetch({ request }: FetchEvent) { + const urlParam = new URLSearchParams(new URL(request.url).search); + const { encodeUrl, decodeUrl, rewriteHeaders, rewriteHtml, rewriteJs, rewriteCss, rewriteWorkers } = self.$scramjet.shared; + + if (urlParam.has("url")) { + return Response.redirect(encodeUrl(urlParam.get("url"), new URL(urlParam.get("url")))) + } + + try { + const url = new URL(decodeUrl(request.url)); + + const cookieStore = new IDBMap(url.origin, { durability: "relaxed", prefix: "Cookies" }); + + const response: BareResponseFetch = await this.client.fetch(url, { + method: request.method, + body: request.body, + headers: request.headers, + credentials: "omit", + mode: request.mode === "cors" ? request.mode : "same-origin", + cache: request.cache, + redirect: request.redirect, + //@ts-ignore why the fuck is this not typed mircosoft + duplex: "half", + }); + + let responseBody; + const responseHeaders = rewriteHeaders(response.rawHeaders, url); + + for (const cookie of (responseHeaders["set-cookie"] || []) as string[]) { + let cookieParsed = cookie.split(";").map(x=>x.trim().split("=")); + let [key, value] = cookieParsed.shift(); + value = value.replace("\"", ""); + cookieStore.set(key, { value: value, args: cookieParsed }); + } + + if (response.body) { + switch (request.destination) { + case "iframe": + case "document": + if (responseHeaders["content-type"].toString().startsWith("text/html")) { + responseBody = rewriteHtml(await response.text(), url); + } else { + responseBody = response.body; + } + break; + case "script": + responseBody = rewriteJs(await response.text(), url); + break; + case "style": + responseBody = rewriteCss(await response.text(), url); + break; + case "sharedworker": + case "worker": + responseBody = rewriteWorkers(await response.text(), url); + break; + default: + responseBody = response.body; + break; + } + } + // downloads + if (["document", "iframe"].includes(request.destination)) { + const header = responseHeaders["content-disposition"]; + + // validate header and test for filename + if (!/\s*?((inline|attachment);\s*?)filename=/i.test(header)) { + // if filename= wasn"t specified then maybe the remote specified to download this as an attachment? + // if it"s invalid then we can still possibly test for the attachment/inline type + const type = /^\s*?attachment/i.test(header) + ? "attachment" + : "inline"; + + // set the filename + const [filename] = new URL(response.finalURL).pathname + .split("/") + .slice(-1); + + responseHeaders[ + "content-disposition" + ] = `${type}; filename=${JSON.stringify(filename)}`; + } + } + if (responseHeaders["accept"] === "text/event-stream") { + responseHeaders["content-type"] = "text/event-stream"; + } + if (crossOriginIsolated) { + responseHeaders["Cross-Origin-Embedder-Policy"] = "require-corp"; + } + + return new Response(responseBody, { + headers: responseHeaders as HeadersInit, + status: response.status, + statusText: response.statusText + }) + } catch (err) { + if (!["document", "iframe"].includes(request.destination)) + return new Response(undefined, { status: 500 }); + + console.error(err); + + return renderError(err, decodeUrl(request.url)); + } + } +} + + +function errorTemplate( + trace: string, + fetchedURL: string, +) { + // turn script into a data URI so we don"t have to escape any HTML values + const script = ` + errorTrace.value = ${JSON.stringify(trace)}; + fetchedURL.textContent = ${JSON.stringify(fetchedURL)}; + for (const node of document.querySelectorAll("#hostname")) node.textContent = ${JSON.stringify( + location.hostname + )}; + reload.addEventListener("click", () => location.reload()); + version.textContent = "0.0.1"; + ` + + return ( + ` + + + + Error + + + +

Error processing your request

+
+

Failed to load

+

Internal Server Error

+ +

Try:

+
    +
  • Checking your internet connection
  • +
  • Verifying you entered the correct address
  • +
  • Clearing the site data
  • +
  • Contacting "s administrator
  • +
  • Verify the server isn"t censored
  • +
+

If you"re the administrator of , try:

+
    +
  • Restarting your server
  • +
  • Updating Scramjet
  • +
  • Troubleshooting the error on the GitHub repository
  • +
+ +
+

Scramjet v

+ + + + ` + ); +} + +/** + * + * @param {unknown} err + * @param {string} fetchedURL + */ +function renderError(err, fetchedURL) { + const headers = { + "content-type": "text/html", + }; + if (crossOriginIsolated) { + headers["Cross-Origin-Embedd'er-Policy"] = "require-corp"; + } + + return new Response( + errorTemplate( + String(err), + fetchedURL + ), + { + status: 500, + headers: headers + } + ); +} +