friendly-challenge
Version:
The client code used for FriendlyCaptcha (widget script, html, styling and webworker solvers)
560 lines (553 loc) • 29.6 kB
JavaScript
(function(){'use strict';var f,g=[];function l(a){g.push(a);1==g.length&&f()}function m(){for(;g.length;)g[0](),g.shift()}f=function(){setTimeout(m)};function n(a){this.a=p;this.b=void 0;this.f=[];var b=this;try{a(function(a){q(b,a)},function(a){r(b,a)})}catch(c){r(b,c)}}var p=2;function t(a){return new n(function(b,c){c(a)})}function u(a){return new n(function(b){b(a)})}function q(a,b){if(a.a==p){if(b==a)throw new TypeError;var c=!1;try{var d=b&&b.then;if(null!=b&&"object"==typeof b&&"function"==typeof d){d.call(b,function(b){c||q(a,b);c=!0},function(b){c||r(a,b);c=!0});return}}catch(e){c||r(a,e);return}a.a=0;a.b=b;v(a)}}
function r(a,b){if(a.a==p){if(b==a)throw new TypeError;a.a=1;a.b=b;v(a)}}function v(a){l(function(){if(a.a!=p)for(;a.f.length;){var b=a.f.shift(),c=b[0],d=b[1],e=b[2],b=b[3];try{0==a.a?"function"==typeof c?e(c.call(void 0,a.b)):e(a.b):1==a.a&&("function"==typeof d?e(d.call(void 0,a.b)):b(a.b))}catch(h){b(h)}}})}n.prototype.g=function(a){return this.c(void 0,a)};n.prototype.c=function(a,b){var c=this;return new n(function(d,e){c.f.push([a,b,d,e]);v(c)})};
function w(a){return new n(function(b,c){function d(c){return function(d){h[c]=d;e+=1;e==a.length&&b(h)}}var e=0,h=[];0==a.length&&b(h);for(var k=0;k<a.length;k+=1)u(a[k]).c(d(k),c)})}function x(a){return new n(function(b,c){for(var d=0;d<a.length;d+=1)u(a[d]).c(b,c)})};self.Promise||(self.Promise=n,self.Promise.resolve=u,self.Promise.reject=t,self.Promise.race=x,self.Promise.all=w,self.Promise.prototype.then=n.prototype.c,self.Promise.prototype["catch"]=n.prototype.g);}());
;
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
(function () {
'use strict';
// Adapted from the base64-arraybuffer package implementation
// (https://github.com/niklasvh/base64-arraybuffer, MIT licensed)
var CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var EQ_CHAR = "=".charCodeAt(0);
// Use a lookup table to find the index.
var lookup = new Uint8Array(256);
for (var i = 0; i < CHARS.length; i++) {
lookup[CHARS.charCodeAt(i)] = i;
}
function decode(base64) {
var len = base64.length;
var bufferLength = len * 3 >>> 2; // * 0.75
if (base64.charCodeAt(len - 1) === EQ_CHAR) bufferLength--;
if (base64.charCodeAt(len - 2) === EQ_CHAR) bufferLength--;
var bytes = new Uint8Array(bufferLength);
for (var _i = 0, p = 0; _i < len; _i += 4) {
var encoded1 = lookup[base64.charCodeAt(_i + 0)];
var encoded2 = lookup[base64.charCodeAt(_i + 1)];
var encoded3 = lookup[base64.charCodeAt(_i + 2)];
var encoded4 = lookup[base64.charCodeAt(_i + 3)];
bytes[p++] = encoded1 << 2 | encoded2 >> 4;
bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;
bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;
}
return bytes;
}
// WARNING: This file was autogenerated by wasmwrap and should not be edited manually.
var base64 = "AGFzbQEAAAABKghgAABgAn9/AGADf39/AX9gAX8AYAR/f39/AGAAAX9gAX8Bf2ACf38BfwINAQNlbnYFYWJvcnQABAMMCwcGAwAAAQIFAQIABQMBAAEGFgR/AUEAC38BQQALfwBBAwt/AEHgDAsHbgkGbWVtb3J5AgAHX19hbGxvYwABCF9fcmV0YWluAAIJX19yZWxlYXNlAAMJX19jb2xsZWN0AAQHX19yZXNldAAFC19fcnR0aV9iYXNlAwMNVWludDhBcnJheV9JRAMCDHNvbHZlQmxha2UyYgAKCAELCvQSC5IBAQV/IABB8P///wNLBEAACyMBQRBqIgQgAEEPakFwcSICQRAgAkEQSxsiBmoiAj8AIgVBEHQiA0sEQCAFIAIgA2tB//8DakGAgHxxQRB2IgMgBSADShtAAEEASARAIANAAEEASARAAAsLCyACJAEgBEEQayICIAY2AgAgAkEBNgIEIAIgATYCCCACIAA2AgwgBAsEACAACwMAAQsDAAELBgAjACQBC7sCAQF/AkAgAUUNACAAQQA6AAAgACABakEEayICQQA6AAMgAUECTQ0AIABBADoAASAAQQA6AAIgAkEAOgACIAJBADoAASABQQZNDQAgAEEAOgADIAJBADoAACABQQhNDQAgAEEAIABrQQNxIgJqIgBBADYCACAAIAEgAmtBfHEiAmpBHGsiAUEANgIYIAJBCE0NACAAQQA2AgQgAEEANgIIIAFBADYCECABQQA2AhQgAkEYTQ0AIABBADYCDCAAQQA2AhAgAEEANgIUIABBADYCGCABQQA2AgAgAUEANgIEIAFBADYCCCABQQA2AgwgACAAQQRxQRhqIgFqIQAgAiABayEBA0AgAUEgTwRAIABCADcDACAAQgA3AwggAEIANwMQIABCADcDGCABQSBrIQEgAEEgaiEADAELCwsLcgACfyAARQRAQQxBAhABIQALIAALQQA2AgAgAEEANgIEIABBADYCCCABQfD///8DIAJ2SwRAQcAKQfAKQRJBORAAAAsgASACdCIBQQAQASICIAEQBiAAKAIAGiAAIAI2AgAgACACNgIEIAAgATYCCCAAC88BAQJ/QaABQQAQASIAQQxBAxABQYABQQAQBzYCACAAQQxBBBABQQhBAxAHNgIEIABCADcDCCAAQQA2AhAgAEIANwMYIABC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";
// This is a hand-pruned version of the assemblyscript loader, removing
// a lot of functionality we don't need, saving in bundle size.
function addUtilityExports(instance) {
var extendedExports = {};
var exports = instance.exports;
var memory = exports.memory;
var alloc = exports["__alloc"];
var retain = exports["__retain"];
var rttiBase = exports["__rtti_base"] || ~0; // oob if not present
/** Gets the runtime type info for the given id. */
function getInfo(id) {
var U32 = new Uint32Array(memory.buffer);
// const count = U32[rttiBase >>> 2];
// if ((id >>>= 0) >= count) throw Error("invalid id: " + id);
return U32[(rttiBase + 4 >>> 2) + id * 2];
}
/** Allocates a new array in the module's memory and returns its retained pointer. */
extendedExports.__allocArray = function (id, values) {
var info = getInfo(id);
var align = 31 - Math.clz32(info >>> 6 & 31);
var length = values.length;
var buf = alloc(length << align, 0);
var arr = alloc(12, id);
var U32 = new Uint32Array(memory.buffer);
U32[arr + 0 >>> 2] = retain(buf);
U32[arr + 4 >>> 2] = buf;
U32[arr + 8 >>> 2] = length << align;
var buffer = memory.buffer;
var view = new Uint8Array(buffer);
if (info & 1 << 14) {
for (var _i2 = 0; _i2 < length; ++_i2) view[(buf >>> align) + _i2] = retain(values[_i2]);
} else {
view.set(values, buf >>> align);
}
return arr;
};
extendedExports.__getUint8Array = function (ptr) {
var U32 = new Uint32Array(memory.buffer);
var bufPtr = U32[ptr + 4 >>> 2];
return new Uint8Array(memory.buffer, bufPtr, U32[bufPtr - 4 >>> 2] >>> 0);
};
return demangle(exports, extendedExports);
}
/** Demangles an AssemblyScript module's exports to a friendly object structure. */
function demangle(exports) {
var extendedExports = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
// extendedExports = Object.create(extendedExports);
var setArgumentsLength = exports["__argumentsLength"] ? function (length) {
exports["__argumentsLength"].value = length;
} : exports["__setArgumentsLength"] || exports["__setargc"] || function () {
return {};
};
var _loop = function _loop() {
if (!Object.prototype.hasOwnProperty.call(exports, internalName)) return 1; // continue
var elem = exports[internalName];
// Only necessary if nested exports are present
// let parts = internalName.split(".");
// let curr = extendedExports;
// while (parts.length > 1) {
// let part = parts.shift();
// if (!Object.prototype.hasOwnProperty.call(curr, part as any)) curr[part as any] = {};
// curr = curr[part as any];
// }
var name = internalName.split(".")[0];
if (typeof elem === "function" && elem !== setArgumentsLength) {
(extendedExports[name] = function () {
setArgumentsLength(arguments.length);
return elem.apply(void 0, arguments);
}).original = elem;
} else {
extendedExports[name] = elem;
}
};
for (var internalName in exports) {
if (_loop()) continue;
}
return extendedExports;
}
function instantiateWasmSolver(module) {
return new Promise(function ($return, $error) {
var imports, result, exports;
imports = {
env: {
abort: function abort() {
throw Error("Wasm aborted");
}
}
};
return Promise.resolve(WebAssembly.instantiate(module, imports)).then(function ($await_7) {
try {
result = $await_7;
exports = addUtilityExports(result);
return $return({
exports: exports
});
} catch ($boundEx) {
return $error($boundEx);
}
}, $error);
});
}
function getWasmSolver(module) {
return new Promise(function ($return, $error) {
var w, arrPtr, solution;
return Promise.resolve(instantiateWasmSolver(module)).then(function ($await_8) {
try {
w = $await_8;
arrPtr = w.exports.__retain(w.exports.__allocArray(w.exports.Uint8Array_ID, new Uint8Array(128)));
solution = w.exports.__getUint8Array(arrPtr);
return $return(function (puzzleBuffer, threshold) {
var n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 4294967295;
solution.set(puzzleBuffer);
var hashPtr = w.exports.solveBlake2b(arrPtr, threshold, n);
solution = w.exports.__getUint8Array(arrPtr);
var hash = w.exports.__getUint8Array(hashPtr);
w.exports.__release(hashPtr);
return [solution, hash];
});
} catch ($boundEx) {
return $error($boundEx);
}
}, $error);
});
}
// Blake2B made assemblyscript compatible, adapted from (CC0 licensed):
// Blake2B in pure Javascript
// Adapted from the reference implementation in RFC7693
// Ported to Javascript by DC - https://github.com/dcposch
var Context = /*#__PURE__*/_createClass(function Context(outlen) {
_classCallCheck(this, Context);
this.b = new Uint8Array(128);
this.h = new Uint32Array(16);
this.t = 0; // input count
this.c = 0; // pointer within buffer
this.v = new Uint32Array(32);
this.m = new Uint32Array(32);
this.outlen = outlen;
}); // Little-endian byte access
function B2B_GET32(arr, i) {
return arr[i] ^ arr[i + 1] << 8 ^ arr[i + 2] << 16 ^ arr[i + 3] << 24;
}
// G Mixing function with everything inlined
// performance at the cost of readability, especially faster in old browsers
function B2B_G_FAST(v, m, a, b, c, d, ix, iy) {
var x0 = m[ix];
var x1 = m[ix + 1];
var y0 = m[iy];
var y1 = m[iy + 1];
// va0 are the low bits, va1 are the high bits
var va0 = v[a];
var va1 = v[a + 1];
var vb0 = v[b];
var vb1 = v[b + 1];
var vc0 = v[c];
var vc1 = v[c + 1];
var vd0 = v[d];
var vd1 = v[d + 1];
var w0, ww, xor0, xor1;
// ADD64AA(v, a, b); // v[a,a+1] += v[b,b+1] ... in JS we must store a uint64 as two uint32s
// ADD64AA(v,a,b)
w0 = va0 + vb0;
ww = (va0 & vb0 | (va0 | vb0) & ~w0) >>> 31;
va0 = w0;
va1 = va1 + vb1 + ww;
// // ADD64AC(v, a, x0, x1); // v[a, a+1] += x ... x0 is the low 32 bits of x, x1 is the high 32 bits
w0 = va0 + x0;
ww = (va0 & x0 | (va0 | x0) & ~w0) >>> 31;
va0 = w0;
va1 = va1 + x1 + ww;
// v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated to the right by 32 bits
xor0 = vd0 ^ va0;
xor1 = vd1 ^ va1;
// We can just swap high and low here becaeuse its a shift by 32 bits
vd0 = xor1;
vd1 = xor0;
// ADD64AA(v, c, d);
w0 = vc0 + vd0;
ww = (vc0 & vd0 | (vc0 | vd0) & ~w0) >>> 31;
vc0 = w0;
vc1 = vc1 + vd1 + ww;
// v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 24 bits
xor0 = vb0 ^ vc0;
xor1 = vb1 ^ vc1;
vb0 = xor0 >>> 24 ^ xor1 << 8;
vb1 = xor1 >>> 24 ^ xor0 << 8;
// ADD64AA(v, a, b);
w0 = va0 + vb0;
ww = (va0 & vb0 | (va0 | vb0) & ~w0) >>> 31;
va0 = w0;
va1 = va1 + vb1 + ww;
// ADD64AC(v, a, y0, y1);
w0 = va0 + y0;
ww = (va0 & y0 | (va0 | y0) & ~w0) >>> 31;
va0 = w0;
va1 = va1 + y1 + ww;
// v[d,d+1] = (v[d,d+1] xor v[a,a+1]) rotated right by 16 bits
xor0 = vd0 ^ va0;
xor1 = vd1 ^ va1;
vd0 = xor0 >>> 16 ^ xor1 << 16;
vd1 = xor1 >>> 16 ^ xor0 << 16;
// ADD64AA(v, c, d);
w0 = vc0 + vd0;
ww = (vc0 & vd0 | (vc0 | vd0) & ~w0) >>> 31;
vc0 = w0;
vc1 = vc1 + vd1 + ww;
// v[b,b+1] = (v[b,b+1] xor v[c,c+1]) rotated right by 63 bits
xor0 = vb0 ^ vc0;
xor1 = vb1 ^ vc1;
vb0 = xor1 >>> 31 ^ xor0 << 1;
vb1 = xor0 >>> 31 ^ xor1 << 1;
v[a] = va0;
v[a + 1] = va1;
v[b] = vb0;
v[b + 1] = vb1;
v[c] = vc0;
v[c + 1] = vc1;
v[d] = vd0;
v[d + 1] = vd1;
}
// Initialization Vector
var BLAKE2B_IV32 = [0xf3bcc908, 0x6a09e667, 0x84caa73b, 0xbb67ae85, 0xfe94f82b, 0x3c6ef372, 0x5f1d36f1, 0xa54ff53a, 0xade682d1, 0x510e527f, 0x2b3e6c1f, 0x9b05688c, 0xfb41bd6b, 0x1f83d9ab, 0x137e2179, 0x5be0cd19];
// Note these offsets have all been multiplied by two to make them offsets into
// a uint32 buffer.
var SIGMA82 = [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 28, 20, 8, 16, 18, 30, 26, 12, 2, 24, 0, 4, 22, 14, 10, 6, 22, 16, 24, 0, 10, 4, 30, 26, 20, 28, 6, 12, 14, 2, 18, 8, 14, 18, 6, 2, 26, 24, 22, 28, 4, 12, 10, 20, 8, 0, 30, 16, 18, 0, 10, 14, 4, 8, 20, 30, 28, 2, 22, 24, 12, 16, 6, 26, 4, 24, 12, 20, 0, 22, 16, 6, 8, 26, 14, 10, 30, 28, 2, 18, 24, 10, 2, 30, 28, 26, 8, 20, 0, 14, 12, 6, 18, 4, 16, 22, 26, 22, 14, 28, 24, 2, 6, 18, 10, 0, 30, 8, 16, 12, 4, 20, 12, 30, 28, 18, 22, 6, 0, 16, 24, 4, 26, 14, 2, 8, 20, 10, 20, 4, 16, 8, 14, 12, 2, 10, 30, 22, 18, 28, 6, 24, 26, 0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 28, 20, 8, 16, 18, 30, 26, 12, 2, 24, 0, 4, 22, 14, 10, 6];
// Compression function. 'last' flag indicates last block.
function blake2bCompress(ctx, last) {
var v = ctx.v;
var m = ctx.m;
// init work variables
for (var _i3 = 0; _i3 < 16; _i3++) {
v[_i3] = ctx.h[_i3];
v[_i3 + 16] = BLAKE2B_IV32[_i3];
}
// low 64 bits of offset
v[24] = v[24] ^ ctx.t;
v[25] = v[25] ^ ctx.t / 0x100000000;
// high 64 bits not supported, offset may not be higher than 2**53-1
// last block flag set ?
if (last) {
v[28] = ~v[28];
v[29] = ~v[29];
}
// get little-endian words
for (var _i4 = 0; _i4 < 32; _i4++) {
m[_i4] = B2B_GET32(ctx.b, 4 * _i4);
}
// twelve rounds of mixing
for (var _i5 = 0; _i5 < 12; _i5++) {
B2B_G_FAST(v, m, 0, 8, 16, 24, SIGMA82[_i5 * 16 + 0], SIGMA82[_i5 * 16 + 1]);
B2B_G_FAST(v, m, 2, 10, 18, 26, SIGMA82[_i5 * 16 + 2], SIGMA82[_i5 * 16 + 3]);
B2B_G_FAST(v, m, 4, 12, 20, 28, SIGMA82[_i5 * 16 + 4], SIGMA82[_i5 * 16 + 5]);
B2B_G_FAST(v, m, 6, 14, 22, 30, SIGMA82[_i5 * 16 + 6], SIGMA82[_i5 * 16 + 7]);
B2B_G_FAST(v, m, 0, 10, 20, 30, SIGMA82[_i5 * 16 + 8], SIGMA82[_i5 * 16 + 9]);
B2B_G_FAST(v, m, 2, 12, 22, 24, SIGMA82[_i5 * 16 + 10], SIGMA82[_i5 * 16 + 11]);
B2B_G_FAST(v, m, 4, 14, 16, 26, SIGMA82[_i5 * 16 + 12], SIGMA82[_i5 * 16 + 13]);
B2B_G_FAST(v, m, 6, 8, 18, 28, SIGMA82[_i5 * 16 + 14], SIGMA82[_i5 * 16 + 15]);
}
for (var _i6 = 0; _i6 < 16; _i6++) {
ctx.h[_i6] = ctx.h[_i6] ^ v[_i6] ^ v[_i6 + 16];
}
}
/**
* FRIENDLY CAPTCHA optimization only, does not reset ctx.t (global byte counter)
* Assumes no key
*/
function blake2bResetForShortMessage(ctx, input) {
// Initialize State vector h with IV
for (var _i7 = 0; _i7 < 16; _i7++) {
ctx.h[_i7] = BLAKE2B_IV32[_i7];
}
// Danger: These operations and resetting are really only possible because our input is exactly 128 bytes
ctx.b.set(input);
// ctx.m.fill(0);
// ctx.v.fill(0);
ctx.h[0] ^= 0x01010000 ^ ctx.outlen;
}
// This is not an enum to save some bytes in the output bundle.
var SOLVER_TYPE_JS = 1;
var SOLVER_TYPE_WASM = 2;
var CHALLENGE_SIZE_BYTES = 128;
var HASH_SIZE_BYTES = 32;
/**
* Solve the blake2b hashing problem, re-using the memory between different attempts (which solves up to 50% faster).
*
* This only changes the last 4 bytes of the input array to find a solution. To find multiple solutions
* one could call this function multiple times with the 4 bytes in front of those last 4 bytes varying.
*
*
* The goal is to find a nonce that, hashed together with the rest of the input header, has a value of its
* most significant 32bits that is below some threshold.
* Approximately this means: the hash value of it starts with K zeroes (little endian), which is expected to be
* increasingly difficult as K increases.
*
* In practice you should ask the client to solve multiple (easier) puzzles which should reduce variance and also allows us
* to show a progress bar.
* @param input challenge bytes
* @param threshold u32 value under which the solution's hash should be below.
*/
function solveBlake2bEfficient(input, threshold, n) {
if (input.length != CHALLENGE_SIZE_BYTES) {
throw Error("Invalid input");
}
var buf = input.buffer;
var view = new DataView(buf);
var ctx = new Context(HASH_SIZE_BYTES);
ctx.t = CHALLENGE_SIZE_BYTES;
var start = view.getUint32(124, true);
var end = start + n;
for (var _i8 = start; _i8 < end; _i8++) {
view.setUint32(124, _i8, true);
blake2bResetForShortMessage(ctx, input);
blake2bCompress(ctx, true);
if (ctx.h[0] < threshold) {
if (ASC_TARGET == 0) {
// JS
return new Uint8Array(ctx.h.buffer);
}
//@ts-ignore
return Uint8Array.wrap(ctx.h.buffer);
}
}
return new Uint8Array(0);
}
function getJSSolver() {
return new Promise(function ($return, $error) {
return $return(function (puzzleBuffer, threshold) {
var n = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 4294967295;
var hash = solveBlake2bEfficient(puzzleBuffer, threshold, n);
return [puzzleBuffer, hash];
});
});
}
if (!Uint8Array.prototype.slice) {
Object.defineProperty(Uint8Array.prototype, "slice", {
value: function value(begin, end) {
return new Uint8Array(Array.prototype.slice.call(this, begin, end));
}
});
}
self.ASC_TARGET = 0;
// 1 for JS, 2 for WASM
var solverType;
// Puzzle consisting of zeroes
var setSolver;
var solver = new Promise(function (resolve) {
return setSolver = resolve;
});
self.onerror = function (evt) {
self.postMessage({
type: "error",
message: JSON.stringify(evt)
});
};
self.onmessage = function (evt) {
return new Promise(function ($return, $error) {
var data;
data = evt.data;
var $Try_1_Post = function $Try_1_Post() {
try {
return $return();
} catch ($boundEx) {
return $error($boundEx);
}
};
var $Try_1_Catch = function $Try_1_Catch(e) {
try {
setTimeout(function () {
throw e;
});
return $Try_1_Post();
} catch ($boundEx) {
return $error($boundEx);
}
};
try {
var $If_3 = function $If_3() {
return $Try_1_Post();
};
/**
* Compile the WASM and setup the solver.
* If WASM support is not present, it uses the JS version instead.
*/
if (data.type === "solver") {
var $If_4 = function $If_4() {
self.postMessage({
type: "ready",
solver: solverType
});
return $If_3.call(this);
};
if (data.forceJS) {
var s;
solverType = SOLVER_TYPE_JS;
return Promise.resolve(getJSSolver()).then(function ($await_9) {
try {
s = $await_9;
setSolver(s);
return $If_4.call(this);
} catch ($boundEx) {
return $Try_1_Catch($boundEx);
}
}.bind(this), $Try_1_Catch);
} else {
var $Try_2_Post = function () {
try {
return $If_4.call(this);
} catch ($boundEx) {
return $Try_1_Catch($boundEx);
}
}.bind(this);
var $Try_2_Catch = function $Try_2_Catch(e) {
try {
{
var _s;
console.log("FriendlyCaptcha failed to initialize WebAssembly, falling back to Javascript solver: " + e.toString());
solverType = SOLVER_TYPE_JS;
return Promise.resolve(getJSSolver()).then(function ($await_10) {
try {
_s = $await_10;
setSolver(_s);
return $Try_2_Post();
} catch ($boundEx) {
return $Try_1_Catch($boundEx);
}
}, $Try_1_Catch);
}
} catch ($boundEx) {
return $Try_1_Catch($boundEx);
}
};
try {
var module, _s2;
solverType = SOLVER_TYPE_WASM;
module = WebAssembly.compile(decode(base64));
return Promise.resolve(module).then(function ($await_11) {
try {
return Promise.resolve(getWasmSolver($await_11)).then(function ($await_12) {
try {
_s2 = $await_12;
setSolver(_s2);
return $Try_2_Post();
} catch ($boundEx) {
return $Try_2_Catch($boundEx);
}
}, $Try_2_Catch);
} catch ($boundEx) {
return $Try_2_Catch($boundEx);
}
}, $Try_2_Catch);
} catch (e) {
$Try_2_Catch(e);
}
}
} else {
var $If_6 = function $If_6() {
return $If_3.call(this);
};
if (data.type === "start") {
var solve, totalH, solution, view;
return Promise.resolve(solver).then(function ($await_13) {
try {
solve = $await_13;
self.postMessage({
type: "started"
});
totalH = 0;
// We loop over a uint32 to find as solution, it is technically possible (but extremely unlikely - only possible with very high difficulty) that
// there is no solution, here we loop over one byte further up too in case that happens.
for (var b = 0; b < 256; b++) {
data.puzzleSolverInput[123] = b;
var _solve = solve(data.puzzleSolverInput, data.threshold),
_solve2 = _slicedToArray(_solve, 2),
_s3 = _solve2[0],
hash = _solve2[1];
if (hash.length === 0) {
// This means 2^32 puzzles were evaluated, which takes a while in a browser!
// As we try 256 times, this is not fatal
console.warn("FC: Internal error or no solution found");
totalH += Math.pow(2, 32) - 1;
continue;
}
solution = _s3;
break;
}
view = new DataView(solution.slice(-4).buffer);
totalH += view.getUint32(0, true);
self.postMessage({
type: "done",
solution: solution.slice(-8),
h: totalH,
puzzleIndex: data.puzzleIndex,
puzzleNumber: data.puzzleNumber
});
return $If_6.call(this);
} catch ($boundEx) {
return $Try_1_Catch($boundEx);
}
}.bind(this), $Try_1_Catch);
}
return $If_6.call(this);
}
} catch (e) {
$Try_1_Catch(e);
}
});
};
})();