{"version":3,"sources":["../src/Const.ts","../src/Util.ts","../src/ModAsmJs.ts","../src/ModFlash.ts","../src/Scrypt.ts"],"names":["Util","allocBuf","size","_Uint8Array","Array","createBuf","buf","hexToBytes","inStr","outLen","length","outBuf","i","byte","parseInt","substr","isNaN","Error","bytesToHex","inBuf","inLen","outStr","hex","toString","strToBytes","_TextEncoder","window","encode","j","s","encodeURI","n","ch","charCodeAt","bytesToStr","decodeURIComponent","hideDom","el","style","cssText","ModAsmJs","check","load","path","Scrypt","callbackHandler","url","spt","document","createElement","onerror","src","body","appendChild","hash","pass","salt","dkLen","mAsmMod","config","N","r","P","thread","maxPassLen","maxSaltLen","maxDkLen","apply","this","arguments","stop","free","unload","msg","data","ModFlash","getVer","mSwf","createSwf","passHex","saltHex","removeChild","err","box","id","Math","random","innerHTML","mActiveX","swf","firstChild","getPluginVer","plugins","navigator","item","desc","description","match","R_VER","getActiveXVer","ACTIVEX","ver","GetVariable","replace","v","chooseBestMod","list","getAvailableMod","set","ua","userAgent","test","raise","fn","arg1","clearTimer","mLoaderTimer","clearTimeout","mState","mMaxPassLen","mMaxSaltLen","mMaxDkLen","mMod","mAvailableAPI","k","MOD_MAP","push","mod","onload","onready","onprogress","percent","oncomplete","dk","setTimeout","mTimeout","mResPath","param","opt","memCost","maxThread","mMaxThread","taskPerThread","ceil","threadCount","strToBin","str","binToStr","bin","hexToBin","binToHex","setResPath","setResTimeout","ms","asmjs","flash"],"mappings":"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","file":"release/scrypt.js","sourceRoot":"","sourcesContent":["/** defined by uglifyjs */\ndeclare const _RELEASE;\n\n/** @const */\nconst _DEBUG = (typeof _RELEASE == 'undefined');\n\ntype Bytes = Uint8Array | number[];\n","\nmodule Util {\n const _Uint8Array: Uint8ArrayConstructor = window['Uint8Array'];\n\n function allocBuf(size: number) : Bytes {\n return _Uint8Array? new _Uint8Array(size) : new Array(size);\n }\n\n function createBuf(buf: number[]) : Bytes {\n return _Uint8Array? new _Uint8Array(buf) : buf;\n }\n\n\n export function hexToBytes(inStr: string) : Bytes {\n let outLen = inStr.length >> 1;\n let outBuf = allocBuf(outLen);\n\n for (let i = 0; i < outLen; i++) {\n let byte = parseInt(inStr.substr(i * 2, 2), 16);\n if (isNaN(byte)) {\n throw Error('invalid hex data');\n }\n outBuf[i] = byte;\n }\n return outBuf;\n }\n\n export function bytesToHex(inBuf: Bytes) : string {\n let inLen = inBuf.length;\n let outStr = '';\n\n for (let i = 0; i < inLen; i++) {\n let byte = inBuf[i] & 0xff;\n let hex = byte.toString(16);\n if (byte < 16) {\n hex = '0' + hex;\n }\n outStr += hex;\n }\n return outStr;\n }\n\n\n export function strToBytes(inStr: string) : Bytes {\n let _TextEncoder = window['TextEncoder'];\n if (_TextEncoder) {\n return new _TextEncoder().encode(inStr);\n }\n\n let outBuf = [],\n i = 0,\n j = 0,\n s = encodeURI(inStr),\n n = s.length;\n \n while (i < n) {\n let ch = s.charCodeAt(i);\n if (ch == 37) { // '%'\n let hex = s.substr(i + 1, 2);\n ch = parseInt(hex, 16);\n i += 3;\n }\n else {\n i++;\n }\n outBuf[j++] = ch;\n }\n return createBuf(outBuf);\n }\n\n export function bytesToStr(inBuf: Bytes) : string {\n let inLen = inBuf.length;\n let outStr = '';\n\n for (let i = 0; i < inLen; i++) {\n let byte = inBuf[i];\n let hex = byte.toString(16);\n if (byte < 16) {\n hex = '0' + hex;\n }\n outStr += ('%' + hex);\n }\n \n return decodeURIComponent(outStr);\n }\n\n export function hideDom(el: HTMLElement) {\n el.style.cssText = 'position:absolute;top:-999px';\n }\n}","///\n///\n\n\nmodule ModAsmJs {\n let mAsmMod;\n\n \n export function check() {\n return 'Worker' in window;\n }\n \n export function load(path: string) {\n Scrypt['__asmjs_cb'] = callbackHandler;\n\n let url = path + 'asmjs.js';\n if (_DEBUG) {\n url = '/src/mod_asmjs/debug/asmjs.js';\n }\n \n let spt = document.createElement('script');\n\n spt.onerror = function() {\n (ModAsmJs as IMod).onerror('script load fail');\n };\n spt.src = url;\n document.body.appendChild(spt);\n }\n\n export function hash(pass: Bytes, salt: Bytes, dkLen: number) {\n mAsmMod.hash(pass, salt, dkLen);\n }\n \n export function config(\n N: number, r: number, P: number,\n thread: number,\n maxPassLen: number, maxSaltLen: number, maxDkLen: number\n ) {\n mAsmMod['config'].apply(this, arguments);\n }\n \n export function stop() {\n mAsmMod.stop();\n }\n\n export function free() {\n mAsmMod.free();\n }\n\n export function unload() {\n if (mAsmMod) {\n mAsmMod.unload();\n mAsmMod = null;\n }\n }\n\n function callbackHandler(msg, data?) {\n if (msg == 'onload') {\n mAsmMod = data;\n }\n ModAsmJs[msg](data);\n }\n}","///\n///\n\nmodule ModFlash {\n let mSwf: HTMLElement;\n let mActiveX: boolean;\n\n\n export function check() {\n return getVer() >= 18;\n }\n \n export function load(path: string) {\n Scrypt['__flash_cb'] = callbackHandler;\n\n let url = path + 'flash.swf';\n if (_DEBUG) {\n url = '/src/mod_flash/bin-debug/Scrypt.swf';\n }\n \n mSwf = createSwf(url);\n Util.hideDom(mSwf);\n }\n \n export function hash(pass: Bytes, salt: Bytes, dkLen: number) {\n let passHex = Util.bytesToHex(pass);\n let saltHex = Util.bytesToHex(salt);\n \n mSwf['hash'](passHex, saltHex, dkLen);\n }\n \n export function config(\n N: number, r: number, P: number,\n thread: number,\n maxPassLen: number, maxSaltLen: number, maxDkLen: number\n ) {\n mSwf['config'].apply(mSwf, arguments);\n }\n \n export function stop() {\n mSwf['cancel']();\n }\n\n export function free() {\n mSwf['free']();\n mSwf = null;\n }\n\n export function unload() {\n document.body.removeChild(mSwf);\n mSwf = null;\n }\n\n \n function callbackHandler(msg, data?) {\n if (msg == 'oncomplete') {\n data = Util.hexToBytes(data);\n }\n try {\n ModFlash[msg](data);\n } catch (err) {\n throw err;\n }\n }\n\n function createSwf(url: string) : HTMLElement {\n let box = document.createElement('div');\n let id = '_' + (Math.random() * 1e6 | 0);\n\n url = encodeURI(url);\n\n box.innerHTML = mActiveX\n ? ``\n : ``\n \n let swf = box.firstChild as HTMLElement;\n document.body.appendChild(swf);\n return swf;\n }\n\n function toNum(s) {\n return +s.match(/\\d+\\.\\d+/);\n }\n\n\n const R_VER = /\\d+\\.\\d+/;\n\n function getPluginVer() {\n let plugins = navigator.plugins;\n if (!plugins) {\n return;\n }\n let item = plugins['Shockwave Flash'];\n if (!item) {\n return;\n }\n let desc = item.description;\n if (!desc) {\n return;\n }\n return +desc.match(R_VER);\n }\n\n function getActiveXVer() {\n let ACTIVEX = window['ActiveXObject'];\n if (!ACTIVEX) {\n return;\n }\n let ver = '';\n try {\n ver = new ACTIVEX('ShockwaveFlash.ShockwaveFlash')\n .GetVariable('$version')\n .replace(',', '.');\n } catch (err) {\n return;\n }\n return +ver.match(/\\d+\\.\\d+/);\n }\n\n function getVer() : number {\n let v = getPluginVer();\n if (v > 0) {\n return v;\n }\n \n v = getActiveXVer();\n if (v > 0) {\n mActiveX = true;\n return v;\n }\n\n return 0;\n }\n}","///\n///\n///\n///\n///\n\n\nmodule Scrypt {\n\n const MOD_MAP : { [k:string] : IMod} = {\n 'asmjs': ModAsmJs,\n 'flash': ModFlash,\n };\n\n const enum CONST {\n MAX_MEM = 1 << 30, // 1G\n MAX_N = MAX_MEM / 128,\n LOAD_TIMEOUT = 30 * 1000, // 30s\n };\n\n\n const enum STATE {\n NONE,\n LOADING,\n LOADED,\n CONFIGING,\n READY,\n RUNNING,\n };\n\n let mState = STATE.NONE,\n mMod: IMod,\n mAvailableAPI: string[],\n mResPath = '',\n mLoaderTimer = 0,\n mTimeout = CONST.LOAD_TIMEOUT;\n\n\n let mMaxPassLen = 64,\n mMaxSaltLen = 64,\n mMaxDkLen = 64,\n mMaxThread = 1;\n\n\n export let onload: () => void;\n export let onerror: (err: string) => void;\n export let onready: () => void;\n export let onprogress: (percent: number) => void;\n export let oncomplete: (dkHex: string) => void;\n\n\n function chooseBestMod() {\n let list = getAvailableMod();\n let set = {};\n\n for (let i = 0; i < list.length; i++) {\n set[ list[i] ] = true;\n }\n\n // TODO\n let ua = navigator.userAgent;\n if (/Chrome|Firefox|Edge|Safari/.test(ua)) {\n if ('asmjs' in set) {\n return 'asmjs';\n }\n }\n if ('flash' in set) {\n return 'flash';\n }\n return null;\n }\n\n function raise(fn: Function, arg1?) {\n if (!fn) {\n return;\n }\n switch (arguments.length) {\n case 1: return fn();\n case 2: return fn(arg1);\n // ...\n }\n }\n\n function clearTimer() {\n if (mLoaderTimer) {\n clearTimeout(mLoaderTimer);\n mLoaderTimer = 0;\n }\n }\n\n // function test() {\n // const pass = strToBin('pleaseletmein');\n // const salt = strToBin('SodiumChloride');\n // const expected = [\n // 0x25, 0xa9, 0xfa, 0x20, 0x7f, 0x87, 0xca, 0x09,\n // 0xa4, 0xef, 0x8b, 0x9f, 0x77, 0x7a, 0xca, 0x16,\n // 0xbe, 0xb7, 0x84, 0xae, 0x18, 0x30, 0xbf, 0xbf,\n // 0xd3, 0x83, 0x25, 0xaa, 0xbb, 0x93, 0x77, 0xdf,\n // 0x1b, 0xa7, 0x84, 0xd7, 0x46, 0xea, 0x27, 0x3b,\n // 0xf5, 0x16, 0xa4, 0x6f, 0xbf, 0xac, 0xf5, 0x11,\n // 0xc5, 0xbe, 0xba, 0x4c, 0x4a, 0xb3, 0xac, 0xc7,\n // 0xfa, 0x6f, 0x46, 0x0b, 0x6c, 0x0f, 0x47, 0x7b,\n // ];\n // hash(pass, salt);\n // }\n\n export function hash(pass: Bytes, salt: Bytes, dkLen: number) {\n // check state\n if (mState < STATE.LOADED) {\n throw Error('scrypt not loaded');\n }\n if (mState < STATE.READY) {\n throw Error('scrypt not configed');\n }\n if (mState == STATE.RUNNING) {\n throw Error('scrypt is running');\n }\n mState = STATE.RUNNING;\n\n // length check\n if (pass.length > mMaxPassLen) {\n throw Error('pass.length > maxPassLen');\n }\n if (salt.length > mMaxSaltLen) {\n throw Error('salt.length > maxSaltLen');\n }\n if (dkLen > mMaxDkLen) {\n throw Error('dkLen > maxDkLen');\n }\n\n mMod.hash(pass, salt, dkLen);\n }\n \n export function getAvailableMod() {\n if (!mAvailableAPI) {\n mAvailableAPI = [];\n \n for (let k in MOD_MAP) {\n if (MOD_MAP[k].check()) {\n mAvailableAPI.push(k);\n }\n }\n }\n return mAvailableAPI;\n }\n \n export function load(mod?: string) {\n if (mState >= STATE.LOADING) {\n return;\n }\n if (!mod) {\n mod = chooseBestMod();\n if (!mod) {\n throw Error('no available mod');\n }\n }\n mMod = MOD_MAP[mod];\n if (!mMod) {\n throw Error('unsupported mod: ' + mod);\n }\n\n mMod.onload = function() {\n clearTimer();\n raise(onload);\n };\n\n mMod.onerror = function(err) {\n unload();\n raise(onerror, err);\n };\n\n mMod.onready = function() {\n mState = STATE.READY;\n raise(onready);\n };\n\n mMod.onprogress = function(percent) {\n raise(onprogress, percent);\n };\n\n mMod.oncomplete = function(dk) {\n mState = STATE.READY;\n raise(onprogress, 1);\n raise(oncomplete, dk);\n };\n\n // 加载计时\n clearTimer();\n\n mLoaderTimer = setTimeout(function() {\n unload();\n raise(onerror, 'load timeout');\n }, mTimeout);\n\n mState = STATE.LOADING;\n mMod.load(mResPath);\n }\n \n export function stop() {\n mMod.stop();\n mState = STATE.READY;\n }\n \n export function free() {\n if (mState == STATE.READY) {\n mMod.free();\n mState = STATE.LOADED;\n }\n }\n\n export function unload() {\n if (mState != STATE.NONE) {\n mMod.unload();\n mState = STATE.NONE;\n }\n clearTimer();\n }\n \n export function config(param, opt?, test?: boolean) {\n if (!param) {\n throw Error('config() takes at least 1 argument');\n }\n\n let N = param['N'];\n if (! (1 < N && N <= CONST.MAX_N)) {\n throw Error(`param N out of range (1 < N <= 2^23)`);\n }\n if (N & (N - 1)) {\n throw Error('param N must be power of 2');\n }\n N |= 0;\n\n let r = param['r'];\n if (! (0 < r && r < 256)) {\n throw Error('param r out of range (0 < r < 256)');\n }\n r |= 0;\n\n let P = param['P'];\n if (! (0 < P && P < 256)) {\n throw Error('param P out of range (0 < P < 256)');\n }\n P |= 0;\n\n let memCost = N * r * 128;\n if (memCost > CONST.MAX_MEM) {\n throw Error('memory limit exceeded (N * r * 128 > 1G)')\n }\n\n // option param\n if (opt) {\n let maxPassLen = opt['maxPassLen'];\n if (maxPassLen == null) {\n maxPassLen = mMaxPassLen;\n } else if (maxPassLen <= 0) {\n throw Error('invalid maxPassLen');\n }\n\n let maxSaltLen = opt['maxSaltLen'];\n if (maxSaltLen == null) {\n maxSaltLen = mMaxSaltLen;\n } else if (maxSaltLen <= 0) {\n throw Error('invalid maxSaltLen');\n }\n\n let maxDkLen = opt['maxDkLen'];\n if (maxDkLen == null) {\n maxDkLen = mMaxDkLen;\n } else if (maxDkLen <= 0) {\n throw Error('invalid maxDkLen');\n }\n\n let maxThread = opt['maxThread'];\n if (maxThread == null) {\n maxThread = mMaxThread;\n } else if (maxThread <= 0) {\n throw Error('invalid maxThread');\n }\n\n if (!test) {\n mMaxPassLen = maxPassLen;\n mMaxSaltLen = maxSaltLen;\n mMaxDkLen = maxDkLen;\n mMaxThread = maxThread;\n }\n }\n\n // test param\n if (test) {\n return;\n }\n\n let taskPerThread = Math.ceil(P / mMaxThread);\n let threadCount = Math.ceil(P / taskPerThread);\n\n mMod.config(N, r, P, threadCount, mMaxPassLen, mMaxSaltLen, mMaxDkLen);\n\n mState = STATE.CONFIGING;\n }\n \n export function strToBin(str: string) : Bytes {\n return Util.strToBytes(str);\n }\n \n export function binToStr(bin: Bytes) : string {\n return Util.bytesToStr(bin);\n }\n\n export function hexToBin(hex: string) : Bytes {\n if (hex.length & 1) {\n throw Error('invalid hex length');\n }\n return Util.hexToBytes(hex);\n }\n\n export function binToHex(bin: Bytes) : string {\n return Util.bytesToHex(bin);\n }\n\n export function setResPath(path: string) {\n if (! /\\/$/.test(path)) {\n path += '/';\n }\n mResPath = path;\n }\n\n export function setResTimeout(ms: number) {\n mTimeout = ms;\n }\n \n window['scrypt'] = Scrypt;\n}"]}