nacl vs sjcl sha256 hash vs curve25519 (v3)

Revision 3 of this benchmark created on


Preparation HTML

<script src="//www.flownet.com/ron/code/curve25519.js"></script>
<script src="//rawgithub.com/tonyg/js-nacl/master/lib/nacl.js"></script>
<script src="//crypto.stanford.edu/sjcl/sjcl.js"></script>
<script src="//crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha256.js"></script>

Setup

var data = 'XXcpLdZSshmKlTBGdNDsHSRXUhOrMvOHPVscATocLtpqPmbeROOLFPSywaeASQFAWexMKdkGRmEvoSeYsNtyCPpQfWioYEZMGcefXDrxKTGdtCGJFaetDQvudVdkmJMlUoDNjNaBKRanDOrwbBBZxnzeqtPljtFgsQJWRiwprwemQaTZrhLLwycyuRFoLzPqvgWTnHdKszsiyQEvulfevLDddCKMDevgXpEkQpvkZxiOXertwrAPplqPqGBGJianONMvtBjCvEnCQaMuImqfUDPPAmLxPbVOgNvMlfKIZOjVurTRRFLFvvokVxhEICLfFHtmLkkhnCmdxTJrzrhGonCdAfreEDsqkPkokMbCBhjFyDeesKofowXutFDtrGHWtAyafssxtNRaniORXAUdKvUEHjmNFDyskzMzticEuIKoWqQkMAoshtDBXEZpjnjiucIQUDhnEszAnZlYaunwFXgwRXAdDzwkWjkRsioIkywffJpbKsiuMayckobjSgqfSOAfFiCooSMdDvghRXvbnumesqStVuntcpowaokhMvSGRGWIsihZllpaGBUqpNF';
    
    var keccakCC = function() {
      var d, h, e, l, k, m, n, p;
      e = function(a, b) {
        this.b = a ? a : 0;
        this.a = b ? b : 0
      };
      e.e = function(a) {
        return new e(a.b, a.a)
      };
      e.prototype = {
        d: function(a) {
          this.b ^= a.b;
          this.a ^= a.a;
          return this
        },
        h: function() {
          return new e(~this.b, ~this.a)
        },
        g: function(a) {
          this.b &= a.b;
          this.a &= a.a;
          return this
        },
        f: function(a) {
          var b, c;
          32 <= a && (b = this.b, this.b = this.a, this.a = b, a -= 32);
          if (0 === a) return this;
          c = 32 - a;
          b = (this.a << a) + (this.b >>> c);
          this.b = (this.b << a) + (this.a >>> c);
          this.a = b;
          return this
        },
        toString: function() {
          var a, b;
          a = function(a) {
            return ("00" +
              a.toString(16)).slice(-2)
          };
          b = function(b) {
            return a(b & 255) + a(b >>> 8) + a(b >>> 16) + a(b >>> 24)
          };
          return function() {
            return b(this.b) + b(this.a)
          }
        }()
      };
      k = function(a) {
        var b, c = [];
        for (b = 0; b < a; b += 1) c[b] = new e(0, 0);
        return c
      };
      h = function(a) {
        function b(a, d) {
          return b.c[a % 5 + 5 * (d % 5)]
        }
        b.c = a;
        b.e = function() {
          return new h(b.c.map(e.e))
        };
        return b
      };
      l = [0, 10, 20, 5, 15, 16, 1, 11, 21, 6, 7, 17, 2, 12, 22, 23, 8, 18, 3, 13, 14, 24, 9, 19, 4];
      m = [{
        b: 1,
        a: 0
      }, {
        b: 32898,
        a: 0
      }, {
        b: 32906,
        a: 2147483648
      }, {
        b: 2147516416,
        a: 2147483648
      }, {
        b: 32907,
        a: 0
      }, {
        b: 2147483649,
        a: 0
      }, {
        b: 2147516545,
        a: 2147483648
      }, {
        b: 32777,
        a: 2147483648
      }, {
        b: 138,
        a: 0
      }, {
        b: 136,
        a: 0
      }, {
        b: 2147516425,
        a: 0
      }, {
        b: 2147483658,
        a: 0
      }, {
        b: 2147516555,
        a: 0
      }, {
        b: 139,
        a: 2147483648
      }, {
        b: 32905,
        a: 2147483648
      }, {
        b: 32771,
        a: 2147483648
      }, {
        b: 32770,
        a: 2147483648
      }, {
        b: 128,
        a: 2147483648
      }, {
        b: 32778,
        a: 0
      }, {
        b: 2147483658,
        a: 2147483648
      }, {
        b: 2147516545,
        a: 2147483648
      }, {
        b: 32896,
        a: 2147483648
      }, {
        b: 2147483649,
        a: 0
      }, {
        b: 2147516424,
        a: 2147483648
      }];
      n = [0, 1, 62, 28, 27, 36, 44, 6, 55, 20, 3, 10, 43, 25, 39, 41, 45, 15, 21, 8, 18, 2, 61, 56, 14];
      p = function() {
        var a, b, c, f, g;
        for (g = 0; 24 > g; g += 1) {
          c = k(5);
          for (a =
            0; 5 > a; a += 1)
            for (b = 0; 5 > b; b += 1) c[a].d(d(a, b));
          f = c.map(e.e);
          f = f.concat(f.splice(0, 1));
          for (a = 0; 5 > a; a += 1) f[a].f(1).d(c[(a + 4) % 5]);
          for (a = 0; 5 > a; a += 1)
            for (b = 0; 5 > b; b += 1) d(a, b).d(f[a]);
          for (a = 0; 5 > a; a += 1)
            for (b = 0; 5 > b; b += 1) d(a, b).f(n[5 * b + a]);
          b = d.c.slice(0);
          for (a = 0; 25 > a; a += 1) d.c[l[a]] = b[a];
          c = d.e();
          for (a = 0; 5 > a; a += 1)
            for (b = 0; 5 > b; b += 1) d(a, b).d(c(a + 1, b).h().g(c(a + 2, b)));
          d(0, 0).d(m[g])
        }
      };
      return function(a) {
        d = new h(k(25));
        for (a += "\u2001\u0188"; 0 !== a.length % 68;) a += "\x00";
        var b, c;
        for (b = 0; b < a.length; b += 68) {
          for (c = 0; 68 > c; c += 4) d.c[c /
            4].d(new e(a.charCodeAt(b + c) + 65536 * a.charCodeAt(b + c + 1), a.charCodeAt(b + c + 2) + 65536 * a.charCodeAt(b + c + 3)));
          p()
        }
        return d.c.slice(0, 4).join("")
      }
    }();

Test runner

Ready to run.

Testing in
TestOps/sec
nacl
nacl.crypto_hash_string(data);
ready
sjcl
sjcl.hash.sha256.hash(data);
ready
curve25519
curve25519hex(data)
ready
CryptoJS
CryptoJS.SHA256(data)
ready
KeccakCC
keccakCC(data)
ready

Revisions

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