UNPKG

3.89 kBJavaScriptView Raw
1function main () {
2 if (typeof window !== 'undefined') {
3 var browser =
4 navigator.userAgent.match(/Firefox\/[^ ]+/) ||
5 navigator.userAgent.match(/Chrome\/[^ ]+/) ||
6 navigator.userAgent.match(/Safari\/[^ ]+/) ||
7 ["unknown/0.0"]; // perhaps it's IE. meh
8 output(browser[0]);
9 } else {
10 output("node/" + process.version);
11 }
12
13 output("Test,Iterations per second,Seconds per iteration");
14
15 try {
16 nacl_factory.instantiate(do_tests, {
17 memoryInitializerPrefixURL: 'lib/'
18 });
19 } catch (e) {
20 console.error(e);
21 output('EXCEPTION: ' + e.message);
22 }
23}
24
25var TIMELIMIT = 1000;
26
27function measure(desc, f) {
28 try {
29 var iterations;
30 var iter_per_sec;
31 var best_iter_per_sec = 0;
32 var startTime;
33 var stopTime;
34 var delta;
35 var i;
36 var result;
37
38 for (iterations = 0; iterations < 3; iterations++) {
39 startTime = new Date().getTime();
40 i = 0;
41 while (1) {
42 result = f();
43 i++;
44 stopTime = new Date().getTime();
45 delta = stopTime - startTime;
46 if (delta > TIMELIMIT) break;
47 }
48 iter_per_sec = i / (delta / 1000);
49 if (iter_per_sec > best_iter_per_sec) best_iter_per_sec = iter_per_sec;
50 }
51
52 var sec_per_iter = 1.0 / best_iter_per_sec;
53 output([JSON.stringify(desc), best_iter_per_sec, sec_per_iter].join(','));
54 } catch (e) {
55 result = null;
56 output([JSON.stringify(desc), "FAILED", "FAILED", JSON.stringify(e)].join(','));
57 }
58 return result;
59}
60
61function do_tests(nacl) {
62 var hello = nacl.encode_utf8("hello");
63 var kp = nacl.crypto_box_keypair_from_seed(hello);
64 var skp = nacl.crypto_sign_keypair_from_seed(nacl.crypto_hash_string("This is my passphrase").subarray(0, 32));
65 var selfShared = nacl.crypto_box_precompute(kp.boxPk, kp.boxSk);
66 var n = nacl.crypto_box_random_nonce();
67 var c = nacl.crypto_box_precomputed(hello, n, selfShared);
68 var m = nacl.crypto_box_open_precomputed(c, n, selfShared);
69
70 var c2 = nacl.crypto_box(hello, n, kp.boxPk, kp.boxSk);
71 var m2 = nacl.crypto_box_open(c2, n, kp.boxPk, kp.boxSk);
72
73 var signed = nacl.crypto_sign(m, skp.signSk);
74
75 var tests = [
76 ['nacl.crypto_hash_string("hello")',
77 function () { return nacl.crypto_hash_string("hello") }],
78
79 ['nacl.crypto_hash(hello)',
80 function () { return nacl.crypto_hash(hello) }],
81
82 ['nacl.crypto_box_keypair_from_seed(hello)',
83 function () { return nacl.crypto_box_keypair_from_seed(hello) }],
84
85 ['nacl.crypto_box_precompute(kp.boxPk, kp.boxSk)',
86 function () { return nacl.crypto_box_precompute(kp.boxPk, kp.boxSk) }],
87
88 ['nacl.crypto_box_random_nonce()',
89 function () { return nacl.crypto_box_random_nonce() }],
90
91 ['nacl.crypto_box_precomputed(hello, n, selfShared)',
92 function () { return nacl.crypto_box_precomputed(hello, n, selfShared) }],
93
94 ['nacl.crypto_box_open_precomputed(c, n, selfShared)',
95 function () { return nacl.crypto_box_open_precomputed(c, n, selfShared) }],
96
97 ['nacl.crypto_box(hello, n, kp.boxPk, kp.boxSk)',
98 function () { return nacl.crypto_box(hello, n, kp.boxPk, kp.boxSk) }],
99
100 ['nacl.crypto_box_open(c2, n, kp.boxPk, kp.boxSk)',
101 function () { return nacl.crypto_box_open(c2, n, kp.boxPk, kp.boxSk) }],
102
103 ['nacl.crypto_sign(m, skp.signSk)',
104 function () { return nacl.crypto_sign(m, skp.signSk) }],
105
106 ['nacl.crypto_sign_open(signed, skp.signPk)',
107 function () { return nacl.crypto_sign_open(signed, skp.signPk) }]
108 ];
109
110 var testNum = 0;
111 function runNextTest() {
112 if (testNum < tests.length) {
113 measure(tests[testNum][0], tests[testNum][1]);
114 testNum++;
115 setTimeout(runNextTest, 0);
116 }
117 }
118 runNextTest();
119}
120
121var output;
122if (typeof window !== 'undefined') {
123 output = function (x) {
124 document.getElementById("output").innerHTML += x + "\n";
125 };
126 window.onload = main;
127} else {
128 nacl_factory = require("./lib/nacl_factory.js");
129 output = function (x) {
130 console.log(x);
131 };
132 main();
133}