benchmark: add rsa/aes-gcm performance test
authorShigeki Ohtsu <ohtsu@iij.ad.jp>
Thu, 2 Apr 2015 04:30:35 +0000 (13:30 +0900)
committerShigeki Ohtsu <ohtsu@iij.ad.jp>
Sat, 4 Apr 2015 03:37:26 +0000 (12:37 +0900)
PR-URL: https://github.com/iojs/io.js/pull/1325
Reviewed-By: Fedor Indutny <fedor@indutny.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
benchmark/crypto/aes-gcm-throughput.js [new file with mode: 0644]
benchmark/crypto/rsa-encrypt-decrypt-throughput.js [new file with mode: 0644]
benchmark/crypto/rsa-sign-verify-throughput.js [new file with mode: 0644]
test/fixtures/keys/Makefile
test/fixtures/keys/rsa_private_1024.pem [new file with mode: 0644]
test/fixtures/keys/rsa_private_2048.pem [new file with mode: 0644]
test/fixtures/keys/rsa_private_4096.pem [new file with mode: 0644]
test/fixtures/keys/rsa_public_1024.pem [new file with mode: 0644]
test/fixtures/keys/rsa_public_2048.pem [new file with mode: 0644]
test/fixtures/keys/rsa_public_4096.pem [new file with mode: 0644]

