nacl/secretbox: add benchmarks

Initial results on an Ivy Bridge system for reference:

BenchmarkSeal8Bytes-8     	 5000000	       310 ns/op	  25.77 MB/s
BenchmarkSeal100Bytes-8   	 3000000	       599 ns/op	 166.76 MB/s
BenchmarkSeal1K-8         	 1000000	      1825 ns/op	 561.06 MB/s
BenchmarkSeal8K-8         	  100000	     10997 ns/op	 744.88 MB/s
BenchmarkOpen8Bytes-8     	 5000000	       327 ns/op	  24.39 MB/s
BenchmarkOpen100Bytes-8   	 2000000	       630 ns/op	 158.49 MB/s
BenchmarkOpen1K-8         	 1000000	      1752 ns/op	 584.21 MB/s
BenchmarkOpen8K-8         	  200000	     10420 ns/op	 786.12 MB/s

Fixes golang/go#20563

Change-Id: Iaacd9715840c1f5c7ee2459759e79c98a4b6f62a
Reviewed-on: https://go-review.googlesource.com/46039
Reviewed-by: Adam Langley <agl@golang.org>
Run-TryBot: Adam Langley <agl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
diff --git a/nacl/secretbox/secretbox_test.go b/nacl/secretbox/secretbox_test.go
index 664dc15..3c70b0f 100644
--- a/nacl/secretbox/secretbox_test.go
+++ b/nacl/secretbox/secretbox_test.go
@@ -89,3 +89,66 @@
 		t.Fatalf("Seal didn't correctly append with sufficient capacity.")
 	}
 }
+
+func benchmarkSealSize(b *testing.B, size int) {
+	message := make([]byte, size)
+	out := make([]byte, size+Overhead)
+	var nonce [24]byte
+	var key [32]byte
+
+	b.SetBytes(int64(size))
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		out = Seal(out[:0], message, &nonce, &key)
+	}
+}
+
+func BenchmarkSeal8Bytes(b *testing.B) {
+	benchmarkSealSize(b, 8)
+}
+
+func BenchmarkSeal100Bytes(b *testing.B) {
+	benchmarkSealSize(b, 100)
+}
+
+func BenchmarkSeal1K(b *testing.B) {
+	benchmarkSealSize(b, 1024)
+}
+
+func BenchmarkSeal8K(b *testing.B) {
+	benchmarkSealSize(b, 8192)
+}
+
+func benchmarkOpenSize(b *testing.B, size int) {
+	msg := make([]byte, size)
+	result := make([]byte, size)
+	var nonce [24]byte
+	var key [32]byte
+	box := Seal(nil, msg, &nonce, &key)
+
+	b.SetBytes(int64(size))
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		if _, ok := Open(result[:0], box, &nonce, &key); !ok {
+			panic("Open failed")
+		}
+	}
+}
+
+func BenchmarkOpen8Bytes(b *testing.B) {
+	benchmarkOpenSize(b, 8)
+}
+
+func BenchmarkOpen100Bytes(b *testing.B) {
+	benchmarkOpenSize(b, 100)
+}
+
+func BenchmarkOpen1K(b *testing.B) {
+	benchmarkOpenSize(b, 1024)
+}
+
+func BenchmarkOpen8K(b *testing.B) {
+	benchmarkOpenSize(b, 8192)
+}