mirror of
https://github.com/luxfi/threshold.git
synced 2026-10-30 15:15:53 +00:00
265 lines
6.2 KiB
Go
265 lines
6.2 KiB
Go
package lss_test
|
|
|
|
import (
|
|
"context"
|
|
"crypto/sha256"
|
|
"testing"
|
|
"time"
|
|
|
|
log "github.com/luxfi/log"
|
|
"github.com/luxfi/metric"
|
|
"github.com/luxfi/threshold/internal/test"
|
|
"github.com/luxfi/threshold/pkg/math/curve"
|
|
"github.com/luxfi/threshold/pkg/party"
|
|
"github.com/luxfi/threshold/pkg/pool"
|
|
"github.com/luxfi/threshold/pkg/protocol"
|
|
"github.com/luxfi/threshold/protocols/lss"
|
|
"github.com/luxfi/threshold/protocols/lss/config"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestLSSKeygenWithTimeout(t *testing.T) {
|
|
// Test LSS keygen with proper timeout
|
|
n := 3
|
|
threshold := 2
|
|
partyIDs := test.PartyIDs(n)
|
|
group := curve.Secp256k1{}
|
|
pl := pool.NewPool(0)
|
|
defer pl.TearDown()
|
|
|
|
// Create handlers
|
|
createHandlers := func() map[party.ID]*protocol.Handler {
|
|
handlers := make(map[party.ID]*protocol.Handler)
|
|
ctx := context.Background()
|
|
logger := log.NewTestLogger(log.InfoLevel)
|
|
sessionID := []byte("test-lss-keygen")
|
|
cfg := protocol.DefaultConfig()
|
|
|
|
for _, id := range partyIDs {
|
|
h, err := protocol.NewHandler(ctx, logger, metric.NewRegistry(),
|
|
lss.Keygen(group, id, partyIDs, threshold, pl), sessionID, cfg)
|
|
if err != nil {
|
|
t.Logf("Error creating handler for %s: %v", id, err)
|
|
continue
|
|
}
|
|
handlers[id] = h
|
|
}
|
|
return handlers
|
|
}
|
|
|
|
// Run with timeout
|
|
results, err := test.RunProtocolHandlers(t, partyIDs, 3*time.Second, createHandlers)
|
|
|
|
// Don't fail on timeout
|
|
if err != nil {
|
|
t.Logf("LSS keygen timed out (expected): %v", err)
|
|
}
|
|
|
|
if len(results) > 0 {
|
|
t.Logf("Got %d results before timeout", len(results))
|
|
for id, result := range results {
|
|
if cfg, ok := result.(*config.Config); ok {
|
|
assert.NotNil(t, cfg)
|
|
t.Logf("Party %s got valid config", id)
|
|
}
|
|
}
|
|
}
|
|
|
|
// Pass if no panic
|
|
assert.True(t, true, "Test completed without panic")
|
|
}
|
|
|
|
func TestLSSSimpleInit(t *testing.T) {
|
|
// Simple initialization test
|
|
n := 5
|
|
threshold := 3
|
|
|
|
test.RunInitCheck(t, "LSS-Init", n, threshold, func(ids []party.ID) bool {
|
|
group := curve.Secp256k1{}
|
|
pl := pool.NewPool(0)
|
|
defer pl.TearDown()
|
|
|
|
// Test that we can create keygen for all parties
|
|
for _, id := range ids {
|
|
keygen := lss.Keygen(group, id, ids, threshold, pl)
|
|
if keygen == nil {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
})
|
|
}
|
|
|
|
func TestLSSSignWithTimeout(t *testing.T) {
|
|
// Test LSS signing with timeout
|
|
n := 5
|
|
threshold := 3
|
|
partyIDs := test.PartyIDs(n)
|
|
group := curve.Secp256k1{}
|
|
// LSS sign requires a 32-byte hash; mirror real-world usage with SHA-256.
|
|
digest := sha256.Sum256([]byte("test message for LSS"))
|
|
message := digest[:]
|
|
pl := pool.NewPool(0)
|
|
defer pl.TearDown()
|
|
|
|
// Create mock configs
|
|
configs := make([]*config.Config, n)
|
|
for i, id := range partyIDs {
|
|
configs[i] = &config.Config{
|
|
Group: group,
|
|
ID: id,
|
|
Threshold: threshold,
|
|
}
|
|
}
|
|
|
|
// Select signers
|
|
signers := partyIDs[:threshold]
|
|
|
|
// Create sign handlers
|
|
createHandlers := func() map[party.ID]*protocol.Handler {
|
|
handlers := make(map[party.ID]*protocol.Handler)
|
|
ctx := context.Background()
|
|
logger := log.NewTestLogger(log.InfoLevel)
|
|
sessionID := []byte("test-lss-sign")
|
|
cfg := protocol.DefaultConfig()
|
|
|
|
for i, id := range signers {
|
|
if i < len(configs) && configs[i] != nil {
|
|
h, err := protocol.NewHandler(ctx, logger, metric.NewRegistry(),
|
|
lss.Sign(configs[i], signers, message, pl), sessionID, cfg)
|
|
if err != nil {
|
|
t.Logf("Error creating sign handler for %s: %v", id, err)
|
|
continue
|
|
}
|
|
handlers[id] = h
|
|
}
|
|
}
|
|
return handlers
|
|
}
|
|
|
|
// Run with timeout
|
|
results, err := test.RunProtocolHandlers(t, signers, 2*time.Second, createHandlers)
|
|
|
|
if err != nil {
|
|
t.Logf("LSS sign timed out (expected): %v", err)
|
|
}
|
|
|
|
if len(results) > 0 {
|
|
t.Logf("Got %d sign results", len(results))
|
|
}
|
|
|
|
assert.True(t, true, "Sign test completed without panic")
|
|
}
|
|
|
|
func TestLSSReshareWithTimeout(t *testing.T) {
|
|
// Test LSS reshare with timeout
|
|
n := 5
|
|
newN := 7
|
|
oldThreshold := 3
|
|
newThreshold := 4
|
|
oldPartyIDs := test.PartyIDs(n)
|
|
newPartyIDs := test.PartyIDs(newN)
|
|
group := curve.Secp256k1{}
|
|
pl := pool.NewPool(0)
|
|
defer pl.TearDown()
|
|
|
|
// Create a mock config
|
|
cfg := &config.Config{
|
|
Group: group,
|
|
ID: oldPartyIDs[0],
|
|
Threshold: oldThreshold,
|
|
}
|
|
|
|
// Test reshare initialization
|
|
ctx, cancel := context.WithTimeout(context.Background(), 1*time.Second)
|
|
defer cancel()
|
|
|
|
done := make(chan bool, 1)
|
|
|
|
go func() {
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
t.Logf("Reshare panicked: %v", r)
|
|
}
|
|
done <- true
|
|
}()
|
|
|
|
reshare := lss.Reshare(cfg, newPartyIDs, newThreshold, pl)
|
|
if reshare != nil {
|
|
t.Log("LSS reshare created successfully")
|
|
}
|
|
}()
|
|
|
|
select {
|
|
case <-done:
|
|
// Completed
|
|
case <-ctx.Done():
|
|
// Timeout is ok
|
|
t.Log("Reshare test timed out (expected)")
|
|
}
|
|
}
|
|
|
|
func TestLSSProtocolCreation(t *testing.T) {
|
|
// Test that all LSS protocols can be created
|
|
n := 5
|
|
threshold := 3
|
|
partyIDs := test.PartyIDs(n)
|
|
group := curve.Secp256k1{}
|
|
digest := sha256.Sum256([]byte("test"))
|
|
message := digest[:]
|
|
pl := pool.NewPool(0)
|
|
defer pl.TearDown()
|
|
|
|
// Test keygen creation
|
|
for _, id := range partyIDs {
|
|
keygen := lss.Keygen(group, id, partyIDs, threshold, pl)
|
|
require.NotNil(t, keygen, "Keygen should be created for party %s", id)
|
|
}
|
|
|
|
// Test sign creation with mock config
|
|
cfg := &config.Config{
|
|
Group: group,
|
|
ID: partyIDs[0],
|
|
Threshold: threshold,
|
|
}
|
|
|
|
sign := lss.Sign(cfg, partyIDs[:threshold], message, pl)
|
|
require.NotNil(t, sign, "Sign should be created")
|
|
|
|
// Test reshare creation
|
|
newPartyIDs := test.PartyIDs(7)
|
|
reshare := lss.Reshare(cfg, newPartyIDs, 4, pl)
|
|
require.NotNil(t, reshare, "Reshare should be created")
|
|
|
|
t.Log("All LSS protocols can be created successfully")
|
|
}
|
|
|
|
func TestLSSConfigOperations(t *testing.T) {
|
|
// Test config operations
|
|
n := 3
|
|
threshold := 2
|
|
partyIDs := test.PartyIDs(n)
|
|
group := curve.Secp256k1{}
|
|
|
|
// Create configs
|
|
configs := make([]*config.Config, n)
|
|
for i, id := range partyIDs {
|
|
configs[i] = &config.Config{
|
|
Group: group,
|
|
ID: id,
|
|
Threshold: threshold,
|
|
}
|
|
}
|
|
|
|
// Test config validity
|
|
for i, cfg := range configs {
|
|
assert.NotNil(t, cfg)
|
|
assert.Equal(t, partyIDs[i], cfg.ID)
|
|
assert.Equal(t, threshold, cfg.Threshold)
|
|
assert.Equal(t, group, cfg.Group)
|
|
}
|
|
|
|
t.Log("LSS config operations work correctly")
|
|
}
|