2024-06-21 17:46:36 +00:00
|
|
|
package channel_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"crypto/rand"
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
"source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/core/curves"
|
2024-07-05 07:16:04 +00:00
|
|
|
crypto "source.quilibrium.com/quilibrium/monorepo/node/crypto/channel"
|
2024-06-21 17:46:36 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestFeldman(t *testing.T) {
|
|
|
|
s1 := curves.ED25519().NewScalar().Random(rand.Reader)
|
|
|
|
f1, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
1,
|
|
|
|
s1,
|
|
|
|
*curves.ED25519(),
|
|
|
|
curves.ED25519().NewGeneratorPoint(),
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
s2 := curves.ED25519().NewScalar().Random(rand.Reader)
|
|
|
|
f2, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
2,
|
|
|
|
s2,
|
|
|
|
*curves.ED25519(),
|
|
|
|
curves.ED25519().NewGeneratorPoint(),
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
s3 := curves.ED25519().NewScalar().Random(rand.Reader)
|
|
|
|
f3, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
3,
|
|
|
|
s3,
|
|
|
|
*curves.ED25519(),
|
|
|
|
curves.ED25519().NewGeneratorPoint(),
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
s4 := curves.ED25519().NewScalar().Random(rand.Reader)
|
|
|
|
f4, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
4,
|
|
|
|
s4,
|
|
|
|
*curves.ED25519(),
|
|
|
|
curves.ED25519().NewGeneratorPoint(),
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
s5 := curves.ED25519().NewScalar().Random(rand.Reader)
|
|
|
|
f5, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
5,
|
|
|
|
s5,
|
|
|
|
*curves.ED25519(),
|
|
|
|
curves.ED25519().NewGeneratorPoint(),
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
err = f1.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = f2.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = f3.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = f4.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = f5.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m1, err := f1.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m2, err := f2.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m3, err := f3.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m4, err := f4.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m5, err := f5.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
m1[1] = f1.Scalar().Bytes()
|
|
|
|
|
|
|
|
_, err = f1.SetPolyFragForParty(2, m2[1])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.SetPolyFragForParty(3, m3[1])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.SetPolyFragForParty(4, m4[1])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z1, err := f1.SetPolyFragForParty(5, m5[1])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f2.SetPolyFragForParty(1, m1[2])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.SetPolyFragForParty(3, m3[2])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.SetPolyFragForParty(4, m4[2])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z2, err := f2.SetPolyFragForParty(5, m5[2])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f3.SetPolyFragForParty(1, m1[3])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.SetPolyFragForParty(2, m2[3])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.SetPolyFragForParty(4, m4[3])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z3, err := f3.SetPolyFragForParty(5, m5[3])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f4.SetPolyFragForParty(1, m1[4])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.SetPolyFragForParty(2, m2[4])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.SetPolyFragForParty(3, m3[4])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z4, err := f4.SetPolyFragForParty(5, m5[4])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f5.SetPolyFragForParty(1, m1[5])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.SetPolyFragForParty(2, m2[5])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.SetPolyFragForParty(3, m3[5])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z5, err := f5.SetPolyFragForParty(4, m4[5])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f1.ReceiveCommitments(2, z2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.ReceiveCommitments(3, z3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.ReceiveCommitments(4, z4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r1, err := f1.ReceiveCommitments(5, z5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f2.ReceiveCommitments(1, z1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.ReceiveCommitments(3, z3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.ReceiveCommitments(4, z4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r2, err := f2.ReceiveCommitments(5, z5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f3.ReceiveCommitments(1, z1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.ReceiveCommitments(2, z2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.ReceiveCommitments(4, z4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r3, err := f3.ReceiveCommitments(5, z5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f4.ReceiveCommitments(1, z1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.ReceiveCommitments(2, z2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.ReceiveCommitments(3, z3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r4, err := f4.ReceiveCommitments(5, z5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f5.ReceiveCommitments(1, z1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.ReceiveCommitments(2, z2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.ReceiveCommitments(3, z3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r5, err := f5.ReceiveCommitments(4, z4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f1.Recombine(2, r2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.Recombine(3, r3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.Recombine(4, r4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.Recombine(5, r5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f2.Recombine(1, r1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.Recombine(3, r3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.Recombine(4, r4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.Recombine(5, r5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f3.Recombine(1, r1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.Recombine(2, r2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.Recombine(4, r4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.Recombine(5, r5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f4.Recombine(1, r1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.Recombine(2, r2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.Recombine(3, r3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.Recombine(5, r5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f5.Recombine(1, r1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.Recombine(2, r2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.Recombine(3, r3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.Recombine(4, r4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
s := s1.Add(s2.Add(s3.Add(s4.Add(s5))))
|
|
|
|
assert.True(t, curves.ED25519().NewGeneratorPoint().Mul(s).Equal(f1.PublicKey()))
|
|
|
|
assert.True(t, f5.PublicKey().Equal(f1.PublicKey()))
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestFeldmanCustomGenerator(t *testing.T) {
|
|
|
|
gen := curves.ED25519().Point.Random(rand.Reader)
|
|
|
|
f1, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
1,
|
|
|
|
curves.ED25519().NewScalar().Random(rand.Reader),
|
|
|
|
*curves.ED25519(),
|
|
|
|
gen,
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
f2, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
2,
|
|
|
|
curves.ED25519().NewScalar().Random(rand.Reader),
|
|
|
|
*curves.ED25519(),
|
|
|
|
gen,
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
f3, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
3,
|
|
|
|
curves.ED25519().NewScalar().Random(rand.Reader),
|
|
|
|
*curves.ED25519(),
|
|
|
|
gen,
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
f4, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
4,
|
|
|
|
curves.ED25519().NewScalar().Random(rand.Reader),
|
|
|
|
*curves.ED25519(),
|
|
|
|
gen,
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
f5, err := crypto.NewFeldman(
|
|
|
|
3,
|
|
|
|
5,
|
|
|
|
5,
|
|
|
|
curves.ED25519().NewScalar().Random(rand.Reader),
|
|
|
|
*curves.ED25519(),
|
|
|
|
gen,
|
|
|
|
)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
err = f1.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = f2.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = f3.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = f4.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
err = f5.SamplePolynomial()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m1, err := f1.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m2, err := f2.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m3, err := f3.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m4, err := f4.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
m5, err := f5.GetPolyFrags()
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f1.SetPolyFragForParty(2, m2[1])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.SetPolyFragForParty(3, m3[1])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.SetPolyFragForParty(4, m4[1])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z1, err := f1.SetPolyFragForParty(5, m5[1])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f2.SetPolyFragForParty(1, m1[2])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.SetPolyFragForParty(3, m3[2])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.SetPolyFragForParty(4, m4[2])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z2, err := f2.SetPolyFragForParty(5, m5[2])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f3.SetPolyFragForParty(1, m1[3])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.SetPolyFragForParty(2, m2[3])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.SetPolyFragForParty(4, m4[3])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z3, err := f3.SetPolyFragForParty(5, m5[3])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f4.SetPolyFragForParty(1, m1[4])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.SetPolyFragForParty(2, m2[4])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.SetPolyFragForParty(3, m3[4])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z4, err := f4.SetPolyFragForParty(5, m5[4])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f5.SetPolyFragForParty(1, m1[5])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.SetPolyFragForParty(2, m2[5])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.SetPolyFragForParty(3, m3[5])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
z5, err := f5.SetPolyFragForParty(4, m4[5])
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f1.ReceiveCommitments(2, z2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.ReceiveCommitments(3, z3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.ReceiveCommitments(4, z4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r1, err := f1.ReceiveCommitments(5, z5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f2.ReceiveCommitments(1, z1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.ReceiveCommitments(3, z3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.ReceiveCommitments(4, z4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r2, err := f2.ReceiveCommitments(5, z5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f3.ReceiveCommitments(1, z1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.ReceiveCommitments(2, z2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.ReceiveCommitments(4, z4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r3, err := f3.ReceiveCommitments(5, z5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f4.ReceiveCommitments(1, z1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.ReceiveCommitments(2, z2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.ReceiveCommitments(3, z3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r4, err := f4.ReceiveCommitments(5, z5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f5.ReceiveCommitments(1, z1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.ReceiveCommitments(2, z2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.ReceiveCommitments(3, z3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
r5, err := f5.ReceiveCommitments(4, z4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f1.Recombine(2, r2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.Recombine(3, r3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.Recombine(4, r4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f1.Recombine(5, r5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f2.Recombine(1, r1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.Recombine(3, r3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.Recombine(4, r4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f2.Recombine(5, r5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f3.Recombine(1, r1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.Recombine(2, r2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.Recombine(4, r4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f3.Recombine(5, r5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f4.Recombine(1, r1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.Recombine(2, r2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.Recombine(3, r3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f4.Recombine(5, r5)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
|
|
|
|
_, err = f5.Recombine(1, r1)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.Recombine(2, r2)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.Recombine(3, r3)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
_, err = f5.Recombine(4, r4)
|
|
|
|
assert.NoError(t, err)
|
|
|
|
}
|