I was comparing standard JS implementation
(https://github.com/dchest/tweetnacl-js) and emscripten-built crypto
library.
I was surprised to find that the standard JS implementation was markedly
faster than asm.js-assisted implementation.
Can someone point to the root cause of this gap / am I missing something?
Results:
Chrome 52:
=> 108
=> 990
FF 48:
=> 472
=> 1939
--
You received this message because you are subscribed to the Google Groups
"emscripten-discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.
const tweetnacl = require('tweetnacl/tweetnacl-fast.js');
const libsodium = require('libsodium/libsodium.js');
function genCurve25519Secret() : Uint8Array {
let secret = new Uint8Array(32);
crypto.getRandomValues(secret);
secret[0] &= 0xF8;
secret[31] &= 0x7F;
secret[31] |= 0x40;
return secret;
}
function scalarMultBase(n: Uint8Array) : Uint8Array {
const nPtr = libsodium._malloc(32);
const qPtr = libsodium._malloc(32);
libsodium.HEAPU8.set(n, nPtr);
libsodium._crypto_scalarmult_base(qPtr, nPtr);
const output = new Uint8Array(libsodium.HEAPU8.subarray(qPtr, qPtr + 32));
libsodium._free(qPtr);
libsodium._free(nPtr);
return output;
}
function scalarMult(n: Uint8Array, p: Uint8Array) : Uint8Array {
const pPtr = libsodium._malloc(32);
const nPtr = libsodium._malloc(32);
const qPtr = libsodium._malloc(32);
libsodium.HEAPU8.set(n, nPtr);
libsodium.HEAPU8.set(p, pPtr);
libsodium._crypto_scalarmult(qPtr, nPtr, pPtr);
const output = new Uint8Array(libsodium.HEAPU8.subarray(qPtr, qPtr + 32));
libsodium._free(qPtr);
libsodium._free(nPtr);
libsodium._free(pPtr);
return output;
}
function profileCurve25519() {
let stopTime = Date.now() + 3000;
let count = 0;
const a = genCurve25519Secret();
const b = genCurve25519Secret();
const aPub = scalarMultBase(a);
while (Date.now() < stopTime) {
scalarMult(b, aPub);
++count;
}
console.log(`=> ${count}`)
stopTime = Date.now() + 3000;
count = 0;
while (Date.now() < stopTime) {
tweetnacl.scalarMult(b, aPub);
++count;
}
console.log(`=> ${count}`)
}