package ed25519
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
"github.com/tendermint/tendermint/crypto"
|
|
"github.com/tendermint/tendermint/crypto/internal/benchmarking"
|
|
)
|
|
|
|
func BenchmarkKeyGeneration(b *testing.B) {
|
|
benchmarkKeygenWrapper := func(reader io.Reader) crypto.PrivKey {
|
|
return genPrivKey(reader)
|
|
}
|
|
benchmarking.BenchmarkKeyGeneration(b, benchmarkKeygenWrapper)
|
|
}
|
|
|
|
func BenchmarkSigning(b *testing.B) {
|
|
priv := GenPrivKey()
|
|
benchmarking.BenchmarkSigning(b, priv)
|
|
}
|
|
|
|
func BenchmarkVerification(b *testing.B) {
|
|
priv := GenPrivKey()
|
|
benchmarking.BenchmarkVerification(b, priv)
|
|
}
|
|
|
|
func BenchmarkVerifyBatch(b *testing.B) {
|
|
msg := []byte("BatchVerifyTest")
|
|
|
|
for _, sigsCount := range []int{1, 8, 64, 1024} {
|
|
sigsCount := sigsCount
|
|
b.Run(fmt.Sprintf("sig-count-%d", sigsCount), func(b *testing.B) {
|
|
// Pre-generate all of the keys, and signatures, but do not
|
|
// benchmark key-generation and signing.
|
|
pubs := make([]crypto.PubKey, 0, sigsCount)
|
|
sigs := make([][]byte, 0, sigsCount)
|
|
for i := 0; i < sigsCount; i++ {
|
|
priv := GenPrivKey()
|
|
sig, _ := priv.Sign(msg)
|
|
pubs = append(pubs, priv.PubKey().(PubKey))
|
|
sigs = append(sigs, sig)
|
|
}
|
|
b.ResetTimer()
|
|
|
|
b.ReportAllocs()
|
|
// NOTE: dividing by n so that metrics are per-signature
|
|
for i := 0; i < b.N/sigsCount; i++ {
|
|
// The benchmark could just benchmark the Verify()
|
|
// routine, but there is non-trivial overhead associated
|
|
// with BatchVerifier.Add(), which should be included
|
|
// in the benchmark.
|
|
v := NewBatchVerifier()
|
|
for i := 0; i < sigsCount; i++ {
|
|
err := v.Add(pubs[i], msg, sigs[i])
|
|
require.NoError(b, err)
|
|
}
|
|
|
|
if ok, _ := v.Verify(); !ok {
|
|
b.Fatal("signature set failed batch verification")
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|