{"version":3,"sources":["emoji.svg","worker.ts","App.tsx","reportWebVitals.ts","index.tsx"],"names":["worker","Worker","messageQueue","queue","idleWakeup","waitForMessage","rejectResult","resolveResult","addEventListener","e","data","error","result","Promise","resolve","reject","a","length","item","shift","message","postMessage","op","args","reply","push","Link","props","rel","children","Hr","className","Button","busy","active","includes","disabled","filter","v","join","ModeHeader","heading","subheading","Input","useState","focus","setFocus","htmlFor","id","label","classList","style","width","onFocus","onBlur","always","conditionals","Object","entries","cond","timing","p","console","time","timeEnd","Verify","secret","setSecret","hash","setHash","setResult","setBusy","doVerification","bcryptVerify","then","ok","finally","type","value","onKeyDown","key","onChange","target","onClick","Generate","cost","setCost","updateHash","bcryptHash","href","String","parseInt","setSelectionRange","select","readOnly","App","mode","setMode","src","emoji","alt","height","position","top","reportWebVitals","onPerfEntry","Function","getCLS","getFID","getFCP","getLCP","getTTFB","ReactDOM","render","StrictMode","document","getElementById"],"mappings":"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","file":"static/js/main.b20ce442.chunk.js","sourcesContent":["export default __webpack_public_path__ + \"static/media/emoji.4871d506.svg\";","var worker = new Worker(\"/sw.js\");\n\ntype QueueItem = {\n op: string;\n args: any[];\n resolve?: (value: T | PromiseLike) => void;\n reject?: (reason?: any) => void;\n};\n\nconst messageQueue = (() => {\n const queue: Array> = [];\n let idleWakeup: (value: void | PromiseLike) => void = () => {};\n function idle() {\n return new Promise((resolve) => {\n idleWakeup = () => {\n idleWakeup = () => {};\n resolve();\n };\n });\n }\n const waitForMessage = (() => {\n let resolveResult: (value: string | PromiseLike) => void = () => {};\n let rejectResult: (reason?: any) => void;\n worker.addEventListener(\"message\", (e) => {\n if (e.data.error) {\n rejectResult(e.data.error);\n } else {\n resolveResult(e.data.result);\n }\n });\n return (): Promise => {\n return new Promise((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n };\n })();\n (async () => {\n for (;;) {\n if (queue.length === 0) {\n await idle();\n continue;\n }\n const item = queue.shift();\n if (!item) {\n continue;\n }\n const message = waitForMessage();\n worker.postMessage({\n op: item.op,\n args: item.args,\n });\n try {\n const reply = await message;\n if (item.resolve) {\n item.resolve(reply);\n }\n } catch (e) {\n if (item.reject) {\n item.reject(e);\n }\n }\n }\n })();\n return function enqueue(item: QueueItem): Promise {\n return new Promise((resolve, reject) => {\n queue.push({ ...item, resolve, reject });\n idleWakeup();\n });\n };\n})();\n\nexport function bcryptVerify(hash: string, secret: string): Promise {\n return messageQueue({\n op: \"bcrypt_verify\",\n args: [hash, secret],\n });\n}\n\nexport function bcryptHash(cost: number, secret: string): Promise {\n return messageQueue({\n op: \"bcrypt_hash\",\n args: [cost, secret],\n });\n}\n","import React, { useState } from \"react\";\nimport \"./App.css\";\nimport emoji from \"./emoji.svg\";\nimport { bcryptHash, bcryptVerify } from \"./worker\";\n\nconst Link = (props: any) => (\n \n {props.children}\n \n);\n\nconst Hr = () => (\n
\n);\n\nfunction noop(...discard: any): void {}\n\nconst Button = (\n props: React.ButtonHTMLAttributes & {\n active?: boolean;\n busy?: boolean;\n }\n) => (\n {\n const { busy, active, ...other } = props;\n noop(busy, active);\n return other;\n })()}\n className={[\n props.className,\n (!props.className || !props.className.includes(\"rounded\")) &&\n \"rounded-md\",\n props.active ? \"underline\" : \"\",\n \"p-2 text-center\",\n \"focus:outline-none\",\n \"dark:text-gray-50\",\n \"text-gray-600\",\n !props.busy && props.disabled ? \"cursor-not-allowed\" : \"\",\n props.busy && props.disabled ? \"cursor-wait\" : \"\",\n props.disabled\n ? \"dark:bg-gray-400\"\n : \"dark:bg-gray-600 dark:active:bg-gray-400 dark:hover:bg-gray-500\", // dark colors\n props.disabled\n ? \"bg-gray-400\"\n : \" bg-gray-100 hover:bg-gray-200 active:bg-gray-400\", // light colors\n ]\n .filter((v) => !!v)\n .join(\" \")}\n >\n {props.children}\n \n);\n\ntype InputProps = React.InputHTMLAttributes & {\n label: string;\n};\n\ninterface IModeHeaderProps {\n heading: string;\n subheading: string;\n}\n\nconst ModeHeader = ({ heading, subheading }: IModeHeaderProps) => {\n return (\n <>\n
{heading}
\n

{subheading}

\n \n );\n};\n\nconst Input = (props: InputProps): JSX.Element => {\n const [focus, setFocus] = useState(false);\n return (\n <>\n
\n \n
\n !focus,\n \"border-gray-500 dark:border-gray-500 \": () => focus,\n }\n )}\n >\n {\n setFocus(true);\n }}\n onBlur={() => {\n setFocus(false);\n }}\n id={props.id}\n />\n \n \n );\n};\n\nconst classList = (\n always: string,\n conditionals: { [k in string]: () => boolean }\n): string => {\n let result = always;\n for (let [className, cond] of Object.entries(conditionals)) {\n if (cond()) {\n result += ` ${className}`;\n }\n }\n return result;\n};\n\nasync function timing(label: string, p: Promise): Promise {\n console.time(label);\n const result = await p;\n console.timeEnd(label);\n return result;\n}\n\nconst Verify = () => {\n const [secret, setSecret] = useState(\"\");\n const [hash, setHash] = useState(\"\");\n const [result, setResult] = useState(null);\n const [busy, setBusy] = useState(false);\n const doVerification = () => {\n if (hash.length === 0 || secret.length === 0) {\n return;\n }\n setBusy(true);\n timing(\"bcrypt_verify\", bcryptVerify(hash, secret))\n .then((ok) => {\n setResult(ok);\n })\n .finally(() => {\n setBusy(false);\n });\n };\n return (\n <>\n \n {result !== null && (\n
\n {result ? (\n \n 🟢 OK — secret provided matches the\n hash\n \n ) : (\n \n 🔴 FAIL — secret provided DOES NOT\n match the hash\n \n )}\n
\n )}\n {\n if (e.key === \"Enter\") {\n doVerification();\n }\n }}\n onChange={(e) => {\n setSecret(e.target.value);\n setResult(null);\n }}\n />\n {\n if (e.key === \"Enter\") {\n doVerification();\n }\n }}\n onChange={(e) => {\n setHash(e.target.value);\n setResult(null);\n }}\n />\n {\n doVerification();\n }}\n disabled={busy || secret.length === 0 || hash.length === 0}\n className=\"w-full mt-4\"\n >\n verify\n \n \n );\n};\n\nconst Generate = () => {\n const DEFAULT_COST = 10;\n const WARNING_COST = 14;\n const IMPOSSIBLE_COST = 20;\n const [secret, setSecret] = useState(\"\");\n const [hash, setHash] = useState(\"\");\n const [cost, setCost] = useState(DEFAULT_COST);\n const [busy, setBusy] = useState(false);\n\n const updateHash = () => {\n if (busy) {\n return;\n }\n setBusy(true);\n timing(\"bcrypt_hash\", bcryptHash(cost, secret))\n .then((hash) => {\n if (secret.length > 0) {\n setHash(hash);\n } else {\n setHash(\"\");\n }\n })\n .finally(() => {\n setBusy(false);\n });\n };\n\n return (\n <>\n \n
\n {\n if (e.key === \"Enter\") {\n updateHash();\n }\n }}\n onChange={(e) => {\n setSecret(e.target.value);\n }}\n />\n {secret.length > 72 && (\n
\n WARNING: bcrypt has a maximum\n password length of 72 characters. so, while this utility will accept\n passwords longer than that, bcrypt will only check the first 72\n characters. (read more on the{\" \"}\n \n wiki\n \n .)\n
\n )}\n {\n const cost = parseInt(e.target.value, 10);\n if (cost <= 31 && cost >= 4) {\n setCost(cost);\n } else if (e.target.value === \"\") {\n setCost(DEFAULT_COST);\n }\n }}\n />\n {cost > WARNING_COST && cost < IMPOSSIBLE_COST && (\n
\n WARNING: setting cost{\" \"}\n greater than 14 leads to very expensive computations. it could take\n a looong time (and is also, not that much more secure,\n so... not worth it really).\n
\n )}\n {cost >= IMPOSSIBLE_COST && (\n
\n \n EVEN MORE STERN WARNING:\n {\" \"}\n setting cost greater than 20 is pretty much not going to work\n unless you have a friggin super-computer or something. but hey... im\n a sign not a cop, do whatever you want!\n
\n )}\n
\n
\n {\n e.target.setSelectionRange(0, e.target.value.length);\n e.target.select();\n }}\n readOnly\n />\n {\n updateHash();\n }}\n disabled={busy || secret.length === 0}\n busy={busy}\n className=\"w-full mt-4\"\n >\n generate\n \n
\n \n );\n};\n\nfunction App() {\n const [mode, setMode] = useState(\"generate\");\n\n return (\n
\n
\n
\n
bcrypt.ninja
\n \n
\n
\n
\n a{\" \"}\n 💯{\" \"}\n percent in-browser \n \n bcrypt\n \n  utility.\n
\n
\n
\n
\n {\n setMode(\"generate\");\n }}\n >\n generate\n \n {\n setMode(\"verify\");\n }}\n >\n verify\n \n
\n {mode === \"generate\" && }\n {mode === \"verify\" && }\n
\n
\n
\n
\n
\n made out of boredrom by{\" \"}\n \n nick\n \n
\n
\n \n github\n \n
\n
\n
\n );\n}\n\nexport default App;\n","import { ReportHandler } from 'web-vitals';\n\nconst reportWebVitals = (onPerfEntry?: ReportHandler) => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from \"react\";\nimport ReactDOM from \"react-dom\";\nimport App from \"./App\";\nimport \"./index.css\";\nimport reportWebVitals from \"./reportWebVitals\";\n\nReactDOM.render(\n \n \n ,\n document.getElementById(\"root\")\n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"sourceRoot":""}