This repository has been archived by the owner on Jul 19, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathinvmul_test.go
122 lines (105 loc) · 2.53 KB
/
invmul_test.go
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
package main
import (
"testing"
"github.com/crate-crypto/go-ipa/bandersnatch/fp"
"github.com/stretchr/testify/require"
blst "github.com/supranational/blst/bindings/go"
)
func BenchmarkFpInverse(b *testing.B) {
b.Run("go-ipa", func(b *testing.B) {
var x fp.Element
x.SetRandom()
b.ReportAllocs()
b.ResetTimer()
var resIPA fp.Element
for i := 0; i < b.N; i++ {
resIPA.Inverse(&x)
}
})
b.Run("go-blst", func(b *testing.B) {
var xIPA fp.Element
xIPA.SetRandom()
var xBLST blst.Scalar
beBytes := xIPA.Bytes()
xBLST.FromBEndian(beBytes[:])
var resBLST *blst.Scalar
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
resBLST = xBLST.Inverse()
}
_ = resBLST
})
}
func TestVerifyGoIPAvsBLSTInverse(t *testing.T) {
t.Parallel()
for i := 0; i < 500_000; i++ {
// Generate random field element
var xIPA fp.Element
xIPA.SetRandom()
// Get the inverse with go-ipa
var invIPA fp.Element
invIPA.Inverse(&xIPA)
// Transform the same x to blst, and calculate the multiplication.
var xBLST blst.Scalar
beBytes := xIPA.Bytes()
xBLST.FromBEndian(beBytes[:])
invBLST := xBLST.Inverse()
// Both inverses should match.
invIPABytes := invIPA.Bytes()
require.Equal(t, invIPABytes[:], invBLST.Serialize())
}
}
func BenchmarkFpMul(b *testing.B) {
b.Run("go-ipa", func(b *testing.B) {
var x fp.Element
x.SetRandom()
var y fp.Element
y.SetRandom()
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
x.Mul(&x, &y)
}
})
b.Run("go-blst", func(b *testing.B) {
var xIPA fp.Element
xIPA.SetRandom()
var yIPA fp.Element
yIPA.SetRandom()
var xBLST blst.Scalar
beXBytes := xIPA.Bytes()
xBLST.FromBEndian(beXBytes[:])
var yBLST blst.Scalar
beYBytes := yIPA.Bytes()
yBLST.FromBEndian(beYBytes[:])
b.ReportAllocs()
b.ResetTimer()
for i := 0; i < b.N; i++ {
xBLST.MulAssign(&yBLST)
}
})
}
func TestVerifyGoIPAvsBLSTMultiplication(t *testing.T) {
t.Parallel()
for i := 0; i < 500_000; i++ {
// Generate random field element
var xIPA fp.Element
xIPA.SetRandom()
var yIPA fp.Element
yIPA.SetRandom()
// Multiply x and y with go-ipa
var mulIPA fp.Element
mulIPA.Mul(&xIPA, &yIPA)
// Transform x and y to blst, and calculate the multiplication.
var xBLST blst.Scalar
beXBytes := xIPA.Bytes()
xBLST.FromBEndian(beXBytes[:])
var yBLST blst.Scalar
beYBytes := yIPA.Bytes()
yBLST.FromBEndian(beYBytes[:])
mulBLST, _ := xBLST.MulAssign(&yBLST)
mulIPABytes := mulIPA.Bytes()
require.Equal(t, mulIPABytes[:], mulBLST.Serialize())
}
}