goc25519sm_benchmark_test.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. // Copyright © 2021 Jeffrey H. Johnson <trnsz@pobox.com>
  2. // Copyright © 2021 Gridfinity, LLC.
  3. // Copyright © 2019 The Go Authors.
  4. //
  5. // All rights reserved.
  6. //
  7. // Use of this source code is governed by the BSD-style
  8. // license that can be found in the LICENSE file.
  9. package goc25519sm_test
  10. import (
  11. "fmt"
  12. mrand "math/rand"
  13. "testing"
  14. "time"
  15. goc25519sm "github.com/johnsonjh/goc25519sm"
  16. )
  17. func benchmarkOldScalarBaseMult(
  18. x int,
  19. b *testing.B,
  20. ) {
  21. var in, out [goc25519sm.X25519Size]byte
  22. for bSetup := 0; bSetup < 32; bSetup = (bSetup + 2) {
  23. in[bSetup] = ((byte(bSetup) + 1) + byte(x))
  24. in[bSetup+1] = (in[bSetup] + byte(x))
  25. }
  26. var err error
  27. b.SetBytes(
  28. goc25519sm.X25519Size,
  29. )
  30. for i := 0; i < b.N; i++ {
  31. err = goc25519sm.OldScalarBaseMult(
  32. &out,
  33. &in,
  34. )
  35. if err != nil {
  36. b.Fatal(
  37. fmt.Sprintf(
  38. "\ngoc25519sm_test.benchmarkOldScalarBaseMult.OldScalarBaseMult FAILURE:\n input=%v\n output=%v\n %v",
  39. in,
  40. out,
  41. err,
  42. ),
  43. )
  44. }
  45. }
  46. // Overwrite ExamplePointA with the bench output, and invoke
  47. // OldScalarVerifyBasepoint to ensure it correctly detects
  48. // that this output is NOT the Basepoint; this is mostly to
  49. // ensure the benchmark is not aggressively optimized away
  50. // by performing actual (constant time) work on the output.
  51. goc25519sm.ExamplePointA = out
  52. err = goc25519sm.OldScalarVerifyBasepoint(
  53. goc25519sm.ExamplePointA,
  54. )
  55. if err == nil {
  56. b.Fatal(
  57. fmt.Sprintf(
  58. "\ngoc25519sm_test.benchmarkOldScalarBaseMult.OldScalarVerifyBasepoint FAILURE:\n ERROR: false positive detected checking basepoint: %v",
  59. err,
  60. ),
  61. )
  62. }
  63. }
  64. // Setup multiple iterations with randomized inputs. Use
  65. // of the CSPRNG is not needed here for simple benchmark
  66. // testing, but should always be used in production code.
  67. func BenchmarkOldScalarBaseMult_01(
  68. b *testing.B,
  69. ) {
  70. mrand.Seed(
  71. time.Now().UnixNano(),
  72. )
  73. z := mrand.Intn(
  74. ((((1 << 8) - 1 - 1) - 1) + 1),
  75. )
  76. benchmarkOldScalarBaseMult(
  77. (z + 1),
  78. b,
  79. )
  80. }
  81. func BenchmarkOldScalarBaseMult_02(
  82. b *testing.B,
  83. ) {
  84. mrand.Seed(
  85. time.Now().UnixNano(),
  86. )
  87. z := mrand.Intn(
  88. ((((1 << 8) - 2 - 1) - 2) + 2),
  89. )
  90. benchmarkOldScalarBaseMult(
  91. z+2,
  92. b,
  93. )
  94. }
  95. func BenchmarkOldScalarBaseMult_04(
  96. b *testing.B,
  97. ) {
  98. mrand.Seed(
  99. time.Now().UnixNano(),
  100. )
  101. z := mrand.Intn(
  102. ((((1 << 8) - 4 - 1) - 4) + 4),
  103. )
  104. benchmarkOldScalarBaseMult(
  105. z+4,
  106. b,
  107. )
  108. }
  109. func BenchmarkOldScalarBaseMult_08(
  110. b *testing.B,
  111. ) {
  112. mrand.Seed(
  113. time.Now().UnixNano(),
  114. )
  115. z := mrand.Intn(
  116. ((((1 << 8) - 8 - 1) - 8) + 8),
  117. )
  118. benchmarkOldScalarBaseMult(
  119. (z + 8),
  120. b,
  121. )
  122. }
  123. func BenchmarkOldScalarBaseMult_16(
  124. b *testing.B,
  125. ) {
  126. mrand.Seed(
  127. time.Now().UnixNano(),
  128. )
  129. z := mrand.Intn(
  130. ((((1 << 8) - 16 - 1) - 16) + 16),
  131. )
  132. benchmarkOldScalarBaseMult(
  133. (z + 16),
  134. b,
  135. )
  136. }
  137. func BenchmarkOldScalarBaseMult_32(
  138. b *testing.B,
  139. ) {
  140. mrand.Seed(
  141. time.Now().UnixNano(),
  142. )
  143. z := mrand.Intn(
  144. ((((1 << 8) - 32 - 1) - 32) + 32),
  145. )
  146. benchmarkOldScalarBaseMult(
  147. (z + 32),
  148. b,
  149. )
  150. }