Skip to content

Commit 09b21d4

Browse files
committed
Switch from Float64Array to Array
This makes signing/verifying ~3 times faster. On 2.6 GHz Intel Core i5 (MBPr Mid 2014), Node.js v8.8.1: Before: sign 92 ops 5.46 ms/op 183.17 ops/sec sign.open 48 ops 10.50 ms/op 95.26 ops/sec After: sign 269 ops 1.86 ms/op 536.52 ops/sec sign.open 136 ops 3.70 ms/op 270.55 ops/sec
1 parent 83f6e24 commit 09b21d4

File tree

2 files changed

+33
-23
lines changed

2 files changed

+33
-23
lines changed

nacl-fast.js

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,16 @@
77
// Implementation derived from TweetNaCl version 20140427.
88
// See for details: http://tweetnacl.cr.yp.to/
99

10-
var gf = function(init) {
11-
var i, r = new Float64Array(16);
12-
if (init) for (i = 0; i < init.length; i++) r[i] = init[i];
10+
function gf() {
11+
return [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
12+
}
13+
14+
function gfi(init) {
15+
var r = [], i = 0;
16+
for ( ; i < init.length; i++) r[i] = init[i];
17+
for ( ; i < 16; i++) r[i] = 0;
1318
return r;
14-
};
19+
}
1520

1621
// Pluggable, initialized in high-level API below.
1722
var randombytes = function(/* x, n */) { throw new Error('no PRNG'); };
@@ -20,13 +25,13 @@ var _0 = new Uint8Array(16);
2025
var _9 = new Uint8Array(32); _9[0] = 9;
2126

2227
var gf0 = gf(),
23-
gf1 = gf([1]),
24-
_121665 = gf([0xdb41, 1]),
25-
D = gf([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),
26-
D2 = gf([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),
27-
X = gf([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),
28-
Y = gf([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),
29-
I = gf([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);
28+
gf1 = gfi([1]),
29+
_121665 = gfi([0xdb41, 1]),
30+
D = gfi([0x78a3, 0x1359, 0x4dca, 0x75eb, 0xd8ab, 0x4141, 0x0a4d, 0x0070, 0xe898, 0x7779, 0x4079, 0x8cc7, 0xfe73, 0x2b6f, 0x6cee, 0x5203]),
31+
D2 = gfi([0xf159, 0x26b2, 0x9b94, 0xebd6, 0xb156, 0x8283, 0x149a, 0x00e0, 0xd130, 0xeef3, 0x80f2, 0x198e, 0xfce7, 0x56df, 0xd9dc, 0x2406]),
32+
X = gfi([0xd51a, 0x8f25, 0x2d60, 0xc956, 0xa7b2, 0x9525, 0xc760, 0x692c, 0xdc5c, 0xfdd6, 0xe231, 0xc0a4, 0x53fe, 0xcd6e, 0x36d3, 0x2169]),
33+
Y = gfi([0x6658, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666, 0x6666]),
34+
I = gfi([0xa0b0, 0x4a0e, 0x1b27, 0xc4ee, 0xe478, 0xad2f, 0x1806, 0x2f43, 0xd7a7, 0x3dfb, 0x0099, 0x2b4d, 0xdf0b, 0x4fc1, 0x2480, 0x2b83]);
3035

3136
function ts64(x, i, h, l) {
3237
x[i] = (h >> 24) & 0xff;
@@ -1323,7 +1328,7 @@ function pow2523(o, i) {
13231328

13241329
function crypto_scalarmult(q, n, p) {
13251330
var z = new Uint8Array(32);
1326-
var x = new Float64Array(80), r, i;
1331+
var x = [] /* 80 */, r, i;
13271332
var a = gf(), b = gf(), c = gf(),
13281333
d = gf(), e = gf(), f = gf();
13291334
for (i = 0; i < 31; i++) z[i] = n[i];
@@ -1360,14 +1365,19 @@ function crypto_scalarmult(q, n, p) {
13601365
sel25519(a,b,r);
13611366
sel25519(c,d,r);
13621367
}
1368+
var x32 = []; /* 48 */
1369+
for (i = 0; i < 16; i++) {
1370+
x32[i] = c[i];
1371+
x32[i+16] = b[i];
1372+
x32[i+32] = d[i];
1373+
}
1374+
var x16 = []; /* 64 */
13631375
for (i = 0; i < 16; i++) {
1364-
x[i+16]=a[i];
1365-
x[i+32]=c[i];
1366-
x[i+48]=b[i];
1367-
x[i+64]=d[i];
1376+
x16[i] = a[i];
1377+
x16[i+16] = c[i];
1378+
x16[i+32] = b[i];
1379+
x16[i+48] = d[i];
13681380
}
1369-
var x32 = x.subarray(32);
1370-
var x16 = x.subarray(16);
13711381
inv25519(x32,x32);
13721382
M(x16,x16,x32);
13731383
pack25519(q,x16);
@@ -1932,7 +1942,7 @@ function crypto_sign_keypair(pk, sk, seeded) {
19321942
return 0;
19331943
}
19341944

1935-
var L = new Float64Array([0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10]);
1945+
var L = [0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58, 0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x10];
19361946

19371947
function modL(r, x) {
19381948
var carry, i, j, k;
@@ -1960,7 +1970,7 @@ function modL(r, x) {
19601970
}
19611971

19621972
function reduce(r) {
1963-
var x = new Float64Array(64), i;
1973+
var x = [] /* 64 */, i;
19641974
for (i = 0; i < 64; i++) x[i] = r[i];
19651975
for (i = 0; i < 64; i++) r[i] = 0;
19661976
modL(r, x);
@@ -1969,7 +1979,7 @@ function reduce(r) {
19691979
// Note: difference from C - smlen returned, not passed as argument.
19701980
function crypto_sign(sm, m, n, sk) {
19711981
var d = new Uint8Array(64), h = new Uint8Array(64), r = new Uint8Array(64);
1972-
var i, j, x = new Float64Array(64);
1982+
var i, j, x = [] /* 64 */;
19731983
var p = [gf(), gf(), gf(), gf()];
19741984

19751985
crypto_hash(d, sk, 32);

0 commit comments

Comments
 (0)