diff --git a/benchmark/crypto/aes-gcm-throughput.js b/benchmark/crypto/aes-gcm-throughput.js
new file mode 100644 (file)
index 0000000..65e1713
--- /dev/null
@@ -0,0 +1,38 @@
+var common = require('../common.js');
+var crypto = require('crypto');
+var keylen = {'aes-128-gcm': 16, 'aes-192-gcm': 24, 'aes-256-gcm': 32};
+var bench = common.createBenchmark(main, {
+  n: [500],
+  cipher: ['aes-128-gcm', 'aes-192-gcm', 'aes-256-gcm'],
+  len: [1024, 4 * 1024, 16 * 1024, 64 * 1024, 256 * 1024, 1024 * 1024]
+});
+
+function main(conf) {
+  var message = (new Buffer(conf.len)).fill('b');
+  var key = crypto.randomBytes(keylen[conf.cipher]);
+  var iv = crypto.randomBytes(12);
+  var associate_data = (new Buffer(16)).fill('z');
+  bench.start();
+  AEAD_Bench(conf.cipher, message, associate_data, key, iv, conf.n, conf.len);
+}
+
+function AEAD_Bench(cipher, message, associate_data, key, iv, n, len) {
+  var written = n * len;
+  var bits = written * 8;
+  var mbits = bits / (1024 * 1024);
+
+  for (var i = 0; i < n; i++) {
+    var alice = crypto.createCipheriv(cipher, key, iv);
+    alice.setAAD(associate_data);
+    var enc = alice.update(message);
+    alice.final();
+    var tag = alice.getAuthTag();
+    var bob = crypto.createDecipheriv(cipher, key, iv);
+    bob.setAuthTag(tag);
+    bob.setAAD(associate_data);
+    var clear = bob.update(enc);
+    bob.final();
+  }
+
+  bench.end(mbits);
+}
diff --git a/benchmark/crypto/rsa-encrypt-decrypt-throughput.js b/benchmark/crypto/rsa-encrypt-decrypt-throughput.js
new file mode 100644 (file)
index 0000000..1cd7a5e
--- /dev/null
@@ -0,0 +1,45 @@
+// throughput benchmark in signing and verifying
+var common = require('../common.js');
+var crypto = require('crypto');
+var fs = require('fs');
+var path = require('path');
+var fixtures_keydir = path.resolve(__dirname, '../../test/fixtures/keys/');
+var keylen_list = ['1024', '2048', '4096'];
+var RSA_PublicPem = {};
+var RSA_PrivatePem = {};
+
+keylen_list.forEach(function(key) {
+  RSA_PublicPem[key] = fs.readFileSync(fixtures_keydir +
+                                       '/rsa_public_' + key + '.pem');
+  RSA_PrivatePem[key] = fs.readFileSync(fixtures_keydir +
+                                        '/rsa_private_' + key + '.pem');
+});
+
+var bench = common.createBenchmark(main, {
+  n: [500],
+  keylen: keylen_list,
+  len: [16, 32, 64]
+});
+
+function main(conf) {
+  var crypto = require('crypto');
+  var message = (new Buffer(conf.len)).fill('b');
+
+  bench.start();
+  StreamWrite(conf.algo, conf.keylen, message, conf.n, conf.len);
+}
+
+function StreamWrite(algo, keylen, message, n, len) {
+  var written = n * len;
+  var bits = written * 8;
+  var kbits = bits / (1024);
+
+  var privateKey = RSA_PrivatePem[keylen];
+  var publicKey = RSA_PublicPem[keylen];
+  for (var i = 0; i < n; i++) {
+    var enc = crypto.privateEncrypt(privateKey, message);
+    var clear = crypto.publicDecrypt(publicKey, enc);
+  }
+
+  bench.end(kbits);
+}
diff --git a/benchmark/crypto/rsa-sign-verify-throughput.js b/benchmark/crypto/rsa-sign-verify-throughput.js
new file mode 100644 (file)
index 0000000..fd42604
--- /dev/null
@@ -0,0 +1,53 @@
+// throughput benchmark in signing and verifying
+var common = require('../common.js');
+var crypto = require('crypto');
+var fs = require('fs');
+var path = require('path');
+var fixtures_keydir = path.resolve(__dirname, '../../test/fixtures/keys/');
+var keylen_list = ['1024', '2048'];
+var RSA_PublicPem = {};
+var RSA_PrivatePem = {};
+
+keylen_list.forEach(function(key) {
+  RSA_PublicPem[key] = fs.readFileSync(fixtures_keydir +
+                                       '/rsa_public_' + key + '.pem');
+  RSA_PrivatePem[key] = fs.readFileSync(fixtures_keydir +
+                                        '/rsa_private_' + key + '.pem');
+});
+
+var bench = common.createBenchmark(main, {
+  writes: [500],
+  algo: ['RSA-SHA1', 'RSA-SHA224', 'RSA-SHA256', 'RSA-SHA384', 'RSA-SHA512'],
+  keylen: keylen_list,
+  len: [1024, 102400, 2 * 102400, 3 * 102400, 1024 * 1024]
+});
+
+function main(conf) {
+  var crypto = require('crypto');
+  var message = (new Buffer(conf.len)).fill('b');
+
+  bench.start();
+  StreamWrite(conf.algo, conf.keylen, message, conf.writes, conf.len);
+}
+
+function StreamWrite(algo, keylen, message, writes, len) {
+  var written = writes * len;
+  var bits = written * 8;
+  var kbits = bits / (1024);
+
+  var privateKey = RSA_PrivatePem[keylen];
+  var publicKey = RSA_PublicPem[keylen];
+  var s = crypto.createSign(algo);
+  var v = crypto.createVerify(algo);
+
+  while (writes-- > 0) {
+    s.update(message);
+    v.update(message);
+  }
+
+  var sign = s.sign(privateKey, 'binary');
+  s.end();
+  v.end();
+
+  bench.end(kbits);
+}
index ee667c6..a096431 100644 (file)
@@ -1,4 +1,4 @@
-all: agent1-cert.pem agent2-cert.pem agent3-cert.pem agent4-cert.pem agent5-cert.pem ca2-crl.pem ec-cert.pem dh512.pem dh1024.pem dh2048.pem
+all: agent1-cert.pem agent2-cert.pem agent3-cert.pem agent4-cert.pem agent5-cert.pem ca2-crl.pem ec-cert.pem dh512.pem dh1024.pem dh2048.pem rsa_private_1024.pem rsa_private_2048.pem rsa_private_4096.pem rsa_public_1024.pem rsa_public_2048.pem rsa_public_4096.pem
 
 
 #
@@ -179,6 +179,24 @@ dh1024.pem:
 dh2048.pem:
        openssl dhparam -out dh2048.pem 2048
 
+rsa_private_1024.pem:
+       openssl genrsa -out rsa_private_1024.pem 1024
+
+rsa_private_2048.pem:
+       openssl genrsa -out rsa_private_2048.pem 2048
+
+rsa_private_4096.pem:
+       openssl genrsa -out rsa_private_4096.pem 4096
+
+rsa_public_1024.pem: rsa_private_1024.pem
+       openssl rsa -in rsa_private_1024.pem -out rsa_public_1024.pem
+
+rsa_public_2048.pem: rsa_private_2048.pem
+       openssl rsa -in rsa_private_2048.pem -out rsa_public_2048.pem
+
+rsa_public_4096.pem: rsa_private_4096.pem
+       openssl rsa -in rsa_private_4096.pem -out rsa_public_4096.pem
+
 clean:
        rm -f *.pem *.srl ca2-database.txt ca2-serial
 
