1 | function 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"];
|
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 |
|
25 | var TIMELIMIT = 1000;
|
26 |
|
27 | function 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 |
|
61 | function 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 |
|
121 | var output;
|
122 | if (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 | }
|