mirror of
https://source.quilibrium.com/quilibrium/ceremonyclient.git
synced 2024-12-27 09:05:18 +00:00
89 lines
2.5 KiB
Go
89 lines
2.5 KiB
Go
|
//
|
||
|
// Copyright Coinbase, Inc. All Rights Reserved.
|
||
|
//
|
||
|
// SPDX-License-Identifier: Apache-2.0
|
||
|
//
|
||
|
|
||
|
package accumulator
|
||
|
|
||
|
import (
|
||
|
"testing"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"source.quilibrium.com/quilibrium/monorepo/nekryptology/pkg/core/curves"
|
||
|
)
|
||
|
|
||
|
func TestSecretKeyMarshal(t *testing.T) {
|
||
|
curve := curves.BLS12381(&curves.PointBls12381G1{})
|
||
|
data, err := SecretKey{curve.Scalar.One()}.MarshalBinary()
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, data)
|
||
|
e := &SecretKey{curve.Scalar.New(2)}
|
||
|
err = e.UnmarshalBinary(data)
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, e.value.Bytes(), curve.Scalar.One().Bytes())
|
||
|
|
||
|
// element cannot be empty
|
||
|
_, err = SecretKey{}.MarshalBinary()
|
||
|
require.Error(t, err)
|
||
|
}
|
||
|
|
||
|
func TestPublicKeyMarshal(t *testing.T) {
|
||
|
// Actually test both toBytes() and from()
|
||
|
curve := curves.BLS12381(&curves.PointBls12381G1{})
|
||
|
sk := &SecretKey{curve.Scalar.New(3)}
|
||
|
pk, _ := sk.GetPublicKey(curve)
|
||
|
pkBytes, err := pk.MarshalBinary()
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, pkBytes)
|
||
|
|
||
|
pk2 := &PublicKey{}
|
||
|
err = pk2.UnmarshalBinary(pkBytes)
|
||
|
require.NoError(t, err)
|
||
|
require.True(t, pk.value.Equal(pk2.value))
|
||
|
}
|
||
|
|
||
|
func TestBatch(t *testing.T) {
|
||
|
curve := curves.BLS12381(&curves.PointBls12381G1{})
|
||
|
var seed [32]byte
|
||
|
sk, _ := new(SecretKey).New(curve, seed[:])
|
||
|
element1 := curve.Scalar.Hash([]byte("value1"))
|
||
|
element2 := curve.Scalar.Hash([]byte("value2"))
|
||
|
elements := []Element{element1, element2}
|
||
|
|
||
|
add, err := sk.BatchAdditions(elements)
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, add)
|
||
|
|
||
|
del, err := sk.BatchDeletions(elements)
|
||
|
require.NoError(t, err)
|
||
|
require.NotNil(t, del)
|
||
|
|
||
|
result := add.Mul(del)
|
||
|
require.Equal(t, result, curve.Scalar.One())
|
||
|
|
||
|
g1 := curve.PointG1.Generator()
|
||
|
acc := g1.Mul(add)
|
||
|
require.NotEqual(t, acc, g1)
|
||
|
acc = acc.Mul(del)
|
||
|
require.Equal(t, acc.ToAffineCompressed(), g1.ToAffineCompressed())
|
||
|
|
||
|
acc2 := g1.Mul(result)
|
||
|
require.True(t, acc2.Equal(g1))
|
||
|
}
|
||
|
|
||
|
func TestCoefficient(t *testing.T) {
|
||
|
curve := curves.BLS12381(&curves.PointBls12381G1{})
|
||
|
sk, _ := new(SecretKey).New(curve, []byte("1234567890"))
|
||
|
element1 := curve.Scalar.Hash([]byte("value1"))
|
||
|
element2 := curve.Scalar.Hash([]byte("value2"))
|
||
|
element3 := curve.Scalar.Hash([]byte("value3"))
|
||
|
element4 := curve.Scalar.Hash([]byte("value4"))
|
||
|
element5 := curve.Scalar.Hash([]byte("value5"))
|
||
|
elements := []Element{element1, element2, element3, element4, element5}
|
||
|
coefficients, err := sk.CreateCoefficients(elements[0:2], elements[2:5])
|
||
|
require.NoError(t, err)
|
||
|
require.Equal(t, len(coefficients), 3)
|
||
|
}
|