diff --git a/test/fixtures/keys/rsa_private_1024.pem b/test/fixtures/keys/rsa_private_1024.pem
new file mode 100644 (file)
index 0000000..1ef8d3a
--- /dev/null
@@ -0,0 +1,15 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIICXQIBAAKBgQDOF+YjZgVg8yGFS+++0WVcTKms1Wl2Lbnzj7jWOPyZnXxww7cE
+afiL3QI2RZCiVwBcueUejCbzT5iLrsWceryOCHZE4nQ5IOEYCpPzWw6oTfSM7HV0
+axQEpSzJFp20NJV9pVvBmSrrrdlGaDwHY1nlGVB3s2CKTAVxcKWoD6FhVQIDAQAB
+AoGBAIoz5JRgWcMFx7jHj2H6sWoPzsij5DDnwQbfniep11p8DXLhC93d4lqIPm9+
+ftseVJPZ5RdzDLuk6Lri3IlulPnEeJZrfYQVlfge6N9swQ54j3wRGEBjcP+7pu7Q
+nQ5FpOyJqQWWMUinf+o1bEkClIBPTY4x8pIoCM09wSvD9weRAkEA/hWym3rDwrcu
+pKvb1VgWZtrrCv5m+2Dk5V7qA+9sUyI9Lq9dlklNMcbuJXCy8Evd2Q3EMySYQGVc
+cXEKkeKefwJBAM+ll95tMX/YDEYAtOf3stz59rC4EyuD2kOZJt0dPj3vApYYq9+0
+Wnd0c8VOzJGjpVI21SY+fA+doMiZVVjSPisCQCD0R3oK7iDvCUmqUJTXG/CzLBD8
+9fZcltN4//kKsI4Hvs+zRvwa/bwbBQAuIccwz9E7C9tmP6j6fIbqFmjdb5kCQCJI
+MJ6kYHu+66fTDgsONhWNn1Dl0yRoDG0EqAnxfgkzoLWvNREl8ZmvPD3jGJsi7XR5
+YQ+DWXAqkhUMW67iZykCQQCgZdOUkAWu7NsCfGSTTvrMapa5PAt/GPDzzY9JGGif
+p+09SVdrnphr+MX6MCnOsixPXrMtg/LLhpQkwjVetm15
+-----END RSA PRIVATE KEY-----
diff --git a/test/fixtures/keys/rsa_private_2048.pem b/test/fixtures/keys/rsa_private_2048.pem
new file mode 100644 (file)
index 0000000..7ff76a4
--- /dev/null
@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEowIBAAKCAQEA20oG4U+MsV45A4zG0ySoavFmWmdkVtmKh1Tk9sC3V6Fu5w1v
+44lZDa57n+ghEA9Y4txUVQzm3TppwBFqUB2bBZrAhAjmjiPxjECGTV7ABaAQyihJ
+R0F2LL1KmdlduFXACvNCfIseBoOY6K49vrW3/rVC1gBQ6/S3K6jECjGAvOyUcIAv
+ch0YpW68v12AOUMI+CpzRQdMv6akbOVt5Qtg1vIvv0lIuirYcq9MWS++oFvHrxzX
+qAiAfgc0truwbW5Lz2w7Wcy0pBYeVW6HvBFPwUEV/2rn+RHrbgE9yQ+p4gDkdfHV
+yuMx21Mf449UwQUuI3HZ4BPqmyWkwSEYsfVYMQIDAQABAoIBAA9GT8Zf+SfdrVD+
+/FZ2xjh0yjFf5FBcZNbaZfx+Hgc/mm8Ds5iA17ApSDkyPSNWPlXHDSTDek1MpVMY
+o3QjK8ovJlvMFustu8SONgyrneqGZMUAG2KYP7gME2c2Cd4uMutQWIA+XIANqJgE
+kw52r/NRAu/PI9PbvuqOneEr45DFNNfu7RUsyewfrd07+xeDzqyMZFizjgZS8pyF
+eu9jVo/4T64tT24+oTVn1O3sSn4DL0oh3IvTyv7jVDHP5QqjvY7scSSva5VPqXQI
+9kkdzm0ECUqEAxwwn8EmyogrMJJYIKBmuFYxl3rYAY19hNVsMafmnlHxjSgv3n8h
+LjnnPLECgYEA/bZy7NtfPrHWBQvSpUPyge7ykfOwOoNYHY0OJcw/MGjNbk6d6ZOv
+3/gpGNO90iJkBI5cMXOgtOe0Nj1dkkSy9C81jd3JzR9mrK9Id8sJcUw2XpN1IKcE
+w89tcf1tmvP/st6dY3RDHARIPjNvQfcWkzT0uDJmf8cihS3MeWcPi2UCgYEA3UQh
+gPFfTAVW/mvwOkO37SK6/5hXbE4V1bHoP3fWAXmXO3C53K4FAuhErq8nw6ZOf9DG
+jjhskmeXoUNb06gLBO2okfFL9ccDS4hKm5LQJvolrFfd6PTc/HOIxCvEj7aA4w0T
+d0c1KUZjS7SNL0e3I4jNbJF6GXjwTHBMo5se2t0CgYEA2F7Hpi30DVC2l/kcPOs0
+nxD79/LeIRiwhgssvJlybkOCpwcO7wuPmy9VRSIXKWVA7Q3HnDjjHkTYUMWGzl4e
+S9cTEhjKqE+WTcDyyY7zT5dSatfQtPcbPi7hRKx/0/0w3QezLAUT0onoXnuY76Xc
+r9AiwA/jkCdwzilfz01QWW0CgYAUHmjJd6kJmYaydZAPTC8CIeFM8kYos+TqXFXY
+x4Wu9qZYokRUG4KbJBFyrLx53rpOhuY28kx093RjFmPYF/SAizeDpaQZgfH7wTW/
+dZb1pFMem5Ky5ujdD4hFBhHGW3rWqk61zsS3rw3CSXV48hVl5r9++q9Wd5ep66Ac
+VDN3BQKBgGMkPiQ5YuhVG3zEYM/4zgW7zCEuDyocqXkv5nJGW3JxPDBuJhLbwQ8F
+RqawaRhuIQZtKnbN7JIGLFYYx+LkUlj7bbkzz6iaHHBtiDqz4/bHEL3q02DpAyJR
+koWbtKIbZfS0Zno3OoGdYyvwXYaaE3Q3DJOc+NUmMKhlAhcAkjQv
+-----END RSA PRIVATE KEY-----
diff --git a/test/fixtures/keys/rsa_private_4096.pem b/test/fixtures/keys/rsa_private_4096.pem
new file mode 100644 (file)
index 0000000..30ca580
--- /dev/null
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----
diff --git a/test/fixtures/keys/rsa_public_1024.pem b/test/fixtures/keys/rsa_public_1024.pem
new file mode 100644 (file)
index 0000000..0ec72a9
--- /dev/null
@@ -0,0 +1,6 @@
+-----BEGIN PUBLIC KEY-----
+MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOF+YjZgVg8yGFS+++0WVcTKms
+1Wl2Lbnzj7jWOPyZnXxww7cEafiL3QI2RZCiVwBcueUejCbzT5iLrsWceryOCHZE
+4nQ5IOEYCpPzWw6oTfSM7HV0axQEpSzJFp20NJV9pVvBmSrrrdlGaDwHY1nlGVB3
+s2CKTAVxcKWoD6FhVQIDAQAB
+-----END PUBLIC KEY-----
diff --git a/test/fixtures/keys/rsa_public_2048.pem b/test/fixtures/keys/rsa_public_2048.pem
new file mode 100644 (file)
index 0000000..e43ef4c
--- /dev/null
@@ -0,0 +1,9 @@
+-----BEGIN PUBLIC KEY-----
+MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA20oG4U+MsV45A4zG0ySo
+avFmWmdkVtmKh1Tk9sC3V6Fu5w1v44lZDa57n+ghEA9Y4txUVQzm3TppwBFqUB2b
+BZrAhAjmjiPxjECGTV7ABaAQyihJR0F2LL1KmdlduFXACvNCfIseBoOY6K49vrW3
+/rVC1gBQ6/S3K6jECjGAvOyUcIAvch0YpW68v12AOUMI+CpzRQdMv6akbOVt5Qtg
+1vIvv0lIuirYcq9MWS++oFvHrxzXqAiAfgc0truwbW5Lz2w7Wcy0pBYeVW6HvBFP
+wUEV/2rn+RHrbgE9yQ+p4gDkdfHVyuMx21Mf449UwQUuI3HZ4BPqmyWkwSEYsfVY
+MQIDAQAB
+-----END PUBLIC KEY-----
diff --git a/test/fixtures/keys/rsa_public_4096.pem b/test/fixtures/keys/rsa_public_4096.pem
new file mode 100644 (file)
index 0000000..30ca580
--- /dev/null
@@ -0,0 +1,51 @@
+-----BEGIN RSA PRIVATE KEY-----
+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
+-----END RSA PRIVATE KEY-----