gecko/utils/crypto/crypto_benchmark_test.go

104 lines
2.0 KiB
Go

// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package crypto
import (
"testing"
"github.com/ava-labs/gecko/utils/hashing"
)
// NumVerifies is the number of verifications to run per operation
const NumVerifies = 1
// The different signature schemes
const (
RSA = iota
RSAPSS
ED25519
SECP256K1
)
var (
hashes [][]byte
keys [][]PublicKey
sigs [][][]byte
)
func init() {
// Setup hashes:
bytes := [32]byte{}
for i := uint64(0); i < NumVerifies; i++ {
bytes[i%32]++
hash := hashing.ComputeHash256(bytes[:])
hashes = append(hashes, hash)
}
// Setup signatures:
factories := []Factory{
RSA: &FactoryRSA{},
RSAPSS: &FactoryRSAPSS{},
ED25519: &FactoryED25519{},
SECP256K1: &FactorySECP256K1R{},
}
for _, f := range factories {
fKeys := []PublicKey{}
fSigs := [][]byte{}
for i := uint64(0); i < NumVerifies; i++ {
privateKey, err := f.NewPrivateKey()
if err != nil {
panic(err)
}
publicKey := privateKey.PublicKey()
sig, err := privateKey.SignHash(hashes[i])
if err != nil {
panic(err)
}
fKeys = append(fKeys, publicKey)
fSigs = append(fSigs, sig)
}
keys = append(keys, fKeys)
sigs = append(sigs, fSigs)
}
}
func verify(algo int) {
for i := 0; i < NumVerifies; i++ {
if !keys[algo][i].VerifyHash(hashes[i], sigs[algo][i]) {
panic("Verification failed")
}
}
}
// BenchmarkRSAVerify runs the benchmark with RSA keys
func BenchmarkRSAVerify(b *testing.B) {
for n := 0; n < b.N; n++ {
verify(RSA)
}
}
// BenchmarkRSAPSSVerify runs the benchmark with RSAPSS keys
func BenchmarkRSAPSSVerify(b *testing.B) {
for n := 0; n < b.N; n++ {
verify(RSAPSS)
}
}
// BenchmarkED25519Verify runs the benchmark with ED25519 keys
func BenchmarkED25519Verify(b *testing.B) {
for n := 0; n < b.N; n++ {
verify(ED25519)
}
}
// BenchmarkSECP256k1Verify runs the benchmark with SECP256K1 keys
func BenchmarkSECP256k1Verify(b *testing.B) {
for n := 0; n < b.N; n++ {
verify(SECP256K1)
}
}