diff options
author | Jakob Unterwurzacher | 2015-09-05 23:19:38 +0200 |
---|---|---|
committer | Jakob Unterwurzacher | 2015-09-05 23:19:38 +0200 |
commit | baa837b7881a87f342c67096013bdf078d11af99 (patch) | |
tree | 465c99d8df8f8dac19187a004e801a2989897988 | |
parent | d0524ded993f870c2dd8a559efed0d612e85d588 (diff) |
Add openssl benchmark
Results:
BenchmarkAESGCMSeal4K 20000 98638 ns/op 41.53 MB/s
BenchmarkAESGCMOpen4K 20000 98781 ns/op 41.47 MB/s
BenchmarkOpensslGCMenc4K 50000 27563 ns/op 148.60 MB/s
BenchmarkOpensslGCMdec4K 50000 27563 ns/op 148.60 MB/s
openssl is 3x faster.
-rw-r--r-- | benchmark/openssl_test.go | 140 |
1 files changed, 140 insertions, 0 deletions
diff --git a/benchmark/openssl_test.go b/benchmark/openssl_test.go new file mode 100644 index 0000000..f0b7bc5 --- /dev/null +++ b/benchmark/openssl_test.go @@ -0,0 +1,140 @@ +package benchmark + +// Benchmark go built-int GCM against spacemonkey openssl bindings +// +// Run benchmark: +// go test -bench=. + +import ( + "bytes" + "testing" + "github.com/spacemonkeygo/openssl" + "crypto/aes" + "crypto/cipher" +) + +func BenchmarkAESGCMSeal4K(b *testing.B) { + buf := make([]byte, 1024*4) + b.SetBytes(int64(len(buf))) + + var key [16]byte + var nonce [12]byte + aes, _ := aes.NewCipher(key[:]) + aesgcm, _ := cipher.NewGCM(aes) + var out []byte + + b.ResetTimer() + for i := 0; i < b.N; i++ { + out = aesgcm.Seal(out[:0], nonce[:], buf, nil) + } +} + +func BenchmarkAESGCMOpen4K(b *testing.B) { + buf := make([]byte, 1024*4) + b.SetBytes(int64(len(buf))) + + var key [16]byte + var nonce [12]byte + aes, _ := aes.NewCipher(key[:]) + aesgcm, _ := cipher.NewGCM(aes) + var out []byte + out = aesgcm.Seal(out[:0], nonce[:], buf, nil) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + _, err := aesgcm.Open(buf[:0], nonce[:], out, nil) + if err != nil { + b.Errorf("Open: %v", err) + } + } +} + +func BenchmarkOpensslGCMenc4K(b *testing.B) { + buf := make([]byte, 1024*4) + b.SetBytes(int64(len(buf))) + + var key [16]byte + var nonce [12]byte + + var ciphertext bytes.Buffer + var part []byte + + b.ResetTimer() + for i := 0; i < b.N; i++ { + ciphertext.Reset() + ectx, err := openssl.NewGCMEncryptionCipherCtx(128, nil, key[:], nonce[:]) + if err != nil { + b.FailNow() + } + part, err = ectx.EncryptUpdate(buf) + if err != nil { + b.FailNow() + } + ciphertext.Write(part) + part, err = ectx.EncryptFinal() + if err != nil { + b.FailNow() + } + ciphertext.Write(part) + part, err = ectx.GetTag() + if err != nil { + b.FailNow() + } + ciphertext.Write(part) + } +} + +func BenchmarkOpensslGCMdec4K(b *testing.B) { + buf := makeOpensslCiphertext() + b.SetBytes(int64(1024*4)) + + tag := buf[4096:] + buf = buf[0:4096] + + var key [16]byte + var nonce [12]byte + + var plaintext bytes.Buffer + var part []byte + + b.ResetTimer() + for i := 0; i < b.N; i++ { + plaintext.Reset() + dctx, err := openssl.NewGCMDecryptionCipherCtx(128, nil, key[:], nonce[:]) + if err != nil { + b.FailNow() + } + part, err = dctx.DecryptUpdate(buf) + if err != nil { + b.FailNow() + } + plaintext.Write(part) + err = dctx.SetTag(tag) + if err != nil { + b.FailNow() + } + part, err = dctx.DecryptFinal() + if err != nil { + b.FailNow() + } + plaintext.Write(part) + } +} + +func makeOpensslCiphertext() []byte { + buf := make([]byte, 1024*4) + var key [16]byte + var nonce [12]byte + var ciphertext bytes.Buffer + var part []byte + + ectx, _ := openssl.NewGCMEncryptionCipherCtx(128, nil, key[:], nonce[:]) + part, _ = ectx.EncryptUpdate(buf) + ciphertext.Write(part) + part, _ = ectx.EncryptFinal() + ciphertext.Write(part) + part, _ = ectx.GetTag() + ciphertext.Write(part) + + return ciphertext.Bytes() +} |