Files
tss-lib/crypto/ecpoint_test.go
Fitz 856d77b7fb Curve as parameter (#137)
* move curve into tss.Parameters

* regen proto with full package name

* pass curve through parameter

* add curve name in ecpoint json serialization
2021-07-06 11:51:20 +08:00

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()))
}