mirror of
https://github.com/SwingbyProtocol/tss-lib.git
synced 2026-04-23 03:00:36 -04:00
* move curve into tss.Parameters * regen proto with full package name * pass curve through parameter * add curve name in ecpoint json serialization
168 lines
4.5 KiB
Go
168 lines
4.5 KiB
Go
// Copyright © 2019 Binance
|
|
//
|
|
// This file is part of Binance. The full Binance copyright notice, including
|
|
// terms governing use, modification, and redistribution, is contained in the
|
|
// file LICENSE at the root of the source code distribution tree.
|
|
|
|
package crypto_test
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"encoding/json"
|
|
"math/big"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/btcsuite/btcd/btcec"
|
|
"github.com/decred/dcrd/dcrec/edwards/v2"
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
. "github.com/binance-chain/tss-lib/crypto"
|
|
"github.com/binance-chain/tss-lib/tss"
|
|
)
|
|
|
|
func TestFlattenECPoints(t *testing.T) {
|
|
type args struct {
|
|
in []*ECPoint
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []*big.Int
|
|
wantErr bool
|
|
}{{
|
|
name: "flatten with 2 points (happy)",
|
|
args: args{[]*ECPoint{
|
|
NewECPointNoCurveCheck(tss.EC(), big.NewInt(1), big.NewInt(2)),
|
|
NewECPointNoCurveCheck(tss.EC(), big.NewInt(3), big.NewInt(4)),
|
|
}},
|
|
want: []*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3), big.NewInt(4)},
|
|
}, {
|
|
name: "flatten with nil point (expects err)",
|
|
args: args{[]*ECPoint{
|
|
NewECPointNoCurveCheck(tss.EC(), big.NewInt(1), big.NewInt(2)),
|
|
nil,
|
|
NewECPointNoCurveCheck(tss.EC(), big.NewInt(3), big.NewInt(4))},
|
|
},
|
|
want: nil,
|
|
wantErr: true,
|
|
}, {
|
|
name: "flatten with nil coordinate (expects err)",
|
|
args: args{[]*ECPoint{
|
|
NewECPointNoCurveCheck(tss.EC(), big.NewInt(1), big.NewInt(2)),
|
|
NewECPointNoCurveCheck(tss.EC(), nil, big.NewInt(4))},
|
|
},
|
|
want: nil,
|
|
wantErr: true,
|
|
}, {
|
|
name: "flatten with nil `in` slice",
|
|
args: args{nil},
|
|
want: nil,
|
|
wantErr: true,
|
|
}}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := FlattenECPoints(tt.args.in)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("FlattenECPoints() error = %v, wantErr %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if !reflect.DeepEqual(got, tt.want) {
|
|
t.Errorf("FlattenECPoints() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestUnFlattenECPoints(t *testing.T) {
|
|
type args struct {
|
|
in []*big.Int
|
|
}
|
|
tests := []struct {
|
|
name string
|
|
args args
|
|
want []*ECPoint
|
|
wantErr bool
|
|
}{{
|
|
name: "un-flatten 2 points (happy)",
|
|
args: args{[]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3), big.NewInt(4)}},
|
|
want: []*ECPoint{
|
|
NewECPointNoCurveCheck(tss.EC(), big.NewInt(1), big.NewInt(2)),
|
|
NewECPointNoCurveCheck(tss.EC(), big.NewInt(3), big.NewInt(4)),
|
|
},
|
|
}, {
|
|
name: "un-flatten uneven len(points) (expects err)",
|
|
args: args{[]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3)}},
|
|
want: nil,
|
|
wantErr: true,
|
|
}, {
|
|
name: "un-flatten with nil coordinate (expects err)",
|
|
args: args{[]*big.Int{big.NewInt(1), big.NewInt(2), big.NewInt(3), nil}},
|
|
want: nil,
|
|
wantErr: true,
|
|
}, {
|
|
name: "flatten with nil `in` slice",
|
|
args: args{nil},
|
|
want: nil,
|
|
wantErr: true,
|
|
}}
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got, err := UnFlattenECPoints(tss.EC(), tt.args.in, true)
|
|
if (err != nil) != tt.wantErr {
|
|
t.Errorf("UnFlattenECPoints() error = %v, wantErr %v", err, tt.wantErr)
|
|
return
|
|
}
|
|
if !reflect.DeepEqual(got, tt.want) {
|
|
t.Errorf("UnFlattenECPoints() = %v, want %v", got, tt.want)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestS256EcpointJsonSerialization(t *testing.T) {
|
|
ec := btcec.S256()
|
|
tss.RegisterCurve("secp256k1", ec)
|
|
|
|
pubKeyBytes, err := hex.DecodeString("03935336acb03b2b801d8f8ac5e92c56c4f6e93319901fdfffba9d340a874e2879")
|
|
assert.NoError(t, err)
|
|
pbk, err := btcec.ParsePubKey(pubKeyBytes, btcec.S256())
|
|
assert.NoError(t, err)
|
|
|
|
point, err := NewECPoint(ec, pbk.X, pbk.Y)
|
|
assert.NoError(t, err)
|
|
bz, err := json.Marshal(point)
|
|
assert.NoError(t, err)
|
|
assert.True(t, len(bz) > 0)
|
|
|
|
var umpoint ECPoint
|
|
err = json.Unmarshal(bz, &umpoint)
|
|
assert.NoError(t, err)
|
|
|
|
assert.True(t, point.Equals(&umpoint))
|
|
assert.True(t, reflect.TypeOf(point.Curve()) == reflect.TypeOf(umpoint.Curve()))
|
|
}
|
|
|
|
func TestEdwardsEcpointJsonSerialization(t *testing.T) {
|
|
ec := edwards.Edwards()
|
|
tss.RegisterCurve("ed25519", ec)
|
|
|
|
pubKeyBytes, err := hex.DecodeString("ae1e5bf5f3d6bf58b5c222088671fcbe78b437e28fae944c793897b26091f249")
|
|
assert.NoError(t, err)
|
|
pbk, err := edwards.ParsePubKey(pubKeyBytes)
|
|
assert.NoError(t, err)
|
|
|
|
point, err := NewECPoint(ec, pbk.X, pbk.Y)
|
|
assert.NoError(t, err)
|
|
bz, err := json.Marshal(point)
|
|
assert.NoError(t, err)
|
|
assert.True(t, len(bz) > 0)
|
|
|
|
var umpoint ECPoint
|
|
err = json.Unmarshal(bz, &umpoint)
|
|
assert.NoError(t, err)
|
|
|
|
assert.True(t, point.Equals(&umpoint))
|
|
assert.True(t, reflect.TypeOf(point.Curve()) == reflect.TypeOf(umpoint.Curve()))
|
|
}
|