github.com/SmartMeshFoundation/Spectrum@v0.0.0-20220621030607-452a266fee1e/whisper/whisperv6/benchmarks_test.go (about)

     1  // Copyright 2016 The Spectrum Authors
     2  // This file is part of the Spectrum library.
     3  //
     4  // The Spectrum library is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU Lesser General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // The Spectrum library is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU Lesser General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU Lesser General Public License
    15  // along with the Spectrum library. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  package whisperv6
    18  
    19  import (
    20  	"crypto/sha256"
    21  	"testing"
    22  
    23  	"github.com/SmartMeshFoundation/Spectrum/crypto"
    24  	"golang.org/x/crypto/pbkdf2"
    25  )
    26  
    27  func BenchmarkDeriveKeyMaterial(b *testing.B) {
    28  	for i := 0; i < b.N; i++ {
    29  		pbkdf2.Key([]byte("test"), nil, 65356, aesKeyLength, sha256.New)
    30  	}
    31  }
    32  
    33  func BenchmarkEncryptionSym(b *testing.B) {
    34  	InitSingleTest()
    35  
    36  	params, err := generateMessageParams()
    37  	if err != nil {
    38  		b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
    39  	}
    40  
    41  	for i := 0; i < b.N; i++ {
    42  		msg, _ := NewSentMessage(params)
    43  		_, err := msg.Wrap(params)
    44  		if err != nil {
    45  			b.Errorf("failed Wrap with seed %d: %s.", seed, err)
    46  			b.Errorf("i = %d, len(msg.Raw) = %d, params.Payload = %d.", i, len(msg.Raw), len(params.Payload))
    47  			return
    48  		}
    49  	}
    50  }
    51  
    52  func BenchmarkEncryptionAsym(b *testing.B) {
    53  	InitSingleTest()
    54  
    55  	params, err := generateMessageParams()
    56  	if err != nil {
    57  		b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
    58  	}
    59  	key, err := crypto.GenerateKey()
    60  	if err != nil {
    61  		b.Fatalf("failed GenerateKey with seed %d: %s.", seed, err)
    62  	}
    63  	params.KeySym = nil
    64  	params.Dst = &key.PublicKey
    65  
    66  	for i := 0; i < b.N; i++ {
    67  		msg, _ := NewSentMessage(params)
    68  		_, err := msg.Wrap(params)
    69  		if err != nil {
    70  			b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
    71  		}
    72  	}
    73  }
    74  
    75  func BenchmarkDecryptionSymValid(b *testing.B) {
    76  	InitSingleTest()
    77  
    78  	params, err := generateMessageParams()
    79  	if err != nil {
    80  		b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
    81  	}
    82  	msg, _ := NewSentMessage(params)
    83  	env, err := msg.Wrap(params)
    84  	if err != nil {
    85  		b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
    86  	}
    87  	f := Filter{KeySym: params.KeySym}
    88  
    89  	for i := 0; i < b.N; i++ {
    90  		msg := env.Open(&f)
    91  		if msg == nil {
    92  			b.Fatalf("failed to open with seed %d.", seed)
    93  		}
    94  	}
    95  }
    96  
    97  func BenchmarkDecryptionSymInvalid(b *testing.B) {
    98  	InitSingleTest()
    99  
   100  	params, err := generateMessageParams()
   101  	if err != nil {
   102  		b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   103  	}
   104  	msg, _ := NewSentMessage(params)
   105  	env, err := msg.Wrap(params)
   106  	if err != nil {
   107  		b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   108  	}
   109  	f := Filter{KeySym: []byte("arbitrary stuff here")}
   110  
   111  	for i := 0; i < b.N; i++ {
   112  		msg := env.Open(&f)
   113  		if msg != nil {
   114  			b.Fatalf("opened envelope with invalid key, seed: %d.", seed)
   115  		}
   116  	}
   117  }
   118  
   119  func BenchmarkDecryptionAsymValid(b *testing.B) {
   120  	InitSingleTest()
   121  
   122  	params, err := generateMessageParams()
   123  	if err != nil {
   124  		b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   125  	}
   126  	key, err := crypto.GenerateKey()
   127  	if err != nil {
   128  		b.Fatalf("failed GenerateKey with seed %d: %s.", seed, err)
   129  	}
   130  	f := Filter{KeyAsym: key}
   131  	params.KeySym = nil
   132  	params.Dst = &key.PublicKey
   133  	msg, _ := NewSentMessage(params)
   134  	env, err := msg.Wrap(params)
   135  	if err != nil {
   136  		b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   137  	}
   138  
   139  	for i := 0; i < b.N; i++ {
   140  		msg := env.Open(&f)
   141  		if msg == nil {
   142  			b.Fatalf("fail to open, seed: %d.", seed)
   143  		}
   144  	}
   145  }
   146  
   147  func BenchmarkDecryptionAsymInvalid(b *testing.B) {
   148  	InitSingleTest()
   149  
   150  	params, err := generateMessageParams()
   151  	if err != nil {
   152  		b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   153  	}
   154  	key, err := crypto.GenerateKey()
   155  	if err != nil {
   156  		b.Fatalf("failed GenerateKey with seed %d: %s.", seed, err)
   157  	}
   158  	params.KeySym = nil
   159  	params.Dst = &key.PublicKey
   160  	msg, _ := NewSentMessage(params)
   161  	env, err := msg.Wrap(params)
   162  	if err != nil {
   163  		b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   164  	}
   165  
   166  	key, err = crypto.GenerateKey()
   167  	if err != nil {
   168  		b.Fatalf("failed GenerateKey with seed %d: %s.", seed, err)
   169  	}
   170  	f := Filter{KeyAsym: key}
   171  
   172  	for i := 0; i < b.N; i++ {
   173  		msg := env.Open(&f)
   174  		if msg != nil {
   175  			b.Fatalf("opened envelope with invalid key, seed: %d.", seed)
   176  		}
   177  	}
   178  }
   179  
   180  func increment(x []byte) {
   181  	for i := 0; i < len(x); i++ {
   182  		x[i]++
   183  		if x[i] != 0 {
   184  			break
   185  		}
   186  	}
   187  }
   188  
   189  func BenchmarkPoW(b *testing.B) {
   190  	InitSingleTest()
   191  
   192  	params, err := generateMessageParams()
   193  	if err != nil {
   194  		b.Fatalf("failed generateMessageParams with seed %d: %s.", seed, err)
   195  	}
   196  	params.Payload = make([]byte, 32)
   197  	params.PoW = 10.0
   198  	params.TTL = 1
   199  
   200  	for i := 0; i < b.N; i++ {
   201  		increment(params.Payload)
   202  		msg, _ := NewSentMessage(params)
   203  		_, err := msg.Wrap(params)
   204  		if err != nil {
   205  			b.Fatalf("failed Wrap with seed %d: %s.", seed, err)
   206  		}
   207  	}
   208  }