From 40bced0da1cb196d3443dc9e14e46d0403dc272c Mon Sep 17 00:00:00 2001 From: Christophe Diederichs Date: Mon, 12 Oct 2020 16:41:06 +0200 Subject: [PATCH] use tables to share functions between modules --- fe-test.js | 98 +++++++++++++------------- fe25519_25.js | 125 +++++++++++++++++---------------- fe25519_25/fe25519_invert.js | 61 ++++++++++++++++ fe25519_25/fe25519_mul.js | 62 ++++++++++++++++ fe25519_25/fe25519_mul.wat | 68 +++++++++--------- fe25519_25/fe25519_pow22523.js | 61 ++++++++++++++++ fe25519_25/fe25519_sq.js | 61 ++++++++++++++++ fe25519_25/fe25519_sq.wat | 21 +++--- fe25519_25/sc25519_mul.js | 61 ++++++++++++++++ fe25519_25/sc25519_mul.wat | 79 ++++++++++++++------- fe25519_25/sc25519_muladd.js | 61 ++++++++++++++++ fe25519_25/sc25519_muladd.wat | 103 +++++++++++++++++---------- fe25519_25/sc_reduce.js | 61 ++++++++++++++++ fe25519_25/sc_reduce.wat | 25 ++++++- 14 files changed, 730 insertions(+), 217 deletions(-) create mode 100644 fe25519_25/fe25519_invert.js create mode 100644 fe25519_25/fe25519_mul.js create mode 100644 fe25519_25/fe25519_pow22523.js create mode 100644 fe25519_25/fe25519_sq.js create mode 100644 fe25519_25/sc25519_mul.js create mode 100644 fe25519_25/sc25519_muladd.js create mode 100644 fe25519_25/sc_reduce.js diff --git a/fe-test.js b/fe-test.js index 1b7e723..5230f5c 100644 --- a/fe-test.js +++ b/fe-test.js @@ -1,6 +1,6 @@ const ec = require('./fe25519_25.js') const sodium = require('./') -const wasm = require('./fe25519_25/fe25519_invert')({ +const invert = require('./fe25519_25/fe25519_invert')({ imports: { debug: { log (...args) { @@ -13,7 +13,7 @@ const wasm = require('./fe25519_25/fe25519_invert')({ } } }) -const wasm2 = require('./fe25519_25/fe25519_pow22523')({ +const pow = require('./fe25519_25/fe25519_pow22523')({ imports: { debug: { log (...args) { @@ -39,10 +39,10 @@ var r = ec.ge3() function wasm_inv (h, f) { var buf = Buffer.from(f.buffer) - wasm.memory.set(buf) - wasm.exports.fe25519_invert(40, 0) + invert.memory.set(buf) + invert.exports.fe25519_invert(40, 0) - buf = Buffer.from(wasm.memory.slice(40, 80)) + buf = Buffer.from(invert.memory.slice(40, 80)) for (let i = 0; i < 10; i++) { h[i] = buf.readUInt32LE(4 * i) } @@ -51,10 +51,10 @@ function wasm_inv (h, f) { function wasm_pow (h, f) { var buf = Buffer.from(f.buffer) - wasm2.memory.set(buf) - wasm2.exports.fe25519_pow22523(40, 0) + pow.memory.set(buf) + pow.exports.fe25519_pow22523(40, 0) - buf = Buffer.from(wasm2.memory.slice(40, 80)) + buf = Buffer.from(pow.memory.slice(40, 80)) for (let i = 0; i < 10; i++) { h[i] = buf.readUInt32LE(4 * i) } @@ -171,65 +171,63 @@ console.timeEnd('standard') ec.fe25519_tobytes(res, b) console.log('tess :', res.toString('hex')) -console.log(wasm.buffer.length) - -console.time('pure wasm') +console.time('pure invert') for (let i = 0; i < 10000; i++) wasm_pow(b, a) -console.timeEnd('pure wasm') +console.timeEnd('pure invert') ec.fe25519_tobytes(res, b) console.log('tess :', res.toString('hex')) -// ec.fe25519_pow22523(a, a) -// ec.fe25519_tobytes(res, a) -// console.log('fe_p25:', res.toString('hex')) +ec.fe25519_pow22523(a, a) +ec.fe25519_tobytes(res, a) +console.log('fe_p25:', res.toString('hex')) -// ec.fe25519_cneg(a, a, 1) -// ec.fe25519_tobytes(res, a) -// console.log('fe_cng:', res.toString('hex')) +ec.fe25519_cneg(a, a, 1) +ec.fe25519_tobytes(res, a) +console.log('fe_cng:', res.toString('hex')) -// ec.sc25519_mul(res, an, bn) -// console.log('sc_mul:', res.toString('hex')) +ec.sc25519_mul(res, an, bn) +console.log('sc_mul:', res.toString('hex')) -// ec.sc25519_muladd(res, an, bn, cn) -// console.log('sc_mad:', res.toString('hex')) +ec.sc25519_muladd(res, an, bn, cn) +console.log('sc_mad:', res.toString('hex')) -// ec.sc25519_reduce(s) -// console.log('sc_red:', s.subarray(0, 32).toString('hex')) +ec.sc25519_reduce(s) +console.log('sc_red:', s.subarray(0, 32).toString('hex')) -// ec.sc25519_invert(res, cn) -// console.log('sc_inv:', res.toString('hex')) +ec.sc25519_invert(res, cn) +console.log('sc_inv:', res.toString('hex')) -// ec.ge25519_mont_to_ed(g, c, a, b) -// ec.fe25519_tobytes(res, g) -// console.log('g_m2ex:', res.toString('hex')) -// ec.fe25519_tobytes(res, c) -// console.log('g_m2ey:', res.toString('hex')) +ec.ge25519_mont_to_ed(g, c, a, b) +ec.fe25519_tobytes(res, g) +console.log('g_m2ex:', res.toString('hex')) +ec.fe25519_tobytes(res, c) +console.log('g_m2ey:', res.toString('hex')) -// ec.ge25519_frombytes(ge, p) -// ec.ge25519_p3_tobytes(res, ge) -// console.log("p :", res.toString('hex')) +ec.ge25519_frombytes(ge, p) +ec.ge25519_p3_tobytes(res, ge) +console.log("p :", res.toString('hex')) -// ec.ge25519_mul_l(gf, ge) -// ec.ge25519_p3_tobytes(res, gf) -// console.log("mul_l :", res.toString('hex')) +ec.ge25519_mul_l(gf, ge) +ec.ge25519_p3_tobytes(res, gf) +console.log("mul_l :", res.toString('hex')) -// ec.ge25519_scalarmult_base(gf, cn) -// ec.ge25519_p3_tobytes(res, gf) -// console.log("smultb:", res.toString('hex')) +ec.ge25519_scalarmult_base(gf, cn) +ec.ge25519_p3_tobytes(res, gf) +console.log("smultb:", res.toString('hex')) -// ec.ge25519_scalarmult(ge, bn, gf) -// ec.ge25519_p3_tobytes(res, ge) -// console.log("smult :", res.toString('hex')) +ec.ge25519_scalarmult(ge, bn, gf) +ec.ge25519_p3_tobytes(res, ge) +console.log("smult :", res.toString('hex')) -// ec.ge25519_double_scalarmult_vartime(gf, an, ge, bn) -// ec.ge25519_p3_tobytes(res, gf) -// console.log("smdbl :", res.toString('hex')) +ec.ge25519_double_scalarmult_vartime(gf, an, ge, bn) +ec.ge25519_p3_tobytes(res, gf) +console.log("smdbl :", res.toString('hex')) -// ec.ge25519_frombytes_negate_vartime(gf, pk_test) -// ec.ge25519_p3_tobytes(res, gf) -// console.log("smdbl :", res.toString('hex')) +ec.ge25519_frombytes_negate_vartime(gf, pk_test) +ec.ge25519_p3_tobytes(res, gf) +console.log("smdbl :", res.toString('hex')) -// console.log('canon :', ec.sc25519_is_canonical(bn)) +console.log('canon :', ec.sc25519_is_canonical(bn)) ///////////////////////////////////////////////////// diff --git a/fe25519_25.js b/fe25519_25.js index 6a0c5a5..0e167d9 100644 --- a/fe25519_25.js +++ b/fe25519_25.js @@ -1,43 +1,54 @@ const assert = require('nanoassert') const sodium = require('./') -const wasm = require('./fe25519_25/mult.js')({ + +const debug = { + log (...args) { + console.log(...args.map(int => (int >>> 0).toString(16).padStart(8, '0'))) + }, + log_tee (arg) { + console.log((arg >>> 0).toString(16).padStart(8, '0')) + return arg + } +} + +const wasm_mul = require('./fe25519_25/fe25519_mul')({ + imports: { debug } +}) +const wasm_sq = require('./fe25519_25/fe25519_sq')({ + imports: { debug } +}) +const wasm_invert = require('./fe25519_25/fe25519_invert')({ + imports: { debug } +}) +const wasm_pow = require('./fe25519_25/fe25519_pow22523')({ + imports: { debug } +}) + +const tbl = new WebAssembly.Table({ initial: 2, element: "anyfunc" }) + +const wasm_sc_red = require('./fe25519_25/sc_reduce')({ imports: { - debug: { - log (...args) { - console.log(...args.map(int => (int >>> 0).toString(16).padStart(8, '0'))) - }, - log_tee (arg) { - console.log((arg >>> 0).toString(16).padStart(8, '0')) - return arg - } + debug, + js: { + table: tbl } } }) -const wasm3 = require('./fe25519_25/fe25519_invert')({ +const wasm_sc_mul = require('./fe25519_25/sc25519_mul')({ imports: { - debug: { - log (...args) { - console.log(...args.map(int => (int >>> 0).toString(16).padStart(8, '0'))) - }, - log_tee (arg) { - console.log((arg >>> 0).toString(16).padStart(8, '0')) - return arg - } + debug, + js: { + table: tbl } } }) -const wasm2 = require('./fe25519_25/fe25519_pow22523')({ +const wasm_sc_muladd = require('./fe25519_25/sc25519_muladd')({ imports: { - debug: { - log (...args) { - console.log(...args.map(int => (int >>> 0).toString(16).padStart(8, '0'))) - }, - log_tee (arg) { - console.log((arg >>> 0).toString(16).padStart(8, '0')) - return arg - } + debug, + js: { + table: tbl } } }) @@ -45,10 +56,10 @@ const wasm2 = require('./fe25519_25/fe25519_pow22523')({ function fe25519_invert (h, f) { var buf = Buffer.from(f.buffer) - wasm3.memory.set(buf) - wasm3.exports.fe25519_invert(40, 0) + wasm_invert.memory.set(buf) + wasm_invert.exports.fe25519_invert(40, 0) - buf = Buffer.from(wasm3.memory.slice(40, 80)) + buf = Buffer.from(wasm_invert.memory.slice(40, 80)) for (let i = 0; i < 10; i++) { h[i] = buf.readUInt32LE(4 * i) } @@ -57,16 +68,15 @@ function fe25519_invert (h, f) { function fe25519_pow22523 (h, f) { var buf = Buffer.from(f.buffer) - wasm2.memory.set(buf) - wasm2.exports.fe25519_pow22523(40, 0) + wasm_pow.memory.set(buf) + wasm_pow.exports.fe25519_pow22523(40, 0) - buf = Buffer.from(wasm2.memory.slice(40, 80)) + buf = Buffer.from(wasm_pow.memory.slice(40, 80)) for (let i = 0; i < 10; i++) { h[i] = buf.readUInt32LE(4 * i) } } -console.log(wasm.buffer.byteLength) const base = require('./fe25519_25/base.json').map(a => a.map(b => ge2(b))) const printbuf =Buffer.alloc(32) @@ -147,14 +157,11 @@ const ed25519_sqrtam2 = fe25519([ ]) function print_ge (g, n = 4) { - console.log('__________\n') for (let i = 0; i < n; i++) for (let j = 0; j <10; j++) console.log(`g[${i}][${j}]:`, signedInt(g[i][j]).toString(16).padStart(8, '0')) } function print_fe (f) { for (let j = 0; j <10; j++) console.log(`f[${j}]:`, signedInt(f[j]).toString(16).padStart(8, '0')) - console.log('__________\n') - console.log('__________\n') } function fe25519 (arr) { @@ -774,11 +781,11 @@ function fe25519_mul (h, f, g) { var fbuf = Buffer.from(f.buffer) var gbuf = Buffer.from(g.buffer) - wasm.memory.set(fbuf) - wasm.memory.set(gbuf, 40) - wasm.exports.fe25519_mul(80, 0, 40) + wasm_mul.memory.set(fbuf) + wasm_mul.memory.set(gbuf, 40) + wasm_mul.exports.fe25519_mul(80, 0, 40) - buf = Buffer.from(wasm.memory.slice(80, 120)) + buf = Buffer.from(wasm_mul.memory.slice(80, 120)) for (let i = 0; i < 10; i++) { h[i] = buf.readUInt32LE(4 * i) } @@ -801,10 +808,10 @@ function fe25519_sq (h, f, log) { var buf = Buffer.from(f.buffer) - wasm.memory.set(buf) - wasm.exports.fe25519_sq(40, 0, 0) + wasm_sq.memory.set(buf) + wasm_sq.exports.sq(40, 0, 0) - buf = Buffer.from(wasm.memory.slice(40, 80)) + buf = Buffer.from(wasm_sq.memory.slice(40, 80)) for (let i = 0; i < 10; i++) { h[i] = buf.readUInt32LE(4 * i) } @@ -827,10 +834,10 @@ function fe25519_sq2 (h, f) { var buf = Buffer.from(f.buffer) - wasm.memory.set(buf) - wasm.exports.fe25519_sq(40, 0, 1) + wasm_sq.memory.set(buf) + wasm_sq.exports.sq(40, 0, 1) - buf = Buffer.from(wasm.memory.slice(40, 80)) + buf = Buffer.from(wasm_sq.memory.slice(40, 80)) for (let i = 0; i < 10; i++) { h[i] = buf.readUInt32LE(4 * i) } @@ -2093,12 +2100,12 @@ function sc25519_mul (s, a, b) { const abuf = new Uint8Array(_a.buffer) const bbuf = new Uint8Array(_b.buffer) - wasm.memory.set(abuf, 0) - wasm.memory.set(bbuf, 48) + wasm_sc_mul.memory.set(abuf, 0) + wasm_sc_mul.memory.set(bbuf, 48) - wasm.exports.sc25519_mul(96, 0, 48) + wasm_sc_mul.exports.sc25519_mul(96, 0, 48) - s.set(wasm.memory.slice(96, 128)) + s.set(wasm_sc_mul.memory.slice(96, 128)) } function sc25519_muladd (s, a, b, c) { @@ -2154,13 +2161,13 @@ function sc25519_muladd (s, a, b, c) { const bbuf = new Uint8Array(_b.buffer) const cbuf = new Uint8Array(_c.buffer) - wasm.memory.set(abuf, 0) - wasm.memory.set(bbuf, 48) - wasm.memory.set(cbuf, 96) + wasm_sc_muladd.memory.set(abuf, 0) + wasm_sc_muladd.memory.set(bbuf, 48) + wasm_sc_muladd.memory.set(cbuf, 96) - wasm.exports.sc25519_muladd(144, 0, 48, 96) + wasm_sc_muladd.exports.sc25519_muladd(144, 0, 48, 96) - s.set(wasm.memory.slice(144, 176)) + s.set(wasm_sc_muladd.memory.slice(144, 176)) } /* @@ -2303,12 +2310,12 @@ function sc25519_reduce (s) { _s[23] = load_4(s, 60) >>> 3 var sbuf = Buffer.from(_s.buffer) - wasm.memory.set(sbuf, 0) + wasm_sc_red.memory.set(sbuf, 0) - wasm.exports.sc25519_reduce(0) + wasm_sc_red.exports.sc25519_reduce(0) s.fill(0) - s.set(wasm.memory.slice(0, 32)) + s.set(wasm_sc_red.memory.slice(0, 32)) } function sc25519_is_canonical (s) { diff --git a/fe25519_25/fe25519_invert.js b/fe25519_25/fe25519_invert.js new file mode 100644 index 0000000..7da55b9 --- /dev/null +++ b/fe25519_25/fe25519_invert.js @@ -0,0 +1,61 @@ + +module.exports = loadWebAssembly + +loadWebAssembly.supported = typeof WebAssembly !== 'undefined' + +function loadWebAssembly (opts) { + if (!loadWebAssembly.supported) return null + + var imp = opts && opts.imports + var wasm = toUint8Array('AGFzbQEAAAABQQpgAX8AYAF/AX9gAn9/AGABfQBgAX0BfWABfABgAXwBfGABfgBgAX4BfmAUfn5+fn5+fn5+fn5+fn5+fn5+fn4AAmEHBWRlYnVnA2xvZwAABWRlYnVnB2xvZ190ZWUAAQVkZWJ1ZwNsb2cAAgVkZWJ1ZwNsb2cAAwVkZWJ1Zwdsb2dfdGVlAAQFZGVidWcDbG9nAAUFZGVidWcHbG9nX3RlZQAGAwUEBwgJAgUDAQABBjMKfgFCAAt+AUIAC34BQgALfgFCAAt+AUIAC34BQgALfgFCAAt+AUIAC34BQgALfgFCAAsHGwIGbWVtb3J5AgAOZmUyNTUxOV9pbnZlcnQACgrDHQQNACAAQiCHpyAApxACCwkAIAAQByAADwuzDwF8fiAAp6whACABp6whASACp6whAiADp6whAyAEp6whBCAFp6whBSAGp6whBiAHp6whByAIp6whCCAJp6whCSAKp6whCiALp6whCyAMp6whDCANp6whDSAOp6whDiAPp6whDyAQp6whECARp6whESASp6whEiATp6whE0ITIAt+IAtCgICAgAiDQgGGQhN+fSEeQhMgDH4gDEKAgICACINCAYZCE359IR9CEyANfiANQoCAgIAIg0IBhkITfn0hIEITIA5+IA5CgICAgAiDQgGGQhN+fSEhQhMgD34gD0KAgICACINCAYZCE359ISJCEyAQfiAQQoCAgIAIg0IBhkITfn0hI0ITIBF+IBFCgICAgAiDQgGGQhN+fSEkQhMgEn4gEkKAgICACINCAYZCE359ISVCEyATfiATQoCAgIAIg0IBhkITfn0hJkICIAF+IAFCgICAgAiDQgGGQgJ+fSEnQgIgA34gA0KAgICACINCAYZCAn59IShCAiAFfiAFQoCAgIAIg0IBhkICfn0hKUICIAd+IAdCgICAgAiDQgGGQgJ+fSEqQgIgCX4gCUKAgICACINCAYZCAn59ISsgHqesIR4gH6esIR8gIKesISAgIaesISEgIqesISIgI6esISMgJKesISQgJaesISUgJqesISYgJ6esIScgKKesISggKaesISkgKqesISogK6esISsgACAKfiEsIAAgC34hLSAAIAx+IS4gACANfiEvIAAgDn4hMCAAIA9+ITEgACAQfiEyIAAgEX4hMyAAIBJ+ITQgACATfiE1IAEg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IQ0jASEQIwIhEyMDIRYjBCEZIwUhHCMGIR8jByEiIwghJSMJISgjACMBIwIjAyMEIwUjBiMHIwgjCSMAIwEjAiMDIwQjBSMGIwcjCCMJEAkjACEPIwEhEiMCIRUjAyEYIwQhGyMFIR4jBiEhIwchJCMIIScjCSEqIA4gESAUIBcgGiAdICAgIyAmICkjACMBIwIjAyMEIwUjBiMHIwgjCRAJIwAhDiMBIREjAiEUIwMhFyMEIRojBSEdIwYhICMHISMjCCEmIwkhKQJAA0BBBSAMRg0BIAxBAWohDCMAIwEjAiMDIwQjBSMGIwcjCCMJIwAjASMCIwMjBCMFIwYjByMIIwkQCQwACwtBACEMIwAhDyMBIRIjAiEVIwMhGCMEIRsjBSEeIwYhISMHISQjCCEnIwkhKiAOIBEgFCAXIBogHSAgICMgJiApIwAjASMCIwMjBCMFIwYjByMIIwkQCSMAIQ4jASERIwIhFCMDIRcjBCEaIwUhHSMGISAjByEjIwghJiMJISkCQANAQQogDEYNASAMQQFqIQwjACMBIwIjAyMEIwUjBiMHIwgjCSMAIwEjAiMDIwQjBSMGIwcjCCMJEAkMAAsLQQAhDCAOIBEgFCAXIBogHSAgICMgJiApIwAjASMCIwMjBCMFIwYjByMIIwkQCSMAIQ8jASESIwIhFSMDIRgjBCEbIwUhHiMGISEjByEkIwghJyMJISoCQANAQRQgDEYNASAMQQFqIQwjACMBIwIjAyMEIwUjBiMHIwgjCSMAIwEjAiMDIwQjBSMGIwcjCCMJEAkMAAsLQQAhDCAPIBIgFSAYIBsgHiAhICQgJyAqIwAjASMCIwMjBCMFIwYjByMIIwkQCQJAA0BBCiAMRg0BIAxBAWohDCMAIwEjAiMDIwQjBSMGIwcjCCMJIwAjASMCIwMjBCMFIwYjByMIIwkQCQwACwtBACEMIA4gESAUIBcgGiAdICAgIyAmICkjACMBIwIjAyMEIwUjBiMHIwgjCRAJIwAhDiMBIREjAiEUIwMhFyMEIRojBSEdIwYhICMHISMjCCEmIwkhKQJAA0BBMiAMRg0BIAxBAWohDCMAIwEjAiMDIwQjBSMGIwcjCCMJIwAjASMCIwMjBCMFIwYjByMIIwkQCQwACwtBACEMIA4gESAUIBcgGiAdICAgIyAmICkjACMBIwIjAyMEIwUjBiMHIwgjCRAJIwAhDyMBIRIjAiEVIwMhGCMEIRsjBSEeIwYhISMHISQjCCEnIwkhKgJAA0BB5AAgDEYNASAMQQFqIQwjACMBIwIjAyMEIwUjBiMHIwgjCSMAIwEjAiMDIwQjBSMGIwcjCCMJEAkMAAsLQQAhDCAPIBIgFSAYIBsgHiAhICQgJyAqIwAjASMCIwMjBCMFIwYjByMIIwkQCQJAA0BBMiAMRg0BIAxBAWohDCMAIwEjAiMDIwQjBSMGIwcjCCMJIwAjASMCIwMjBCMFIwYjByMIIwkQCQwACwtBACEMIA4gESAUIBcgGiAdICAgIyAmICkjACMBIwIjAyMEIwUjBiMHIwgjCRAJAkADQEEFIAxGDQEgDEEBaiEMIwAjASMCIwMjBCMFIwYjByMIIwkjACMBIwIjAyMEIwUjBiMHIwgjCRAJDAALCyANIBAgEyAWIBkgHCAfICIgJSAoIwAjASMCIwMjBCMFIwYjByMIIwkQCSAAIwA+AgAgACMBPgIEIAAjAj4CCCAAIwM+AgwgACMEPgIQIAAjBT4CFCAAIwY+AhggACMHPgIcIAAjCD4CICAAIwk+AiQL') + var ready = null + + var mod = { + buffer: wasm, + memory: null, + exports: null, + realloc: realloc, + onload: onload + } + + onload(function () {}) + + return mod + + function realloc (size) { + mod.exports.memory.grow(Math.max(0, Math.ceil(Math.abs(size - mod.memory.length) / 65536))) + mod.memory = new Uint8Array(mod.exports.memory.buffer) + } + + function onload (cb) { + if (mod.exports) return cb() + + if (ready) { + ready.then(cb.bind(null, null)).catch(cb) + return + } + + try { + if (opts && opts.async) throw new Error('async') + setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) + } catch (err) { + ready = WebAssembly.instantiate(wasm, imp).then(setup) + } + + onload(cb) + } + + function setup (w) { + mod.exports = w.instance.exports + mod.memory = mod.exports.memory && mod.exports.memory.buffer && new Uint8Array(mod.exports.memory.buffer) + } +} + +function toUint8Array (s) { + if (typeof atob === 'function') return new Uint8Array(atob(s).split('').map(charCodeAt)) + return (require('buf' + 'fer').Buffer).from(s, 'base64') +} + +function charCodeAt (c) { + return c.charCodeAt(0) +} diff --git a/fe25519_25/fe25519_mul.js b/fe25519_25/fe25519_mul.js new file mode 100644 index 0000000..f53b10c --- /dev/null +++ b/fe25519_25/fe25519_mul.js @@ -0,0 +1,62 @@ + +module.exports = loadWebAssembly + +loadWebAssembly.supported = typeof WebAssembly !== 'undefined' + +function loadWebAssembly (opts) { + if (!loadWebAssembly.supported) return null + + var imp = opts && opts.imports +console.log(imp) + var wasm = toUint8Array('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') + var ready = null + + var mod = { + buffer: wasm, + memory: null, + exports: null, + realloc: realloc, + onload: onload + } + + onload(function () {}) + + return mod + + function realloc (size) { + mod.exports.memory.grow(Math.max(0, Math.ceil(Math.abs(size - mod.memory.length) / 65536))) + mod.memory = new Uint8Array(mod.exports.memory.buffer) + } + + function onload (cb) { + if (mod.exports) return cb() + + if (ready) { + ready.then(cb.bind(null, null)).catch(cb) + return + } + + try { + if (opts && opts.async) throw new Error('async') + setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) + } catch (err) { + ready = WebAssembly.instantiate(wasm, imp).then(setup) + } + + onload(cb) + } + + function setup (w) { + mod.exports = w.instance.exports + mod.memory = mod.exports.memory && mod.exports.memory.buffer && new Uint8Array(mod.exports.memory.buffer) + } +} + +function toUint8Array (s) { + if (typeof atob === 'function') return new Uint8Array(atob(s).split('').map(charCodeAt)) + return (require('buf' + 'fer').Buffer).from(s, 'base64') +} + +function charCodeAt (c) { + return c.charCodeAt(0) +} diff --git a/fe25519_25/fe25519_mul.wat b/fe25519_25/fe25519_mul.wat index 7638c38..998d4ba 100644 --- a/fe25519_25/fe25519_mul.wat +++ b/fe25519_25/fe25519_mul.wat @@ -213,27 +213,27 @@ (set_local $g8 (i64.load32_u offset=32 (get_local $g))) (set_local $g9 (i64.load32_u offset=36 (get_local $g))) - (set_local $f0 (i64.extend32_s (get_local $f0))) - (set_local $f1 (i64.extend32_s (get_local $f1))) - (set_local $f2 (i64.extend32_s (get_local $f2))) - (set_local $f3 (i64.extend32_s (get_local $f3))) - (set_local $f4 (i64.extend32_s (get_local $f4))) - (set_local $f5 (i64.extend32_s (get_local $f5))) - (set_local $f6 (i64.extend32_s (get_local $f6))) - (set_local $f7 (i64.extend32_s (get_local $f7))) - (set_local $f8 (i64.extend32_s (get_local $f8))) - (set_local $f9 (i64.extend32_s (get_local $f9))) + (set_local $f0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f0)))) + (set_local $f1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f1)))) + (set_local $f2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f2)))) + (set_local $f3 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f3)))) + (set_local $f4 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f4)))) + (set_local $f5 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f5)))) + (set_local $f6 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f6)))) + (set_local $f7 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f7)))) + (set_local $f8 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f8)))) + (set_local $f9 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f9)))) - (set_local $g0 (i64.extend32_s (get_local $g0))) - (set_local $g1 (i64.extend32_s (get_local $g1))) - (set_local $g2 (i64.extend32_s (get_local $g2))) - (set_local $g3 (i64.extend32_s (get_local $g3))) - (set_local $g4 (i64.extend32_s (get_local $g4))) - (set_local $g5 (i64.extend32_s (get_local $g5))) - (set_local $g6 (i64.extend32_s (get_local $g6))) - (set_local $g7 (i64.extend32_s (get_local $g7))) - (set_local $g8 (i64.extend32_s (get_local $g8))) - (set_local $g9 (i64.extend32_s (get_local $g9))) + (set_local $g0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g0)))) + (set_local $g1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g1)))) + (set_local $g2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g2)))) + (set_local $g3 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g3)))) + (set_local $g4 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g4)))) + (set_local $g5 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g5)))) + (set_local $g6 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g6)))) + (set_local $g7 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g7)))) + (set_local $g8 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g8)))) + (set_local $g9 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g9)))) (set_local $g1_19 (i64.sub (i64.mul (i64.const 19) (get_local $g1)) (i64.mul (i64.shl (i64.and (get_local $g1) (i64.const 0x80000000)) (i64.const 1)) (i64.const 19)))) (set_local $g2_19 (i64.sub (i64.mul (i64.const 19) (get_local $g2)) (i64.mul (i64.shl (i64.and (get_local $g2) (i64.const 0x80000000)) (i64.const 1)) (i64.const 19)))) @@ -251,21 +251,21 @@ (set_local $f7_2 (i64.sub (i64.mul (i64.const 2) (get_local $f7)) (i64.mul (i64.shl (i64.and (get_local $f7) (i64.const 0x80000000)) (i64.const 1)) (i64.const 2)))) (set_local $f9_2 (i64.sub (i64.mul (i64.const 2) (get_local $f9)) (i64.mul (i64.shl (i64.and (get_local $f9) (i64.const 0x80000000)) (i64.const 1)) (i64.const 2)))) - (set_local $g1_19 (i64.extend32_s (get_local $g1_19))) - (set_local $g2_19 (i64.extend32_s (get_local $g2_19))) - (set_local $g3_19 (i64.extend32_s (get_local $g3_19))) - (set_local $g4_19 (i64.extend32_s (get_local $g4_19))) - (set_local $g5_19 (i64.extend32_s (get_local $g5_19))) - (set_local $g6_19 (i64.extend32_s (get_local $g6_19))) - (set_local $g7_19 (i64.extend32_s (get_local $g7_19))) - (set_local $g8_19 (i64.extend32_s (get_local $g8_19))) - (set_local $g9_19 (i64.extend32_s (get_local $g9_19))) + (set_local $g1_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g1_19)))) + (set_local $g2_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g2_19)))) + (set_local $g3_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g3_19)))) + (set_local $g4_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g4_19)))) + (set_local $g5_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g5_19)))) + (set_local $g6_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g6_19)))) + (set_local $g7_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g7_19)))) + (set_local $g8_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g8_19)))) + (set_local $g9_19 (i64.extend_s/i32 (i32.wrap/i64 (get_local $g9_19)))) - (set_local $f1_2 (i64.extend32_s (get_local $f1_2))) - (set_local $f3_2 (i64.extend32_s (get_local $f3_2))) - (set_local $f5_2 (i64.extend32_s (get_local $f5_2))) - (set_local $f7_2 (i64.extend32_s (get_local $f7_2))) - (set_local $f9_2 (i64.extend32_s (get_local $f9_2))) + (set_local $f1_2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f1_2)))) + (set_local $f3_2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f3_2)))) + (set_local $f5_2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f5_2)))) + (set_local $f7_2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f7_2)))) + (set_local $f9_2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f9_2)))) (set_local $f0g0 (i64.mul (get_local $f0 ) (get_local $g0))) (set_local $f0g1 (i64.mul (get_local $f0 ) (get_local $g1))) diff --git a/fe25519_25/fe25519_pow22523.js b/fe25519_25/fe25519_pow22523.js new file mode 100644 index 0000000..17a08cd --- /dev/null +++ b/fe25519_25/fe25519_pow22523.js @@ -0,0 +1,61 @@ + +module.exports = loadWebAssembly + +loadWebAssembly.supported = typeof WebAssembly !== 'undefined' + +function loadWebAssembly (opts) { + if (!loadWebAssembly.supported) return null + + var imp = opts && opts.imports + var wasm = toUint8Array('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IwAjASMCIwMjBCMFIwYjByMIIwkjACMBIwIjAyMEIwUjBiMHIwgjCRAJIA4gECASIBQgFiAYIBogHCAeICAjACMBIwIjAyMEIwUjBiMHIwgjCRAJIwAhDSMBIQ8jAiERIwMhEyMEIRUjBSEXIwYhGSMHIRsjCCEdIwkhHwJAA0BBBSAMRg0BIAxBAWohDCMAIwEjAiMDIwQjBSMGIwcjCCMJIwAjASMCIwMjBCMFIwYjByMIIwkQCQwACwtBACEMIwAhDiMBIRAjAiESIwMhFCMEIRYjBSEYIwYhGiMHIRwjCCEeIwkhICANIA8gESATIBUgFyAZIBsgHSAfIwAjASMCIwMjBCMFIwYjByMIIwkQCSMAIQ0jASEPIwIhESMDIRMjBCEVIwUhFyMGIRkjByEbIwghHSMJIR8CQANAQQogDEYNASAMQQFqIQwjACMBIwIjAyMEIwUjBiMHIwgjCSMAIwEjAiMDIwQjBSMGIwcjCCMJEAkMAAsLQQAhDCANIA8gESATIBUgFyAZIBsgHSAfIwAjASMCIwMjBCMFIwYjByMIIwkQCSMAIQ4jASEQIwIhEiMDIRQjBCEWIwUhGCMGIRojByEcIwghHiMJISACQANAQRQgDEYNASAMQQFqIQwjACMBIwIjAyMEIwUjBiMHIwgjCSMAIwEjAiMDIwQjBSMGIwcjCCMJEAkMAAsLQQAhDCAOIBAgEiAUIBYgGCAaIBwgHiAgIwAjASMCIwMjBCMFIwYjByMIIwkQCQJAA0BBCiAMRg0BIAxBAWohDCMAIwEjAiMDIwQjBSMGIwcjCCMJIwAjASMCIwMjBCMFIwYjByMIIwkQCQwACwtBACEMIA0gDyARIBMgFSAXIBkgGyAdIB8jACMBIwIjAyMEIwUjBiMHIwgjCRAJIwAhDSMBIQ8jAiERIwMhEyMEIRUjBSEXIwYhGSMHIRsjCCEdIwkhHwJAA0BBMiAMRg0BIAxBAWohDCMAIwEjAiMDIwQjBSMGIwcjCCMJIwAjASMCIwMjBCMFIwYjByMIIwkQCQwACwtBACEMIA0gDyARIBMgFSAXIBkgGyAdIB8jACMBIwIjAyMEIwUjBiMHIwgjCRAJIwAhDiMBIRAjAiESIwMhFCMEIRYjBSEYIwYhGiMHIRwjCCEeIwkhIAJAA0BB5AAgDEYNASAMQQFqIQwjACMBIwIjAyMEIwUjBiMHIwgjCSMAIwEjAiMDIwQjBSMGIwcjCCMJEAkMAAsLQQAhDCAOIBAgEiAUIBYgGCAaIBwgHiAgIwAjASMCIwMjBCMFIwYjByMIIwkQCQJAA0BBMiAMRg0BIAxBAWohDCMAIwEjAiMDIwQjBSMGIwcjCCMJIwAjASMCIwMjBCMFIwYjByMIIwkQCQwACwtBACEMIA0gDyARIBMgFSAXIBkgGyAdIB8jACMBIwIjAyMEIwUjBiMHIwgjCRAJIwAjASMCIwMjBCMFIwYjByMIIwkjACMBIwIjAyMEIwUjBiMHIwgjCRAJIwAjASMCIwMjBCMFIwYjByMIIwkjACMBIwIjAyMEIwUjBiMHIwgjCRAJIAIgAyAEIAUgBiAHIAggCSAKIAsjACMBIwIjAyMEIwUjBiMHIwgjCRAJIAAjAD4CACAAIwE+AgQgACMCPgIIIAAjAz4CDCAAIwQ+AhAgACMFPgIUIAAjBj4CGCAAIwc+AhwgACMIPgIgIAAjCT4CJAs=') + var ready = null + + var mod = { + buffer: wasm, + memory: null, + exports: null, + realloc: realloc, + onload: onload + } + + onload(function () {}) + + return mod + + function realloc (size) { + mod.exports.memory.grow(Math.max(0, Math.ceil(Math.abs(size - mod.memory.length) / 65536))) + mod.memory = new Uint8Array(mod.exports.memory.buffer) + } + + function onload (cb) { + if (mod.exports) return cb() + + if (ready) { + ready.then(cb.bind(null, null)).catch(cb) + return + } + + try { + if (opts && opts.async) throw new Error('async') + setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) + } catch (err) { + ready = WebAssembly.instantiate(wasm, imp).then(setup) + } + + onload(cb) + } + + function setup (w) { + mod.exports = w.instance.exports + mod.memory = mod.exports.memory && mod.exports.memory.buffer && new Uint8Array(mod.exports.memory.buffer) + } +} + +function toUint8Array (s) { + if (typeof atob === 'function') return new Uint8Array(atob(s).split('').map(charCodeAt)) + return (require('buf' + 'fer').Buffer).from(s, 'base64') +} + +function charCodeAt (c) { + return c.charCodeAt(0) +} diff --git a/fe25519_25/fe25519_sq.js b/fe25519_25/fe25519_sq.js new file mode 100644 index 0000000..d93d91a --- /dev/null +++ b/fe25519_25/fe25519_sq.js @@ -0,0 +1,61 @@ + +module.exports = loadWebAssembly + +loadWebAssembly.supported = typeof WebAssembly !== 'undefined' + +function loadWebAssembly (opts) { + if (!loadWebAssembly.supported) return null + + var imp = opts && opts.imports + var wasm = toUint8Array('AGFzbQEAAAABCAFgBH9/f38AAwIBAAUDAQABBw8CBm1lbW9yeQIAAnNxAAAKzwoBzAoCAX9jfiABNQIAIQYgATUCBCEHIAE1AgghCCABNQIMIQkgATUCECEKIAE1AhQhCyABNQIYIQwgATUCHCENIAE1AiAhDiABNQIkIQ8CQANAIAanrCEGIAenrCEHIAinrCEIIAmnrCEJIAqnrCEKIAunrCELIAynrCEMIA2nrCENIA6nrCEOIA+nrCEPIAZCAn4hJCAHQgJ+ISUgCEICfiEmIAlCAn4hJyAKQgJ+ISggC0ICfiEpIAxCAn4hKiANQgJ+ISsgC0ImfiEsIAxCE34hLSANQiZ+IS4gDkITfiEvIA9CJn4hMCAGIAZ+ITEgJCAHfiEyICQgCH4hMyAkIAl+ITQgJCAKfiE1ICQgC34hNiAkIAx+ITcgJCANfiE4ICQgDn4hOSAkIA9+ITogJSAHfiE7ICUgCH4hPCAlICd+IT0gJSAKfiE+ICUgKX4hPyAlIAx+IUAgJSArfiFBICUgDn4hQiAlIDB+IUMgCCAIfiFEICYgCX4hRSAmIAp+IUYgJiALfiFHICYgDH4hSCAmIA1+IUkgJiAvfiFKIAggMH4hSyAnIAl+IUwgJyAKfiFNICcgKX4hTiAnIAx+IU8gJyAufiFQICcgL34hUSAnIDB+IVIgCiAKfiFTICggC34hVCAoIC1+IVUgCiAufiFWICggL34hVyAKIDB+IVggCyAsfiFZICkgLX4hWiApIC5+IVsgKSAvfiFcICkgMH4hXSAMIC1+IV4gDCAufiFfICogL34hYCAMIDB+IWEgDSAufiFiICsgL34hYyArIDB+IWQgDiAvfiFlIA4gMH4hZiAPIDB+IWcgMSBDIEogUCBVIFl8fHx8fCEQIDIgSyBRIFYgWnx8fHwhESAzIDsgUiBXIFsgXnx8fHx8IRIgNCA8IFggXCBffHx8fCETIDUgPSBEIF0gYCBifHx8fHwhFCA2ID4gRSBhIGN8fHx8IRUgNyA/IEYgTCBkIGV8fHx8fCEWIDggQCBHIE0gZnx8fHwhFyA5IEEgSCBOIFMgZ3x8fHx8IRggOiBCIEkgTyBUfHx8fCEZIAQgA0YNASAEQQFqIQQMAAsLIAJBAUYEQCAQIBB8IRAgESARfCERIBIgEnwhEiATIBN8IRMgFCAUfCEUIBUgFXwhFSAWIBZ8IRYgFyAXfCEXIBggGHwhGCAZIBl8IRkLIBBCAUIZhnxCGochGiARIBp8IREgECAaQgFCGoZ+fSEQIBRCAUIZhnxCGochHiAVIB58IRUgFCAeQgFCGoZ+fSEUIBFCAUIYhnxCGYchGyASIBt8IRIgESAbQgFCGYZ+fSERIBVCAUIYhnxCGYchHyAWIB98IRYgFSAfQgFCGYZ+fSEVIBJCAUIZhnxCGochHCATIBx8IRMgEiAcQgFCGoZ+fSESIBZCAUIZhnxCGochICAXICB8IRcgFiAgQgFCGoZ+fSEWIBNCAUIYhnxCGYchHSAUIB18IRQgEyAdQgFCGYZ+fSETIBdCAUIYhnxCGYchISAYICF8IRggFyAhQgFCGYZ+fSEXIBRCAUIZhnxCGochHiAVIB58IRUgFCAeQgFCGoZ+fSEUIBhCAUIZhnxCGochIiAZICJ8IRkgGCAiQgFCGoZ+fSEYIBlCAUIYhnxCGYchIyAQICNCE358IRAgGSAjQgFCGYZ+fSEZIBBCAUIZhnxCGochGiARIBp8IREgECAaQgFCGoZ+fSEQIAAgED4CACAAIBE+AgQgACASPgIIIAAgEz4CDCAAIBQ+AhAgACAVPgIUIAAgFj4CGCAAIBc+AhwgACAYPgIgIAAgGT4CJAs=') + var ready = null + + var mod = { + buffer: wasm, + memory: null, + exports: null, + realloc: realloc, + onload: onload + } + + onload(function () {}) + + return mod + + function realloc (size) { + mod.exports.memory.grow(Math.max(0, Math.ceil(Math.abs(size - mod.memory.length) / 65536))) + mod.memory = new Uint8Array(mod.exports.memory.buffer) + } + + function onload (cb) { + if (mod.exports) return cb() + + if (ready) { + ready.then(cb.bind(null, null)).catch(cb) + return + } + + try { + if (opts && opts.async) throw new Error('async') + setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) + } catch (err) { + ready = WebAssembly.instantiate(wasm, imp).then(setup) + } + + onload(cb) + } + + function setup (w) { + mod.exports = w.instance.exports + mod.memory = mod.exports.memory && mod.exports.memory.buffer && new Uint8Array(mod.exports.memory.buffer) + } +} + +function toUint8Array (s) { + if (typeof atob === 'function') return new Uint8Array(atob(s).split('').map(charCodeAt)) + return (require('buf' + 'fer').Buffer).from(s, 'base64') +} + +function charCodeAt (c) { + return c.charCodeAt(0) +} diff --git a/fe25519_25/fe25519_sq.wat b/fe25519_25/fe25519_sq.wat index 867c675..2e14cf0 100644 --- a/fe25519_25/fe25519_sq.wat +++ b/fe25519_25/fe25519_sq.wat @@ -3,6 +3,7 @@ (export "memory" (memory $0)) (func $sq (export "sq") (param $h i32) (param $f i32) (param $double i32) (param $repeat i32) + (local $count i32) (local $tmp i64) (local $f0 i64) @@ -122,16 +123,16 @@ (block $end (loop $again - (set_local $f0 (i64.extend32_s (get_local $f0))) - (set_local $f1 (i64.extend32_s (get_local $f1))) - (set_local $f2 (i64.extend32_s (get_local $f2))) - (set_local $f3 (i64.extend32_s (get_local $f3))) - (set_local $f4 (i64.extend32_s (get_local $f4))) - (set_local $f5 (i64.extend32_s (get_local $f5))) - (set_local $f6 (i64.extend32_s (get_local $f6))) - (set_local $f7 (i64.extend32_s (get_local $f7))) - (set_local $f8 (i64.extend32_s (get_local $f8))) - (set_local $f9 (i64.extend32_s (get_local $f9))) + (set_local $f0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f0)))) + (set_local $f1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f1)))) + (set_local $f2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f2)))) + (set_local $f3 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f3)))) + (set_local $f4 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f4)))) + (set_local $f5 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f5)))) + (set_local $f6 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f6)))) + (set_local $f7 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f7)))) + (set_local $f8 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f8)))) + (set_local $f9 (i64.extend_s/i32 (i32.wrap/i64 (get_local $f9)))) (set_local $f0_2 (i64.mul (i64.const 2 (get_local $f0)))) (set_local $f1_2 (i64.mul (i64.const 2 (get_local $f1)))) diff --git a/fe25519_25/sc25519_mul.js b/fe25519_25/sc25519_mul.js new file mode 100644 index 0000000..81a0206 --- /dev/null +++ b/fe25519_25/sc25519_mul.js @@ -0,0 +1,61 @@ + +module.exports = loadWebAssembly + +loadWebAssembly.supported = typeof WebAssembly !== 'undefined' + +function loadWebAssembly (opts) { + if (!loadWebAssembly.supported) return null + + var imp = opts && opts.imports + var wasm = toUint8Array('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') + var ready = null + + var mod = { + buffer: wasm, + memory: null, + exports: null, + realloc: realloc, + onload: onload + } + + onload(function () {}) + + return mod + + function realloc (size) { + mod.exports.memory.grow(Math.max(0, Math.ceil(Math.abs(size - mod.memory.length) / 65536))) + mod.memory = new Uint8Array(mod.exports.memory.buffer) + } + + function onload (cb) { + if (mod.exports) return cb() + + if (ready) { + ready.then(cb.bind(null, null)).catch(cb) + return + } + + try { + if (opts && opts.async) throw new Error('async') + setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) + } catch (err) { + ready = WebAssembly.instantiate(wasm, imp).then(setup) + } + + onload(cb) + } + + function setup (w) { + mod.exports = w.instance.exports + mod.memory = mod.exports.memory && mod.exports.memory.buffer && new Uint8Array(mod.exports.memory.buffer) + } +} + +function toUint8Array (s) { + if (typeof atob === 'function') return new Uint8Array(atob(s).split('').map(charCodeAt)) + return (require('buf' + 'fer').Buffer).from(s, 'base64') +} + +function charCodeAt (c) { + return c.charCodeAt(0) +} diff --git a/fe25519_25/sc25519_mul.wat b/fe25519_25/sc25519_mul.wat index 7a9f2c7..29ced76 100644 --- a/fe25519_25/sc25519_mul.wat +++ b/fe25519_25/sc25519_mul.wat @@ -1,4 +1,32 @@ (module + (import "js" "table" (table 1 anyfunc)) + (type $to_void (func + (param $s i32) + (param $s0 i64) + (param $s1 i64) + (param $s2 i64) + (param $s3 i64) + (param $s4 i64) + (param $s5 i64) + (param $s6 i64) + (param $s7 i64) + (param $s8 i64) + (param $s9 i64) + (param $s10 i64) + (param $s11 i64) + (param $s12 i64) + (param $s13 i64) + (param $s14 i64) + (param $s15 i64) + (param $s16 i64) + (param $s17 i64) + (param $s18 i64) + (param $s19 i64) + (param $s20 i64) + (param $s21 i64) + (param $s22 i64) + (param $s23 i64))) + (memory $0 1) (export "memory" (memory $0)) @@ -106,31 +134,31 @@ (set_local $b10 (i64.load32_u offset=40 (get_local $b))) (set_local $b11 (i64.load32_u offset=44 (get_local $b))) - (set_local $a0 (i64.extend_s/i32 (get_local $a0))) - (set_local $a1 (i64.extend_s/i32 (get_local $a1))) - (set_local $a2 (i64.extend_s/i32 (get_local $a2))) - (set_local $a3 (i64.extend_s/i32 (get_local $a3))) - (set_local $a4 (i64.extend_s/i32 (get_local $a4))) - (set_local $a5 (i64.extend_s/i32 (get_local $a5))) - (set_local $a6 (i64.extend_s/i32 (get_local $a6))) - (set_local $a7 (i64.extend_s/i32 (get_local $a7))) - (set_local $a8 (i64.extend_s/i32 (get_local $a8))) - (set_local $a9 (i64.extend_s/i32 (get_local $a9))) - (set_local $a10 (i64.extend_s/i32 (get_local $a10))) - (set_local $a11 (i64.extend_s/i32 (get_local $a11))) + (set_local $a0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a0)))) + (set_local $a1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a1)))) + (set_local $a2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a2)))) + (set_local $a3 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a3)))) + (set_local $a4 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a4)))) + (set_local $a5 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a5)))) + (set_local $a6 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a6)))) + (set_local $a7 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a7)))) + (set_local $a8 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a8)))) + (set_local $a9 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a9)))) + (set_local $a10 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a10)))) + (set_local $a11 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a11)))) - (set_local $b0 (i64.extend_s/i32 (get_local $b0))) - (set_local $b1 (i64.extend_s/i32 (get_local $b1))) - (set_local $b2 (i64.extend_s/i32 (get_local $b2))) - (set_local $b3 (i64.extend_s/i32 (get_local $b3))) - (set_local $b4 (i64.extend_s/i32 (get_local $b4))) - (set_local $b5 (i64.extend_s/i32 (get_local $b5))) - (set_local $b6 (i64.extend_s/i32 (get_local $b6))) - (set_local $b7 (i64.extend_s/i32 (get_local $b7))) - (set_local $b8 (i64.extend_s/i32 (get_local $b8))) - (set_local $b9 (i64.extend_s/i32 (get_local $b9))) - (set_local $b10 (i64.extend_s/i32 (get_local $b10))) - (set_local $b11 (i64.extend_s/i32 (get_local $b11))) + (set_local $b0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b0)))) + (set_local $b1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b1)))) + (set_local $b2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b2)))) + (set_local $b3 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b3)))) + (set_local $b4 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b4)))) + (set_local $b5 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b5)))) + (set_local $b6 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b6)))) + (set_local $b7 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b7)))) + (set_local $b8 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b8)))) + (set_local $b9 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b9)))) + (set_local $b10 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b10)))) + (set_local $b11 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b11)))) (set_local $s0 (i64.mul (get_local $a0) (get_local $b0))) (set_local $s1 (i64.add (i64.mul (get_local $a0) (get_local $b1 )) (i64.mul (get_local $a1) (get_local $b0)))) @@ -274,4 +302,5 @@ (get_local $s21) (get_local $s22) (get_local $s23) - (call $sc_reduce))) + (i32.const 0) + (call_indirect (type $to_void)))) diff --git a/fe25519_25/sc25519_muladd.js b/fe25519_25/sc25519_muladd.js new file mode 100644 index 0000000..dabdf1e --- /dev/null +++ b/fe25519_25/sc25519_muladd.js @@ -0,0 +1,61 @@ + +module.exports = loadWebAssembly + +loadWebAssembly.supported = typeof WebAssembly !== 'undefined' + +function loadWebAssembly (opts) { + if (!loadWebAssembly.supported) return null + + var imp = opts && opts.imports + var wasm = toUint8Array('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') + var ready = null + + var mod = { + buffer: wasm, + memory: null, + exports: null, + realloc: realloc, + onload: onload + } + + onload(function () {}) + + return mod + + function realloc (size) { + mod.exports.memory.grow(Math.max(0, Math.ceil(Math.abs(size - mod.memory.length) / 65536))) + mod.memory = new Uint8Array(mod.exports.memory.buffer) + } + + function onload (cb) { + if (mod.exports) return cb() + + if (ready) { + ready.then(cb.bind(null, null)).catch(cb) + return + } + + try { + if (opts && opts.async) throw new Error('async') + setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) + } catch (err) { + ready = WebAssembly.instantiate(wasm, imp).then(setup) + } + + onload(cb) + } + + function setup (w) { + mod.exports = w.instance.exports + mod.memory = mod.exports.memory && mod.exports.memory.buffer && new Uint8Array(mod.exports.memory.buffer) + } +} + +function toUint8Array (s) { + if (typeof atob === 'function') return new Uint8Array(atob(s).split('').map(charCodeAt)) + return (require('buf' + 'fer').Buffer).from(s, 'base64') +} + +function charCodeAt (c) { + return c.charCodeAt(0) +} diff --git a/fe25519_25/sc25519_muladd.wat b/fe25519_25/sc25519_muladd.wat index 47e4ece..2519898 100644 --- a/fe25519_25/sc25519_muladd.wat +++ b/fe25519_25/sc25519_muladd.wat @@ -1,4 +1,32 @@ (module + (import "js" "table" (table 1 anyfunc)) + (type $to_void (func + (param $s i32) + (param $s0 i64) + (param $s1 i64) + (param $s2 i64) + (param $s3 i64) + (param $s4 i64) + (param $s5 i64) + (param $s6 i64) + (param $s7 i64) + (param $s8 i64) + (param $s9 i64) + (param $s10 i64) + (param $s11 i64) + (param $s12 i64) + (param $s13 i64) + (param $s14 i64) + (param $s15 i64) + (param $s16 i64) + (param $s17 i64) + (param $s18 i64) + (param $s19 i64) + (param $s20 i64) + (param $s21 i64) + (param $s22 i64) + (param $s23 i64))) + (memory $0 1) (export "memory" (memory $0)) @@ -132,44 +160,44 @@ (set_local $c10 (i64.load32_u offset=40 (get_local $c))) (set_local $c11 (i64.load32_u offset=44 (get_local $c))) - (set_local $a0 (i64.extend32_s (get_local $a0))) - (set_local $a1 (i64.extend32_s (get_local $a1))) - (set_local $a2 (i64.extend32_s (get_local $a2))) - (set_local $a3 (i64.extend32_s (get_local $a3))) - (set_local $a4 (i64.extend32_s (get_local $a4))) - (set_local $a5 (i64.extend32_s (get_local $a5))) - (set_local $a6 (i64.extend32_s (get_local $a6))) - (set_local $a7 (i64.extend32_s (get_local $a7))) - (set_local $a8 (i64.extend32_s (get_local $a8))) - (set_local $a9 (i64.extend32_s (get_local $a9))) - (set_local $a10 (i64.extend32_s (get_local $a10))) - (set_local $a11 (i64.extend32_s (get_local $a11))) + (set_local $a0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a0)))) + (set_local $a1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a1)))) + (set_local $a2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a2)))) + (set_local $a3 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a3)))) + (set_local $a4 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a4)))) + (set_local $a5 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a5)))) + (set_local $a6 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a6)))) + (set_local $a7 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a7)))) + (set_local $a8 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a8)))) + (set_local $a9 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a9)))) + (set_local $a10 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a10)))) + (set_local $a11 (i64.extend_s/i32 (i32.wrap/i64 (get_local $a11)))) - (set_local $b0 (i64.extend32_s (get_local $b0))) - (set_local $b1 (i64.extend32_s (get_local $b1))) - (set_local $b2 (i64.extend32_s (get_local $b2))) - (set_local $b3 (i64.extend32_s (get_local $b3))) - (set_local $b4 (i64.extend32_s (get_local $b4))) - (set_local $b5 (i64.extend32_s (get_local $b5))) - (set_local $b6 (i64.extend32_s (get_local $b6))) - (set_local $b7 (i64.extend32_s (get_local $b7))) - (set_local $b8 (i64.extend32_s (get_local $b8))) - (set_local $b9 (i64.extend32_s (get_local $b9))) - (set_local $b10 (i64.extend32_s (get_local $b10))) - (set_local $b11 (i64.extend32_s (get_local $b11))) + (set_local $b0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b0)))) + (set_local $b1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b1)))) + (set_local $b2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b2)))) + (set_local $b3 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b3)))) + (set_local $b4 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b4)))) + (set_local $b5 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b5)))) + (set_local $b6 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b6)))) + (set_local $b7 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b7)))) + (set_local $b8 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b8)))) + (set_local $b9 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b9)))) + (set_local $b10 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b10)))) + (set_local $b11 (i64.extend_s/i32 (i32.wrap/i64 (get_local $b11)))) - (set_local $c0 (i64.extend32_s (get_local $c0))) - (set_local $c1 (i64.extend32_s (get_local $c1))) - (set_local $c2 (i64.extend32_s (get_local $c2))) - (set_local $c3 (i64.extend32_s (get_local $c3))) - (set_local $c4 (i64.extend32_s (get_local $c4))) - (set_local $c5 (i64.extend32_s (get_local $c5))) - (set_local $c6 (i64.extend32_s (get_local $c6))) - (set_local $c7 (i64.extend32_s (get_local $c7))) - (set_local $c8 (i64.extend32_s (get_local $c8))) - (set_local $c9 (i64.extend32_s (get_local $c9))) - (set_local $c10 (i64.extend32_s (get_local $c10))) - (set_local $c11 (i64.extend32_s (get_local $c11))) + (set_local $c0 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c0)))) + (set_local $c1 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c1)))) + (set_local $c2 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c2)))) + (set_local $c3 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c3)))) + (set_local $c4 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c4)))) + (set_local $c5 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c5)))) + (set_local $c6 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c6)))) + (set_local $c7 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c7)))) + (set_local $c8 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c8)))) + (set_local $c9 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c9)))) + (set_local $c10 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c10)))) + (set_local $c11 (i64.extend_s/i32 (i32.wrap/i64 (get_local $c11)))) (set_local $s0 (i64.add (get_local $c0 ) (i64.mul (get_local $a0) (get_local $b0)))) (set_local $s1 (i64.add (get_local $c1 ) (i64.add (i64.mul (get_local $a0) (get_local $b1 )) (i64.mul (get_local $a1) (get_local $b0))))) @@ -313,4 +341,5 @@ (get_local $s21) (get_local $s22) (get_local $s23) - (call $sc_reduce))) + (i32.const 0) + (call_indirect (type $to_void)))) diff --git a/fe25519_25/sc_reduce.js b/fe25519_25/sc_reduce.js new file mode 100644 index 0000000..462fe1b --- /dev/null +++ b/fe25519_25/sc_reduce.js @@ -0,0 +1,61 @@ + +module.exports = loadWebAssembly + +loadWebAssembly.supported = typeof WebAssembly !== 'undefined' + +function loadWebAssembly (opts) { + if (!loadWebAssembly.supported) return null + + var imp = opts && opts.imports + var wasm = toUint8Array('AGFzbQEAAAABIQJgGX9+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4AYAF/AAIOAQJqcwV0YWJsZQFwAAEDAwIAAQUDAQABBycDBm1lbW9yeQIACXNjX3JlZHVjZQAADnNjMjU1MTlfcmVkdWNlAAEJBwEAQQALAQAK+hcC+BYBEX4gDCAYQpPYKH58IQwgDSAYQpjaHH58IQ0gDiAYQuf2J358IQ4gDyAYQq3zPH59IQ8gECAYQtGrCH58IRAgESAYQv3eKX59IREgCyAXQpPYKH58IQsgDCAXQpjaHH58IQwgDSAXQuf2J358IQ0gDiAXQq3zPH59IQ4gDyAXQtGrCH58IQ8gECAXQv3eKX59IRAgCiAWQpPYKH58IQogCyAWQpjaHH58IQsgDCAWQuf2J358IQwgDSAWQq3zPH59IQ0gDiAWQtGrCH58IQ4gDyAWQv3eKX59IQ8gCSAVQpPYKH58IQkgCiAVQpjaHH58IQogCyAVQuf2J358IQsgDCAVQq3zPH59IQwgDSAVQtGrCH58IQ0gDiAVQv3eKX59IQ4gCCAUQpPYKH58IQggCSAUQpjaHH58IQkgCiAUQuf2J358IQogCyAUQq3zPH59IQsgDCAUQtGrCH58IQwgDSAUQv3eKX59IQ0gByATQpPYKH58IQcgCCATQpjaHH58IQggCSATQuf2J358IQkgCiATQq3zPH59IQogCyATQtGrCH58IQsgDCATQv3eKX59IQwgB0IBQhSGfEIVhyEfIAggH3whCCAHIB9CAUIVhn59IQcgCUIBQhSGfEIVhyEhIAogIXwhCiAJICFCAUIVhn59IQkgC0IBQhSGfEIVhyEjIAwgI3whDCALICNCAUIVhn59IQsgDUIBQhSGfEIVhyElIA4gJXwhDiANICVCAUIVhn59IQ0gD0IBQhSGfEIVhyEnIBAgJ3whECAPICdCAUIVhn59IQ8gEUIBQhSGfEIVhyEpIBIgKXwhEiARIClCAUIVhn59IREgCEIBQhSGfEIVhyEgIAkgIHwhCSAIICBCAUIVhn59IQggCkIBQhSGfEIVhyEiIAsgInwhCyAKICJCAUIVhn59IQogDEIBQhSGfEIVhyEkIA0gJHwhDSAMICRCAUIVhn59IQwgDkIBQhSGfEIVhyEmIA8gJnwhDyAOICZCAUIVhn59IQ4gEEIBQhSGfEIVhyEoIBEgKHwhESAQIChCAUIVhn59IRAgBiASQpPYKH58IQYgByASQpjaHH58IQcgCCASQuf2J358IQggCSASQq3zPH59IQkgCiASQtGrCH58IQogCyASQv3eKX59IQsgBSARQpPYKH58IQUgBiARQpjaHH58IQYgByARQuf2J358IQcgCCARQq3zPH59IQggCSARQtGrCH58IQkgCiARQv3eKX59IQogBCAQQpPYKH58IQQgBSAQQpjaHH58IQUgBiAQQuf2J358IQYgByAQQq3zPH59IQcgCCAQQtGrCH58IQggCSAQQv3eKX59IQkgAyAPQpPYKH58IQMgBCAPQpjaHH58IQQgBSAPQuf2J358IQUgBiAPQq3zPH59IQYgByAPQtGrCH58IQcgCCAPQv3eKX59IQggAiAOQpPYKH58IQIgAyAOQpjaHH58IQMgBCAOQuf2J358IQQgBSAOQq3zPH59IQUgBiAOQtGrCH58IQYgByAOQv3eKX59IQcgASANQpPYKH58IQEgAiANQpjaHH58IQIgAyANQuf2J358IQMgBCANQq3zPH59IQQgBSANQtGrCH58IQUgBiANQv3eKX59IQZCACENIAFCAUIUhnxCFYchGSACIBl8IQIgASAZQgFCFYZ+fSEBIANCAUIUhnxCFYchGyAEIBt8IQQgAyAbQgFCFYZ+fSEDIAVCAUIUhnxCFYchHSAGIB18IQYgBSAdQgFCFYZ+fSEFIAdCAUIUhnxCFYchHyAIIB98IQggByAfQgFCFYZ+fSEHIAlCAUIUhnxCFYchISAKICF8IQogCSAhQgFCFYZ+fSEJIAtCAUIUhnxCFYchIyAMICN8IQwgCyAjQgFCFYZ+fSELIAJCAUIUhnxCFYchGiADIBp8IQMgAiAaQgFCFYZ+fSECIARCAUIUhnxCFYchHCAFIBx8IQUgBCAcQgFCFYZ+fSEEIAZCAUIUhnxCFYchHiAHIB58IQcgBiAeQgFCFYZ+fSEGIAhCAUIUhnxCFYchICAJICB8IQkgCCAgQgFCFYZ+fSEIIApCAUIUhnxCFYchIiALICJ8IQsgCiAiQgFCFYZ+fSEKIAxCAUIUhnxCFYchJCANICR8IQ0gDCAkQgFCFYZ+fSEMIAEgDUKT2Ch+fCEBIAIgDUKY2hx+fCECIAMgDULn9id+fCEDIAQgDUKt8zx+fSEEIAUgDULRqwh+fCEFIAYgDUL93il+fSEGQgAhDSABQhWHIRkgAiAZfCECIAEgGUIBQhWGfn0hASACQhWHIRogAyAafCEDIAIgGkIBQhWGfn0hAiADQhWHIRsgBCAbfCEEIAMgG0IBQhWGfn0hAyAEQhWHIRwgBSAcfCEFIAQgHEIBQhWGfn0hBCAFQhWHIR0gBiAdfCEGIAUgHUIBQhWGfn0hBSAGQhWHIR4gByAefCEHIAYgHkIBQhWGfn0hBiAHQhWHIR8gCCAffCEIIAcgH0IBQhWGfn0hByAIQhWHISAgCSAgfCEJIAggIEIBQhWGfn0hCCAJQhWHISEgCiAhfCEKIAkgIUIBQhWGfn0hCSAKQhWHISIgCyAifCELIAogIkIBQhWGfn0hCiALQhWHISMgDCAjfCEMIAsgI0IBQhWGfn0hCyAMQhWHISQgDSAkfCENIAwgJEIBQhWGfn0hDCABIA1Ck9gofnwhASACIA1CmNocfnwhAiADIA1C5/YnfnwhAyAEIA1CrfM8fn0hBCAFIA1C0asIfnwhBSAGIA1C/d4pfn0hBiABQhWHIRkgAiAZfCECIAEgGUIBQhWGfn0hASACQhWHIRogAyAafCEDIAIgGkIBQhWGfn0hAiADQhWHIRsgBCAbfCEEIAMgG0IBQhWGfn0hAyAEQhWHIRwgBSAcfCEFIAQgHEIBQhWGfn0hBCAFQhWHIR0gBiAdfCEGIAUgHUIBQhWGfn0hBSAGQhWHIR4gByAefCEHIAYgHkIBQhWGfn0hBiAHQhWHIR8gCCAffCEIIAcgH0IBQhWGfn0hByAIQhWHISAgCSAgfCEJIAggIEIBQhWGfn0hCCAJQhWHISEgCiAhfCEKIAkgIUIBQhWGfn0hCSAKQhWHISIgCyAifCELIAogIkIBQhWGfn0hCiALQhWHISMgDCAjfCEMIAsgI0IBQhWGfn0hCyAAIAFC/wGDIAFCgP4Dg4QgASACQiB+QhCGhEKAgPwHg4QgAkIVhkKAgID4D4OEIAJCFYZCgICAgPAfg4QgAkIVhiADQgR+QiiGhEKAgICAgOA/g4QgA0IqhkKAgICAgIDA/wCDhCADQiqGIARCgAF+QjiGhEKAgICAgICAgH+DhDcDACAAIARCAYdC/wGDIARCAYdCgP4Dg4QgBEIBhyAFQhB+QhCGhEKAgPwHg4QgBUIUhkKAgID4D4OEIAVCFIZCgICAgPAfg4QgBUIUhiAGQgJ+QiiGhEKAgICAgOA/g4QgBkIphkKAgICAgIDA/wCDhCAGQimGIAdCwAB+QjiGhEKAgICAgICAgH+DhDcDCCAAIAdCAodC/wGDIAdCAodCgP4Dg4QgB0IChyAIQgh+QhCGhEKAgPwHg4QgCEIThkKAgID4D4OEIAhCE4ZCgICAgPAfg4QgCUIohkKAgICAgOA/g4QgCUIohkKAgICAgIDA/wCDhCAJQiiGIApCIH5COIaEQoCAgICAgICAf4OENwMQIAAgCkIDh0L/AYMgCkIDh0KA/gODhCAKQgOHIAtCBH5CEIaEQoCA/AeDhCALQhKGQoCAgPgPg4QgC0IShiAMQoABfkIghoRCgICAgPAfg4QgDEInhkKAgICAgOA/g4QgDEInhkKAgICAgIDA/wCDhCAMQieGQoCAgICAgICAf4OENwMYC34AIAAgADUCACAANQIEIAA1AgggADUCDCAANQIQIAA1AhQgADUCGCAANQIcIAA1AiAgADUCJCAANQIoIAA1AiwgADUCMCAANQI0IAA1AjggADUCPCAANQJAIAA1AkQgADUCSCAANQJMIAA1AlAgADUCVCAANQJYIAA1AlwQAAs=') + var ready = null + + var mod = { + buffer: wasm, + memory: null, + exports: null, + realloc: realloc, + onload: onload + } + + onload(function () {}) + + return mod + + function realloc (size) { + mod.exports.memory.grow(Math.max(0, Math.ceil(Math.abs(size - mod.memory.length) / 65536))) + mod.memory = new Uint8Array(mod.exports.memory.buffer) + } + + function onload (cb) { + if (mod.exports) return cb() + + if (ready) { + ready.then(cb.bind(null, null)).catch(cb) + return + } + + try { + if (opts && opts.async) throw new Error('async') + setup({instance: new WebAssembly.Instance(new WebAssembly.Module(wasm), imp)}) + } catch (err) { + ready = WebAssembly.instantiate(wasm, imp).then(setup) + } + + onload(cb) + } + + function setup (w) { + mod.exports = w.instance.exports + mod.memory = mod.exports.memory && mod.exports.memory.buffer && new Uint8Array(mod.exports.memory.buffer) + } +} + +function toUint8Array (s) { + if (typeof atob === 'function') return new Uint8Array(atob(s).split('').map(charCodeAt)) + return (require('buf' + 'fer').Buffer).from(s, 'base64') +} + +function charCodeAt (c) { + return c.charCodeAt(0) +} diff --git a/fe25519_25/sc_reduce.wat b/fe25519_25/sc_reduce.wat index 188e8fc..0c06093 100644 --- a/fe25519_25/sc_reduce.wat +++ b/fe25519_25/sc_reduce.wat @@ -1,9 +1,12 @@ (module + (import "js" "table" (table 1 anyfunc)) + (elem (i32.const 0) $sc_reduce) + (memory $0 1) (export "memory" (memory $0)) - + (func $sc_reduce (export "sc_reduce") - (param $ptr i32) + (param $s i32) (param $s0 i64) (param $s1 i64) @@ -30,6 +33,24 @@ (param $s22 i64) (param $s23 i64) + (local $carry0 i64) + (local $carry1 i64) + (local $carry2 i64) + (local $carry3 i64) + (local $carry4 i64) + (local $carry5 i64) + (local $carry6 i64) + (local $carry7 i64) + (local $carry8 i64) + (local $carry9 i64) + (local $carry10 i64) + (local $carry11 i64) + (local $carry12 i64) + (local $carry13 i64) + (local $carry14 i64) + (local $carry15 i64) + (local $carry16 i64) + (set_local $s11 (i64.add (get_local $s11) (i64.mul (get_local $s23) (i64.const 666643)))) (set_local $s12 (i64.add (get_local $s12) (i64.mul (get_local $s23) (i64.const 470296)))) (set_local $s13 (i64.add (get_local $s13) (i64.mul (get_local $s23) (i64.const 654183))))