diff options
Diffstat (limited to 'docs/demo/bls.js')
-rw-r--r-- | docs/demo/bls.js | 970 |
1 files changed, 490 insertions, 480 deletions
diff --git a/docs/demo/bls.js b/docs/demo/bls.js index 748e150..8a3cc1a 100644 --- a/docs/demo/bls.js +++ b/docs/demo/bls.js @@ -1,505 +1,515 @@ -(function(return_bls) { - if (typeof exports === 'object') { - module.exports = return_bls() - } else { - window.bls = return_bls() - } -})(function() { +(function(generator) { + if (typeof exports === 'object') { + const crypto = require('crypto') + crypto.getRandomValues = crypto.randomFillSync + exports.mod = require('./bls_c.js') + generator(exports, crypto, true) + } else { const crypto = window.crypto || window.msCrypto + let exports = {} + exports.mod = {} + window.bls = generator(exports, crypto, false) + } +})(function(exports, crypto, isNodeJs) { - const MCLBN_CURVE_FP254BNB = 0 - const MCLBN_CURVE_FP382_1 = 1 - const MCLBN_CURVE_FP382_2 = 2 + const MCLBN_CURVE_FP254BNB = 0 + const MCLBN_CURVE_FP382_1 = 1 + const MCLBN_CURVE_FP382_2 = 2 - const MCLBN_FP_UNIT_SIZE = 6 + const MCLBN_FP_UNIT_SIZE = 6 - const MCLBN_FP_SIZE = MCLBN_FP_UNIT_SIZE * 8 - const MCLBN_G1_SIZE = MCLBN_FP_SIZE * 3 - const MCLBN_G2_SIZE = MCLBN_FP_SIZE * 6 - const MCLBN_GT_SIZE = MCLBN_FP_SIZE * 12 + const MCLBN_FP_SIZE = MCLBN_FP_UNIT_SIZE * 8 + const MCLBN_G1_SIZE = MCLBN_FP_SIZE * 3 + const MCLBN_G2_SIZE = MCLBN_FP_SIZE * 6 + const MCLBN_GT_SIZE = MCLBN_FP_SIZE * 12 - const BLS_ID_SIZE = MCLBN_FP_UNIT_SIZE * 8 - const BLS_SECRETKEY_SIZE = BLS_ID_SIZE - const BLS_PUBLICKEY_SIZE = BLS_ID_SIZE * 3 * 2 - const BLS_SIGNATURE_SIZE = BLS_ID_SIZE * 3 + const BLS_ID_SIZE = MCLBN_FP_UNIT_SIZE * 8 + const BLS_SECRETKEY_SIZE = BLS_ID_SIZE + const BLS_PUBLICKEY_SIZE = BLS_ID_SIZE * 3 * 2 + const BLS_SIGNATURE_SIZE = BLS_ID_SIZE * 3 - let mod = {} - let capi = {} - let self = {} - self.mod = mod - self.capi = capi + let g_callback = null + let g_curveType = 0 - const setupWasm = function(fileName, nameSpace, setupFct) { - console.log('setupWasm ' + fileName) - fetch(fileName) - .then(response => response.arrayBuffer()) - .then(buffer => new Uint8Array(buffer)) - .then(binary => { - mod['wasmBinary'] = binary - mod['onRuntimeInitialized'] = function() { - setupFct(mod, nameSpace) - console.log('setupWasm end') - } - Module(mod) - }) - return mod - } - const ptrToStr = function(pos, n) { - let s = '' - for (let i = 0; i < n; i++) { - s += String.fromCharCode(mod.HEAP8[pos + i]) - } - return s - } - const Uint8ArrayToMem = function(pos, buf) { - for (let i = 0; i < buf.length; i++) { - mod.HEAP8[pos + i] = buf[i] - } - } - const AsciiStrToMem = function(pos, s) { - for (let i = 0; i < s.length; i++) { - mod.HEAP8[pos + i] = s.charCodeAt(i) - } - } - const copyToUint32Array = function(a, pos) { - for (let i = 0; i < a.length; i++) { - a[i] = mod.HEAP32[pos / 4 + i] - } - } - const copyFromUint32Array = function(pos, a) { - for (let i = 0; i < a.length; i++) { - mod.HEAP32[pos / 4 + i] = a[i] - } - } - self.toHex = function(a, start, n) { - let s = '' - for (let i = 0; i < n; i++) { - s += ('0' + a[start + i].toString(16)).slice(-2) - } - return s - } - // Uint8Array to hex string - self.toHexStr = function(a) { - return self.toHex(a, 0, a.length) - } - // hex string to Uint8Array - self.fromHexStr = function(s) { - if (s.length & 1) throw('fromHexStr:length must be even ' + s.length) - let n = s.length / 2 - let a = new Uint8Array(n) - for (let i = 0; i < n; i++) { - a[i] = parseInt(s.slice(i * 2, i * 2 + 2), 16) - } - return a - } + let capi = {} + exports.capi = capi + let mod = exports.mod - const wrap_outputString = function(func, doesReturnString = true) { - return function(x, ioMode = 0) { - let maxBufSize = 2048 - let stack = mod.Runtime.stackSave() - let pos = mod.Runtime.stackAlloc(maxBufSize) - let n = func(pos, maxBufSize, x, ioMode) - if (n < 0) { - throw('err gen_str:' + x) - } - if (doesReturnString) { - let s = ptrToStr(pos, n) - mod.Runtime.stackRestore(stack) - return s - } else { - let a = new Uint8Array(n) - for (let i = 0; i < n; i++) { - a[i] = mod.HEAP8[pos + i] - } - mod.Runtime.stackRestore(stack) - return a - } - } - } - const wrap_outputArray = function(func) { - return wrap_outputString(func, false) - } - /* - argNum : n - func(x0, ..., x_(n-1), buf, ioMode) - => func(x0, ..., x_(n-1), pos, buf.length, ioMode) - */ - const wrap_input = function(func, argNum, returnValue = false) { - return function() { - const args = [...arguments] - let buf = args[argNum] - let ioMode = args[argNum + 1] // may undefined - let stack = mod.Runtime.stackSave() - let pos = mod.Runtime.stackAlloc(buf.length) - if (typeof(buf) == "string") { - AsciiStrToMem(pos, buf) - } else { - Uint8ArrayToMem(pos, buf) - } - let r = func(...args.slice(0, argNum), pos, buf.length, ioMode) - mod.Runtime.stackRestore(stack) - if (returnValue) return r - if (r) throw('err wrap_input ' + buf) - } - } - const callSetter = function(func, a, p1, p2) { - let pos = mod._malloc(a.length * 4) - func(pos, p1, p2) // p1, p2 may be undefined - copyToUint32Array(a, pos) - mod._free(pos) - } - const callGetter = function(func, a, p1, p2) { - let pos = mod._malloc(a.length * 4) - mod.HEAP32.set(a, pos / 4) - let s = func(pos, p1, p2) - mod._free(pos) - return s - } - const wrap_keyShare = function(func, dataSize) { - return function(x, vec, id) { - let k = vec.length - let p = mod._malloc(dataSize * k) - for (let i = 0; i < k; i++) { - mod._memcpy(p + i * dataSize, vec[i], dataSize) - } - let r = func(x, p, k, id) - mod._free(p) - if (r) throw('keyShare ' + k) - } - } - const wrap_recover = function(func, dataSize, idDataSize) { - return function(x, vec, idVec) { - let n = vec.length - let p = mod._malloc(dataSize * n) - let q = mod._malloc(idDataSize * n) - for (let i = 0; i < n; i++) { - mod._memcpy(p + i * dataSize, vec[i], dataSize) - mod._memcpy(q + i * idDataSize, idVec[i], idDataSize) - } - let r = func(x, p, q, n) - mod._free(q) - mod._free(p) - if (r) throw('recover ' + n) - } - } - const callShare = function(func, a, size, vec, id) { - let stack = mod.Runtime.stackSave() - let pos = mod.Runtime.stackAlloc(a.length * 4) - let idPos = mod.Runtime.stackAlloc(id.a_.length * 4) - mod.HEAP32.set(a, pos / 4) - mod.HEAP32.set(id.a_, idPos / 4) - let vecPos = mod._malloc(size * vec.length) - for (let i = 0; i < vec.length; i++) { - copyFromUint32Array(vecPos + size * i, vec[i].a_) - } - func(pos, vecPos, vec.length, idPos) - mod._free(vecPos) - copyToUint32Array(a, pos) - mod.Runtime.stackRestore(stack) - } - const callRecover = function(func, a, size, vec, idVec) { - let n = vec.length - if (n != idVec.length) throw('recover:bad length') - let stack = mod.Runtime.stackSave() - let secPos = mod.Runtime.stackAlloc(a.length * 4) - let vecPos = mod._malloc(size * n) - let idVecPos = mod._malloc(BLS_ID_SIZE * n) - for (let i = 0; i < n; i++) { - copyFromUint32Array(vecPos + size * i, vec[i].a_) - copyFromUint32Array(idVecPos + BLS_ID_SIZE * i, idVec[i].a_) - } - func(secPos, vecPos, idVecPos, n) - mod._free(idVecPos) - mod._free(vecPos) - copyToUint32Array(a, secPos) - mod.Runtime.stackRestore(stack) - } - const define_extra_functions = function(mod) { - capi.mclBnFr_malloc = function() { - return mod._malloc(MCLBN_FP_SIZE) - } - capi.mcl_free = function(x) { - mod._free(x) - } - capi.mclBnFr_deserialize = wrap_input(capi._mclBnFr_deserialize, 1) - capi.mclBnFr_setLittleEndian = wrap_input(capi._mclBnFr_setLittleEndian, 1) - capi.mclBnFr_setStr = wrap_input(capi._mclBnFr_setStr, 1) - capi.mclBnFr_getStr = wrap_outputString(capi._mclBnFr_getStr) - capi.mclBnFr_setHashOf = wrap_input(capi._mclBnFr_setHashOf, 1) + exports.init = function(callback = null, curveType = MCLBN_CURVE_FP254BNB) { + console.log('init') + g_callback = callback + g_curveType = curveType + if (isNodeJs) { + } else { + fetch('bls_c.wasm') + .then(response => response.arrayBuffer()) + .then(buffer => new Uint8Array(buffer)) + .then(binary => { Module(mod) }) + } + } - /////////////////////////////////////////////////////////////// - capi.mclBnG1_malloc = function() { - return mod._malloc(MCLBN_G1_SIZE) - } - capi.mclBnG1_setStr = wrap_input(capi._mclBnG1_setStr, 1) - capi.mclBnG1_getStr = wrap_outputString(capi._mclBnG1_getStr) - capi.mclBnG1_deserialize = wrap_input(capi._mclBnG1_deserialize, 1) - capi.mclBnG1_serialize = wrap_outputArray(capi._mclBnG1_serialize) - capi.mclBnG1_hashAndMapTo = wrap_input(capi._mclBnG1_hashAndMapTo, 1) + mod.onRuntimeInitialized = function() { + console.log('onRuntimeInitialized') + const f = function(exportedFuncs) { + exportedFuncs.forEach(func => { + capi[func.exportName] = mod.cwrap(func.name, func.returns, func.args) + }) + define_extra_functions(mod) + let r = capi.blsInit(g_curveType) + console.log('finished ' + r) + if (g_callback) g_callback() + } + if (isNodeJs) { + const fs = require('fs') + const jsonStr = fs.readFileSync('./exported-bls.json') + f(JSON.parse(jsonStr)) + } else { + fetch('exported-bls.json') + .then(response => response.json()) + .then(exportedFuncs => f(exportedFuncs)) + } + } - /////////////////////////////////////////////////////////////// - capi.mclBnG2_malloc = function() { - return mod._malloc(MCLBN_G2_SIZE) - } - capi.mclBnG2_setStr = wrap_input(capi._mclBnG2_setStr, 1) - capi.mclBnG2_getStr = wrap_outputString(capi._mclBnG2_getStr) - capi.mclBnG2_deserialize = wrap_input(capi._mclBnG2_deserialize, 1) - capi.mclBnG2_serialize = wrap_outputArray(capi._mclBnG2_serialize) - capi.mclBnG2_hashAndMapTo = wrap_input(capi._mclBnG2_hashAndMapTo, 1) + const ptrToStr = function(pos, n) { + let s = '' + for (let i = 0; i < n; i++) { + s += String.fromCharCode(mod.HEAP8[pos + i]) + } + return s + } + const Uint8ArrayToMem = function(pos, buf) { + for (let i = 0; i < buf.length; i++) { + mod.HEAP8[pos + i] = buf[i] + } + } + const AsciiStrToMem = function(pos, s) { + for (let i = 0; i < s.length; i++) { + mod.HEAP8[pos + i] = s.charCodeAt(i) + } + } + const copyToUint32Array = function(a, pos) { + a.set(mod.HEAP32.subarray(pos / 4, pos / 4 + a.length)) +// for (let i = 0; i < a.length; i++) { +// a[i] = mod.HEAP32[pos / 4 + i] +// } + } + const copyFromUint32Array = function(pos, a) { + for (let i = 0; i < a.length; i++) { + mod.HEAP32[pos / 4 + i] = a[i] + } + } + exports.toHex = function(a, start, n) { + let s = '' + for (let i = 0; i < n; i++) { + s += ('0' + a[start + i].toString(16)).slice(-2) + } + return s + } + // Uint8Array to hex string + exports.toHexStr = function(a) { + return exports.toHex(a, 0, a.length) + } + // hex string to Uint8Array + exports.fromHexStr = function(s) { + if (s.length & 1) throw('fromHexStr:length must be even ' + s.length) + let n = s.length / 2 + let a = new Uint8Array(n) + for (let i = 0; i < n; i++) { + a[i] = parseInt(s.slice(i * 2, i * 2 + 2), 16) + } + return a + } - /////////////////////////////////////////////////////////////// - capi.mclBnGT_malloc = function() { - return mod._malloc(MCLBN_GT_SIZE) - } - capi.mclBnGT_deserialize = wrap_input(capi._mclBnGT_deserialize, 1) - capi.mclBnGT_serialize = wrap_outputArray(capi._mclBnGT_serialize) - capi.mclBnGT_setStr = wrap_input(capi._mclBnGT_setStr, 1) - capi.mclBnGT_getStr = wrap_outputString(capi._mclBnGT_getStr) - /////////////////////////////////////////////////////////////// - capi.bls_free = capi.mcl_free - capi.blsId_malloc = capi.mclBnFr_malloc - capi.blsSecretKey_malloc = capi.mclBnFr_malloc - capi.blsPublicKey_malloc = capi.mclBnG2_malloc - capi.blsSignature_malloc = capi.mclBnG1_malloc + const wrap_outputString = function(func, doesReturnString = true) { + return function(x, ioMode = 0) { + let maxBufSize = 2048 + let stack = mod.Runtime.stackSave() + let pos = mod.Runtime.stackAlloc(maxBufSize) + let n = func(pos, maxBufSize, x, ioMode) + if (n < 0) { + throw('err gen_str:' + x) + } + if (doesReturnString) { + let s = ptrToStr(pos, n) + mod.Runtime.stackRestore(stack) + return s + } else { + let a = new Uint8Array(n) + for (let i = 0; i < n; i++) { + a[i] = mod.HEAP8[pos + i] + } + mod.Runtime.stackRestore(stack) + return a + } + } + } + const wrap_outputArray = function(func) { + return wrap_outputString(func, false) + } + /* + argNum : n + func(x0, ..., x_(n-1), buf, ioMode) + => func(x0, ..., x_(n-1), pos, buf.length, ioMode) + */ + const wrap_input = function(func, argNum, returnValue = false) { + return function() { + const args = [...arguments] + let buf = args[argNum] + let ioMode = args[argNum + 1] // may undefined + let stack = mod.Runtime.stackSave() + let pos = mod.Runtime.stackAlloc(buf.length) + if (typeof(buf) == "string") { + AsciiStrToMem(pos, buf) + } else { + Uint8ArrayToMem(pos, buf) + } + let r = func(...args.slice(0, argNum), pos, buf.length, ioMode) + mod.Runtime.stackRestore(stack) + if (returnValue) return r + if (r) throw('err wrap_input ' + buf) + } + } + const callSetter = function(func, a, p1, p2) { + let pos = mod._malloc(a.length * 4) + func(pos, p1, p2) // p1, p2 may be undefined + copyToUint32Array(a, pos) + mod._free(pos) + } + const callGetter = function(func, a, p1, p2) { + let pos = mod._malloc(a.length * 4) + mod.HEAP32.set(a, pos / 4) + let s = func(pos, p1, p2) + mod._free(pos) + return s + } + const wrap_keyShare = function(func, dataSize) { + return function(x, vec, id) { + let k = vec.length + let p = mod._malloc(dataSize * k) + for (let i = 0; i < k; i++) { + mod._memcpy(p + i * dataSize, vec[i], dataSize) + } + let r = func(x, p, k, id) + mod._free(p) + if (r) throw('keyShare ' + k) + } + } + const wrap_recover = function(func, dataSize, idDataSize) { + return function(x, vec, idVec) { + let n = vec.length + let p = mod._malloc(dataSize * n) + let q = mod._malloc(idDataSize * n) + for (let i = 0; i < n; i++) { + mod._memcpy(p + i * dataSize, vec[i], dataSize) + mod._memcpy(q + i * idDataSize, idVec[i], idDataSize) + } + let r = func(x, p, q, n) + mod._free(q) + mod._free(p) + if (r) throw('recover ' + n) + } + } + const callShare = function(func, a, size, vec, id) { + let stack = mod.Runtime.stackSave() + let pos = mod.Runtime.stackAlloc(a.length * 4) + let idPos = mod.Runtime.stackAlloc(id.a_.length * 4) + mod.HEAP32.set(a, pos / 4) + mod.HEAP32.set(id.a_, idPos / 4) + let vecPos = mod._malloc(size * vec.length) + for (let i = 0; i < vec.length; i++) { + copyFromUint32Array(vecPos + size * i, vec[i].a_) + } + func(pos, vecPos, vec.length, idPos) + mod._free(vecPos) + copyToUint32Array(a, pos) + mod.Runtime.stackRestore(stack) + } + const callRecover = function(func, a, size, vec, idVec) { + let n = vec.length + if (n != idVec.length) throw('recover:bad length') + let stack = mod.Runtime.stackSave() + let secPos = mod.Runtime.stackAlloc(a.length * 4) + let vecPos = mod._malloc(size * n) + let idVecPos = mod._malloc(BLS_ID_SIZE * n) + for (let i = 0; i < n; i++) { + copyFromUint32Array(vecPos + size * i, vec[i].a_) + copyFromUint32Array(idVecPos + BLS_ID_SIZE * i, idVec[i].a_) + } + func(secPos, vecPos, idVecPos, n) + mod._free(idVecPos) + mod._free(vecPos) + copyToUint32Array(a, secPos) + mod.Runtime.stackRestore(stack) + } + const define_extra_functions = function(mod) { + capi.mclBnFr_malloc = function() { + return mod._malloc(MCLBN_FP_SIZE) + } + capi.mcl_free = function(x) { + mod._free(x) + } + capi.mclBnFr_deserialize = wrap_input(capi._mclBnFr_deserialize, 1) + capi.mclBnFr_setLittleEndian = wrap_input(capi._mclBnFr_setLittleEndian, 1) + capi.mclBnFr_setStr = wrap_input(capi._mclBnFr_setStr, 1) + capi.mclBnFr_getStr = wrap_outputString(capi._mclBnFr_getStr) + capi.mclBnFr_setHashOf = wrap_input(capi._mclBnFr_setHashOf, 1) - capi.blsInit = function(curveType = MCLBN_CURVE_FP254BNB) { - return capi._blsInit(curveType, MCLBN_FP_UNIT_SIZE) - } + /////////////////////////////////////////////////////////////// + capi.mclBnG1_malloc = function() { + return mod._malloc(MCLBN_G1_SIZE) + } + capi.mclBnG1_setStr = wrap_input(capi._mclBnG1_setStr, 1) + capi.mclBnG1_getStr = wrap_outputString(capi._mclBnG1_getStr) + capi.mclBnG1_deserialize = wrap_input(capi._mclBnG1_deserialize, 1) + capi.mclBnG1_serialize = wrap_outputArray(capi._mclBnG1_serialize) + capi.mclBnG1_hashAndMapTo = wrap_input(capi._mclBnG1_hashAndMapTo, 1) - capi.blsGetCurveOrder = wrap_outputString(capi._blsGetCurveOrder) - capi.blsGetFieldOrder = wrap_outputString(capi._blsGetFieldOrder) + /////////////////////////////////////////////////////////////// + capi.mclBnG2_malloc = function() { + return mod._malloc(MCLBN_G2_SIZE) + } + capi.mclBnG2_setStr = wrap_input(capi._mclBnG2_setStr, 1) + capi.mclBnG2_getStr = wrap_outputString(capi._mclBnG2_getStr) + capi.mclBnG2_deserialize = wrap_input(capi._mclBnG2_deserialize, 1) + capi.mclBnG2_serialize = wrap_outputArray(capi._mclBnG2_serialize) + capi.mclBnG2_hashAndMapTo = wrap_input(capi._mclBnG2_hashAndMapTo, 1) - capi.blsIdSetDecStr = wrap_input(capi._blsIdSetDecStr, 1) - capi.blsIdSetHexStr = wrap_input(capi._blsIdSetHexStr, 1) - capi.blsIdGetDecStr = wrap_outputString(capi._blsIdGetDecStr) - capi.blsIdGetHexStr = wrap_outputString(capi._blsIdGetHexStr) + /////////////////////////////////////////////////////////////// + capi.mclBnGT_malloc = function() { + return mod._malloc(MCLBN_GT_SIZE) + } + capi.mclBnGT_deserialize = wrap_input(capi._mclBnGT_deserialize, 1) + capi.mclBnGT_serialize = wrap_outputArray(capi._mclBnGT_serialize) + capi.mclBnGT_setStr = wrap_input(capi._mclBnGT_setStr, 1) + capi.mclBnGT_getStr = wrap_outputString(capi._mclBnGT_getStr) + /////////////////////////////////////////////////////////////// + capi.bls_free = capi.mcl_free + capi.blsId_malloc = capi.mclBnFr_malloc + capi.blsSecretKey_malloc = capi.mclBnFr_malloc + capi.blsPublicKey_malloc = capi.mclBnG2_malloc + capi.blsSignature_malloc = capi.mclBnG1_malloc - capi.blsSecretKeySetDecStr = wrap_input(capi._blsSecretKeySetDecStr, 1) - capi.blsSecretKeySetHexStr = wrap_input(capi._blsSecretKeySetHexStr, 1) - capi.blsSecretKeyGetDecStr = wrap_outputString(capi._blsSecretKeyGetDecStr) - capi.blsSecretKeyGetHexStr = wrap_outputString(capi._blsSecretKeyGetHexStr) + capi.blsInit = function(curveType = MCLBN_CURVE_FP254BNB) { + return capi._blsInit(curveType, MCLBN_FP_UNIT_SIZE) + } - capi.blsIdSerialize = wrap_outputArray(capi._blsIdSerialize) - capi.blsSecretKeySerialize = wrap_outputArray(capi._blsSecretKeySerialize) - capi.blsPublicKeySerialize = wrap_outputArray(capi._blsPublicKeySerialize) - capi.blsSignatureSerialize = wrap_outputArray(capi._blsSignatureSerialize) + capi.blsGetCurveOrder = wrap_outputString(capi._blsGetCurveOrder) + capi.blsGetFieldOrder = wrap_outputString(capi._blsGetFieldOrder) - capi.blsIdDeserialize = wrap_input(capi._blsIdDeserialize, 1) - capi.blsSecretKeyDeserialize = wrap_input(capi._blsSecretKeyDeserialize, 1) - capi.blsPublicKeyDeserialize = wrap_input(capi._blsPublicKeyDeserialize, 1) - capi.blsSignatureDeserialize = wrap_input(capi._blsSignatureDeserialize, 1) + capi.blsIdSetDecStr = wrap_input(capi._blsIdSetDecStr, 1) + capi.blsIdSetHexStr = wrap_input(capi._blsIdSetHexStr, 1) + capi.blsIdGetDecStr = wrap_outputString(capi._blsIdGetDecStr) + capi.blsIdGetHexStr = wrap_outputString(capi._blsIdGetHexStr) - capi.blsSecretKeySetLittleEndian = wrap_input(capi._blsSecretKeySetLittleEndian, 1) - capi.blsHashToSecretKey = wrap_input(capi._blsHashToSecretKey, 1) - capi.blsSign = wrap_input(capi._blsSign, 2) - capi.blsVerify = wrap_input(capi._blsVerify, 2, true) + capi.blsSecretKeySetDecStr = wrap_input(capi._blsSecretKeySetDecStr, 1) + capi.blsSecretKeySetHexStr = wrap_input(capi._blsSecretKeySetHexStr, 1) + capi.blsSecretKeyGetDecStr = wrap_outputString(capi._blsSecretKeyGetDecStr) + capi.blsSecretKeyGetHexStr = wrap_outputString(capi._blsSecretKeyGetHexStr) - capi.blsSecretKeyShare = wrap_keyShare(capi._blsSecretKeyShare, BLS_SECRETKEY_SIZE) - capi.blsPublicKeyShare = wrap_keyShare(capi._blsPublicKeyShare, BLS_PUBLICKEY_SIZE) - capi.blsSecretKeyRecover = wrap_recover(capi._blsSecretKeyRecover, BLS_SECRETKEY_SIZE, BLS_ID_SIZE) - capi.blsPublicKeyRecover = wrap_recover(capi._blsPublicKeyRecover, BLS_PUBLICKEY_SIZE, BLS_ID_SIZE) - capi.blsSignatureRecover = wrap_recover(capi._blsSignatureRecover, BLS_SIGNATURE_SIZE, BLS_ID_SIZE) + capi.blsIdSerialize = wrap_outputArray(capi._blsIdSerialize) + capi.blsSecretKeySerialize = wrap_outputArray(capi._blsSecretKeySerialize) + capi.blsPublicKeySerialize = wrap_outputArray(capi._blsPublicKeySerialize) + capi.blsSignatureSerialize = wrap_outputArray(capi._blsSignatureSerialize) - capi.sheInit = function(curveType = MCLBN_CURVE_FP254BNB) { - let r = capi._sheInit(curveType, MCLBN_FP_UNIT_SIZE) - console.log('sheInit ' + r) - if (r) throw('sheInit') - } - class Common { - constructor(size) { - this.a_ = new Uint32Array(size / 4) - } - fromHexStr(s) { - this.deserialize(self.fromHexStr(s)) - } - toHexStr() { - return self.toHexStr(this.serialize()) - } - dump(msg = '') { - console.log(msg + this.toHexStr()) - } - } + capi.blsIdDeserialize = wrap_input(capi._blsIdDeserialize, 1) + capi.blsSecretKeyDeserialize = wrap_input(capi._blsSecretKeyDeserialize, 1) + capi.blsPublicKeyDeserialize = wrap_input(capi._blsPublicKeyDeserialize, 1) + capi.blsSignatureDeserialize = wrap_input(capi._blsSignatureDeserialize, 1) - self.Id = class extends Common { - constructor() { - super(BLS_ID_SIZE) - } - setInt(x) { - callSetter(capi.blsIdSetInt, this.a_, x) - } - setByCSPRNG() { - callSetter(capi.blsSecretKeySetByCSPRNG, this.a_) // same type of BlsSecretKey - } - setStr(s, base = 10) { - switch (base) { - case 10: - callSetter(capi.blsIdSetDecStr, this.a_, s) - return - case 16: - callSetter(capi.blsIdSetHexStr, this.a_, s) - return - default: - throw('BlsId.setStr:bad base:' + base) - } - } - deserialize(s) { - callSetter(capi.blsIdDeserialize, this.a_, s) - } - getStr(base = 10) { - switch (base) { - case 10: - return callGetter(capi.blsIdGetDecStr, this.a_) - case 16: - return callGetter(capi.blsIdGetHexStr, this.a_) - default: - throw('BlsId.getStr:bad base:' + base) - } - } - serialize() { - return callGetter(capi.blsIdSerialize, this.a_) - } - } - self.getIdFromHexStr = function(s) { - r = new self.Id() - r.fromHexStr(s) - return r - } + capi.blsSecretKeySetLittleEndian = wrap_input(capi._blsSecretKeySetLittleEndian, 1) + capi.blsHashToSecretKey = wrap_input(capi._blsHashToSecretKey, 1) + capi.blsSign = wrap_input(capi._blsSign, 2) + capi.blsVerify = wrap_input(capi._blsVerify, 2, true) - self.SecretKey = class extends Common { - constructor() { - super(BLS_SECRETKEY_SIZE) - } - setInt(x) { - callSetter(capi.blsIdSetInt, this.a_, x) // same as Id - } - deserialize(s) { - callSetter(capi.blsSecretKeyDeserialize, this.a_, s) - } - setLittleEndian(s) { - callSetter(capi.blsSecretKeySetLittleEndian, this.a_, s) - } - serialize() { - return callGetter(capi.blsSecretKeySerialize, this.a_) - } - share(msk, id) { - callShare(capi._blsSecretKeyShare, this.a_, BLS_SECRETKEY_SIZE, msk, id) - } - recover(secVec, idVec) { - callRecover(capi._blsSecretKeyRecover, this.a_, BLS_SECRETKEY_SIZE, secVec, idVec) - } - setHashOf(s) { - callSetter(capi.blsHashToSecretKey, this.a_, s) - } - setByCSPRNG() { - let a = new Uint8Array(BLS_SECRETKEY_SIZE) - crypto.getRandomValues(a) - this.setLittleEndian(a) - // callSetter(capi.blsSecretKeySetByCSPRNG, this.a_) - } - getPublicKey() { - let pub = new self.PublicKey() - let stack = mod.Runtime.stackSave() - let secPos = mod.Runtime.stackAlloc(this.a_.length * 4) - let pubPos = mod.Runtime.stackAlloc(pub.a_.length * 4) - mod.HEAP32.set(this.a_, secPos / 4) - capi.blsGetPublicKey(pubPos, secPos) - copyToUint32Array(pub.a_, pubPos) - mod.Runtime.stackRestore(stack) - return pub - } - /* - input - m : message (string or Uint8Array) - return - BlsSignature - */ - sign(m) { - let sig = new self.Signature() - let stack = mod.Runtime.stackSave() - let secPos = mod.Runtime.stackAlloc(this.a_.length * 4) - let sigPos = mod.Runtime.stackAlloc(sig.a_.length * 4) - mod.HEAP32.set(this.a_, secPos / 4) - capi.blsSign(sigPos, secPos, m) - copyToUint32Array(sig.a_, sigPos) - mod.Runtime.stackRestore(stack) - return sig - } - } - self.getSecretKeyFromHexStr = function(s) { - r = new self.SecretKey() - r.fromHexStr(s) - return r - } + capi.blsSecretKeyShare = wrap_keyShare(capi._blsSecretKeyShare, BLS_SECRETKEY_SIZE) + capi.blsPublicKeyShare = wrap_keyShare(capi._blsPublicKeyShare, BLS_PUBLICKEY_SIZE) + capi.blsSecretKeyRecover = wrap_recover(capi._blsSecretKeyRecover, BLS_SECRETKEY_SIZE, BLS_ID_SIZE) + capi.blsPublicKeyRecover = wrap_recover(capi._blsPublicKeyRecover, BLS_PUBLICKEY_SIZE, BLS_ID_SIZE) + capi.blsSignatureRecover = wrap_recover(capi._blsSignatureRecover, BLS_SIGNATURE_SIZE, BLS_ID_SIZE) - self.PublicKey = class extends Common { - constructor() { - super(BLS_PUBLICKEY_SIZE) - } - deserialize(s) { - callSetter(capi.blsPublicKeyDeserialize, this.a_, s) - } - serialize() { - return callGetter(capi.blsPublicKeySerialize, this.a_) - } - share(msk, id) { - callShare(capi._blsPublicKeyShare, this.a_, BLS_PUBLICKEY_SIZE, msk, id) - } - recover(secVec, idVec) { - callRecover(capi._blsPublicKeyRecover, this.a_, BLS_PUBLICKEY_SIZE, secVec, idVec) - } - verify(sig, m) { - let stack = mod.Runtime.stackSave() - let pubPos = mod.Runtime.stackAlloc(this.a_.length * 4) - let sigPos = mod.Runtime.stackAlloc(sig.a_.length * 4) - mod.HEAP32.set(this.a_, pubPos / 4) - mod.HEAP32.set(sig.a_, sigPos / 4) - let r = capi.blsVerify(sigPos, pubPos, m) - mod.Runtime.stackRestore(stack) - return r != 0 - } - } - self.getPublicKeyFromHexStr = function(s) { - r = new self.PublicKey() - r.fromHexStr(s) - return r - } + capi.sheInit = function(curveType = MCLBN_CURVE_FP254BNB) { + let r = capi._sheInit(curveType, MCLBN_FP_UNIT_SIZE) + console.log('sheInit ' + r) + if (r) throw('sheInit') + } + class Common { + constructor(size) { + this.a_ = new Uint32Array(size / 4) + } + fromHexStr(s) { + this.deserialize(exports.fromHexStr(s)) + } + toHexStr() { + return exports.toHexStr(this.serialize()) + } + dump(msg = '') { + console.log(msg + this.toHexStr()) + } + } - self.Signature = class extends Common { - constructor() { - super(BLS_SIGNATURE_SIZE) - } - deserialize(s) { - callSetter(capi.blsSignatureDeserialize, this.a_, s) - } - serialize() { - return callGetter(capi.blsSignatureSerialize, this.a_) - } - recover(secVec, idVec) { - callRecover(capi._blsSignatureRecover, this.a_, BLS_SIGNATURE_SIZE, secVec, idVec) - } - } - self.getSignatureFromHexStr = function(s) { - r = new self.Signature() - r.fromHexStr(s) - return r - } - } - self.init = function(curveType = MCLBN_CURVE_FP254BNB, callback = null) { - setupWasm('bls_c.wasm', null, function(_mod, ns) { - mod = _mod - fetch('exported-bls.json') - .then(response => response.json()) - .then(json => { - mod.json = json - json.forEach(func => { - capi[func.exportName] = mod.cwrap(func.name, func.returns, func.args) - }) - define_extra_functions(mod) - let r = capi.blsInit(curveType) - console.log('finished ' + r) - if (callback) callback() - }) - }) - } - return self + exports.Id = class extends Common { + constructor() { + super(BLS_ID_SIZE) + } + setInt(x) { + callSetter(capi.blsIdSetInt, this.a_, x) + } + setByCSPRNG() { + callSetter(capi.blsSecretKeySetByCSPRNG, this.a_) // same type of BlsSecretKey + } + setStr(s, base = 10) { + switch (base) { + case 10: + callSetter(capi.blsIdSetDecStr, this.a_, s) + return + case 16: + callSetter(capi.blsIdSetHexStr, this.a_, s) + return + default: + throw('BlsId.setStr:bad base:' + base) + } + } + deserialize(s) { + callSetter(capi.blsIdDeserialize, this.a_, s) + } + getStr(base = 10) { + switch (base) { + case 10: + return callGetter(capi.blsIdGetDecStr, this.a_) + case 16: + return callGetter(capi.blsIdGetHexStr, this.a_) + default: + throw('BlsId.getStr:bad base:' + base) + } + } + serialize() { + return callGetter(capi.blsIdSerialize, this.a_) + } + } + exports.getIdFromHexStr = function(s) { + r = new exports.Id() + r.fromHexStr(s) + return r + } + + exports.SecretKey = class extends Common { + constructor() { + super(BLS_SECRETKEY_SIZE) + } + setInt(x) { + callSetter(capi.blsIdSetInt, this.a_, x) // same as Id + } + deserialize(s) { + callSetter(capi.blsSecretKeyDeserialize, this.a_, s) + } + setLittleEndian(s) { + callSetter(capi.blsSecretKeySetLittleEndian, this.a_, s) + } + serialize() { + return callGetter(capi.blsSecretKeySerialize, this.a_) + } + share(msk, id) { + callShare(capi._blsSecretKeyShare, this.a_, BLS_SECRETKEY_SIZE, msk, id) + } + recover(secVec, idVec) { + callRecover(capi._blsSecretKeyRecover, this.a_, BLS_SECRETKEY_SIZE, secVec, idVec) + } + setHashOf(s) { + callSetter(capi.blsHashToSecretKey, this.a_, s) + } + setByCSPRNG() { + let a = new Uint8Array(BLS_SECRETKEY_SIZE) + crypto.getRandomValues(a) + this.setLittleEndian(a) + // callSetter(capi.blsSecretKeySetByCSPRNG, this.a_) + } + getPublicKey() { + let pub = new exports.PublicKey() + let stack = mod.Runtime.stackSave() + let secPos = mod.Runtime.stackAlloc(this.a_.length * 4) + let pubPos = mod.Runtime.stackAlloc(pub.a_.length * 4) + mod.HEAP32.set(this.a_, secPos / 4) + capi.blsGetPublicKey(pubPos, secPos) + copyToUint32Array(pub.a_, pubPos) + mod.Runtime.stackRestore(stack) + return pub + } + /* + input + m : message (string or Uint8Array) + return + BlsSignature + */ + sign(m) { + let sig = new exports.Signature() + let stack = mod.Runtime.stackSave() + let secPos = mod.Runtime.stackAlloc(this.a_.length * 4) + let sigPos = mod.Runtime.stackAlloc(sig.a_.length * 4) + mod.HEAP32.set(this.a_, secPos / 4) + capi.blsSign(sigPos, secPos, m) + copyToUint32Array(sig.a_, sigPos) + mod.Runtime.stackRestore(stack) + return sig + } + } + exports.getSecretKeyFromHexStr = function(s) { + r = new exports.SecretKey() + r.fromHexStr(s) + return r + } + + exports.PublicKey = class extends Common { + constructor() { + super(BLS_PUBLICKEY_SIZE) + } + deserialize(s) { + callSetter(capi.blsPublicKeyDeserialize, this.a_, s) + } + serialize() { + return callGetter(capi.blsPublicKeySerialize, this.a_) + } + share(msk, id) { + callShare(capi._blsPublicKeyShare, this.a_, BLS_PUBLICKEY_SIZE, msk, id) + } + recover(secVec, idVec) { + callRecover(capi._blsPublicKeyRecover, this.a_, BLS_PUBLICKEY_SIZE, secVec, idVec) + } + verify(sig, m) { + let stack = mod.Runtime.stackSave() + let pubPos = mod.Runtime.stackAlloc(this.a_.length * 4) + let sigPos = mod.Runtime.stackAlloc(sig.a_.length * 4) + mod.HEAP32.set(this.a_, pubPos / 4) + mod.HEAP32.set(sig.a_, sigPos / 4) + let r = capi.blsVerify(sigPos, pubPos, m) + mod.Runtime.stackRestore(stack) + return r != 0 + } + } + exports.getPublicKeyFromHexStr = function(s) { + r = new exports.PublicKey() + r.fromHexStr(s) + return r + } + + exports.Signature = class extends Common { + constructor() { + super(BLS_SIGNATURE_SIZE) + } + deserialize(s) { + callSetter(capi.blsSignatureDeserialize, this.a_, s) + } + serialize() { + return callGetter(capi.blsSignatureSerialize, this.a_) + } + recover(secVec, idVec) { + callRecover(capi._blsSignatureRecover, this.a_, BLS_SIGNATURE_SIZE, secVec, idVec) + } + } + exports.getSignatureFromHexStr = function(s) { + r = new exports.Signature() + r.fromHexStr(s) + return r + } + } + return exports }) |