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 emscripten-discuss+unsubscr...@googlegroups.com.
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}`)
}

Reply via email to