use tables to share functions between modules

This commit is contained in:
Christophe Diederichs 2020-10-12 16:41:06 +02:00
parent 3c2f81c3f3
commit 40bced0da1
14 changed files with 730 additions and 217 deletions

View File

@ -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))
/////////////////////////////////////////////////////

View File

@ -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) {

File diff suppressed because one or more lines are too long

62
fe25519_25/fe25519_mul.js Normal file
View File

@ -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)
}

View File

@ -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)))

File diff suppressed because one or more lines are too long

61
fe25519_25/fe25519_sq.js Normal file
View File

@ -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)
}

View File

@ -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))))

61
fe25519_25/sc25519_mul.js Normal file
View File

@ -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)
}

View File

@ -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))))

View File

@ -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)
}

View File

@ -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))))

61
fe25519_25/sc_reduce.js Normal file
View File

@ -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)
}

View File

@ -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))))