JSBN vs SJCL ECC

Benchmark created by justmoon on


Description

Comparison of ECC performance between JSBN and SJCL

Preparation HTML

<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/prng4.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/rng.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/ec.js"></script>
<script src="http://www-cs-students.stanford.edu/~tjw/jsbn/sec.js"></script>
<script src="https://raw.github.com/gist/3395439/ced1f096c350ae70171023d5c43a23b0d6d88bcc/gistfile1.txt"></script>

Setup

function secp256k1() {
        // p = 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
        var p = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");
        var a = BigInteger.ZERO;
        var b = fromHex("7");
        //byte[] S = null;
        var n = fromHex("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141");
        var h = BigInteger.ONE;
        var curve = new ECCurveFp(p, a, b);
        var G = curve.decodePointHex("04"
                    + "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798"
                    + "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8");
        return new X9ECParameters(curve, G, n, h);
    }
    
    var ecparams = secp256k1()
    var rng = new SecureRandom();
    var n = ecparams.getN();
    var n1 = n.subtract(BigInteger.ONE);
    var G = ecparams.getG();
    
    // Overwrite NIST-P256 with secp256k1 so we're on even footing
    sjcl.ecc.curves.c256 = new sjcl.ecc.curve(
        sjcl.bn.pseudoMersennePrime(256, [[0,-1],[4,-1],[6,-1],[7,-1],[8,-1],[9,-1],[32,-1]]),
        "0x14551231950b75fc4402da1722fc9baee",
        0,
        7,
        "0x79be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798",
        "0x483ada7726a3c4655da4fbfc0e1108a8fd17b448a68554199c47d08ffb10d4b8"
    );

Test runner

Ready to run.

Testing in
TestOps/sec
JSBN
var r = new BigInteger(n.bitLength(), rng);

var privateKey = r.mod(n1).add(BigInteger.ONE);

// Generate public key
var publicPoint = G.multiply(privateKey);
ready
SJCL
var keys = sjcl.ecc.ecdsa.generateKeys(256,0),
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.