1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164
|
package edwards25519_test
import (
"math/big"
"testing"
"github.com/bwesterb/go-ristretto/edwards25519"
)
func TestAddExtendedNiels(t *testing.T) {
var buf1, buf2 [32]byte
var cp1, cp2, cp3 edwards25519.CompletedPoint
var np2 edwards25519.NielsPoint
var fe1, fe2 edwards25519.FieldElement
var ep1, ep2, ep3a, ep3b edwards25519.ExtendedPoint
for i := 0; i < 1000; i++ {
rnd.Read(buf1[:])
rnd.Read(buf2[:])
fe1.SetBytes(&buf1)
fe2.SetBytes(&buf2)
cp1.SetRistrettoElligator2(&fe1)
cp2.SetRistrettoElligator2(&fe2)
ep1.SetCompleted(&cp1)
ep2.SetCompleted(&cp2)
ep3a.Add(&ep1, &ep2)
np2.SetExtended(&ep2)
cp3.AddExtendedNiels(&ep1, &np2)
ep3b.SetCompleted(&cp3)
if ep3a.RistrettoEqualsI(&ep3b) != 1 {
t.Fatalf("%v + %v = %v != %v", ep1, ep2, ep3a, ep3b)
}
}
}
func TestSubExtendedNiels(t *testing.T) {
var buf1, buf2 [32]byte
var cp1, cp2, cp3 edwards25519.CompletedPoint
var np2 edwards25519.NielsPoint
var fe1, fe2 edwards25519.FieldElement
var ep1, ep2, ep3a, ep3b edwards25519.ExtendedPoint
for i := 0; i < 1000; i++ {
rnd.Read(buf1[:])
rnd.Read(buf2[:])
fe1.SetBytes(&buf1)
fe2.SetBytes(&buf2)
cp1.SetRistrettoElligator2(&fe1)
cp2.SetRistrettoElligator2(&fe2)
ep1.SetCompleted(&cp1)
ep2.SetCompleted(&cp2)
ep3a.Sub(&ep1, &ep2)
np2.SetExtended(&ep2)
cp3.SubExtendedNiels(&ep1, &np2)
ep3b.SetCompleted(&cp3)
if ep3a.RistrettoEqualsI(&ep3b) != 1 {
t.Fatalf("%v - %v = %v != %v", ep1, ep2, ep3a, ep3b)
}
}
}
func TestTableVarTimeBaseScalarMult(t *testing.T) {
var table edwards25519.ScalarMultTable
var B, p1, p2 edwards25519.ExtendedPoint
B.SetBase()
table.Compute(&B)
var s [32]byte
for i := 0; i < 1000; i++ {
rnd.Read(s[:])
s[31] &= 31
table.ScalarMult(&p1, &s)
table.VarTimeScalarMult(&p2, &s)
if p1.RistrettoEqualsI(&p2) != 1 {
t.Fatalf("[%v]B = %v != %v", s, p2, p1)
}
}
}
func TestTableBaseScalarMult(t *testing.T) {
var table edwards25519.ScalarMultTable
var B, p1, p2 edwards25519.ExtendedPoint
B.SetBase()
table.Compute(&B)
var s [32]byte
for i := 0; i < 1000; i++ {
rnd.Read(s[:])
s[31] &= 31
table.ScalarMult(&p1, &s)
p2.ScalarMult(&B, &s)
if p1.RistrettoEqualsI(&p2) != 1 {
t.Fatalf("[%v]B = %v != %v", s, p2, p1)
}
}
}
func TestBaseScalarMultTable(t *testing.T) {
var table edwards25519.ScalarMultTable
var B edwards25519.ExtendedPoint
B.SetBase()
table.Compute(&B)
if edwards25519.BaseScalarMultTable != table {
t.Fatalf("BaseScalarMultTable has incorrect values")
}
}
func BenchmarkScalarMultTableCompute(b *testing.B) {
var buf [32]byte
var fe edwards25519.FieldElement
var cp edwards25519.CompletedPoint
var ep edwards25519.ExtendedPoint
var table edwards25519.ScalarMultTable
rnd.Read(buf[:])
fe.SetBytes(&buf)
cp.SetRistrettoElligator2(&fe)
ep.SetCompleted(&cp)
b.ResetTimer()
for n := 0; n < b.N; n++ {
table.Compute(&ep)
}
}
func BenchmarkScalarMultTableScalarMult(b *testing.B) {
var buf, sBuf [32]byte
var biS big.Int
var cp edwards25519.CompletedPoint
var ep edwards25519.ExtendedPoint
var fe edwards25519.FieldElement
var table edwards25519.ScalarMultTable
biS.Rand(rnd, &biL)
srBuf := biS.Bytes()
for j := 0; j < len(srBuf); j++ {
sBuf[j] = srBuf[len(srBuf)-j-1]
}
rnd.Read(buf[:])
fe.SetBytes(&buf)
cp.SetRistrettoElligator2(&fe)
ep.SetCompleted(&cp)
table.Compute(&ep)
b.ResetTimer()
for n := 0; n < b.N; n++ {
table.ScalarMult(&ep, &sBuf)
}
}
func BenchmarkScalarMultTableVarTimeScalarMult(b *testing.B) {
var buf, sBuf [32]byte
var biS big.Int
var cp edwards25519.CompletedPoint
var ep edwards25519.ExtendedPoint
var fe edwards25519.FieldElement
var table edwards25519.ScalarMultTable
biS.Rand(rnd, &biL)
srBuf := biS.Bytes()
for j := 0; j < len(srBuf); j++ {
sBuf[j] = srBuf[len(srBuf)-j-1]
}
rnd.Read(buf[:])
fe.SetBytes(&buf)
cp.SetRistrettoElligator2(&fe)
ep.SetCompleted(&cp)
table.Compute(&ep)
b.ResetTimer()
for n := 0; n < b.N; n++ {
table.VarTimeScalarMult(&ep, &sBuf)
}
}
|