README
¶
Unified MPC-LSS: Dynamic Threshold Signatures for ECDSA & EdDSA
Overview
A unified threshold signature protocol that combines Linear Secret Sharing (LSS) with support for both ECDSA and EdDSA/Schnorr signatures, featuring native dynamic resharing capabilities.
Architecture
Core Design Principles
- Signature Agnostic Core: The LSS resharing logic is independent of the signature algorithm
- Pluggable Signature Schemes: ECDSA and EdDSA implementations as separate modules
- Unified Config Structure: Single configuration supporting both signature types
- Dynamic Participant Management: Add/remove parties without changing public keys
Key Features
- Multi-Signature Support: ECDSA (secp256k1) and EdDSA (ed25519)
- Dynamic Resharing: Change threshold and participants on-the-fly
- Protocol Compatibility: Works alongside existing CMP and FROST implementations
- Efficient Operations: 2-round signing for both signature types
Technical Specification
Unified Configuration
type UnifiedConfig struct {
// Common fields
ID party.ID
Threshold int
Generation uint64
PartyIDs []party.ID
// Signature type
SignatureScheme SignatureType // ECDSA or EdDSA
// Curve-specific
Group curve.Curve // secp256k1 or ed25519
// Shared secrets (works for both)
SecretShare curve.Scalar
PublicKey curve.Point
// Additional ECDSA requirements (if needed)
ECDSAConfig *ECDSAExtensions
// Verification shares for all parties
VerificationShares map[party.ID]curve.Point
}
type SignatureType int
const (
SignatureECDSA SignatureType = iota
SignatureEdDSA
SignatureSchnorr
)
type ECDSAExtensions struct {
// Paillier keys for multiplication
PaillierKey *paillier.SecretKey
PedersenParams *pedersen.Parameters
// Additional ECDSA-specific fields
}
Protocol Flow
1. Key Generation (DKG)
Phase 1: Initial Share Distribution
- Each party generates polynomial f_i(x) with random secret
- Compute and broadcast commitments
- Distribute shares to all parties
Phase 2: Share Aggregation
- Verify received shares
- Compute final share as sum
- Derive public key collectively
Phase 3: Signature-Specific Setup
- For ECDSA: Generate Paillier keys, Pedersen parameters
- For EdDSA: Store verification shares only
2. Dynamic Resharing
Input: Old config, new parties, new threshold
Output: New config with same public key
Phase 1: Auxiliary Secret Generation (JVSS)
- Generate blinding factors w, q via JVSS
- All parties (old + new) participate
Phase 2: Blinded Share Transfer
- Old parties: send blinded shares a_i * w_i
- Interpolate to get a * w
Phase 3: Unblinding & Distribution
- Compute z = (q * w)^{-1}
- Distribute z shares to new parties
- New parties compute: a'_j = (a * w) * z_j * q_j
Phase 4: Signature-Specific Migration
- For ECDSA: Transfer/regenerate Paillier keys
- For EdDSA: Update verification shares
3. Signing
EdDSA/Schnorr (2 rounds):
Round 1: Nonce commitment
- Generate k_i, compute R_i = k_i * G
- Broadcast R_i
Round 2: Signature shares
- Aggregate R = Σ λ_i * R_i
- Compute challenge c = H(R, Y, m)
- Send z_i = k_i + c * λ_i * x_i
- Combine: z = Σ z_i
ECDSA (2-3 rounds with preprocessing):
Round 1: Multiplicative share generation
- Use Paillier for multiplication protocols
- Generate k_i shares
Round 2: Inverse computation
- Compute k^{-1} via MPC
- Calculate signature shares
Round 3: Combination
- Aggregate shares
- Output (r, s) signature
Implementation Structure
protocols/unified/
├── config/
│ ├── config.go # Unified configuration
│ └── extensions.go # Signature-specific extensions
├── keygen/
│ ├── dkg.go # Distributed key generation
│ └── rounds.go # DKG protocol rounds
├── reshare/
│ ├── reshare.go # Dynamic resharing protocol
│ ├── auxiliary.go # JVSS for auxiliary secrets
│ └── transfer.go # Share transfer logic
├── sign/
│ ├── ecdsa/
│ │ ├── presign.go # ECDSA preprocessing
│ │ └── sign.go # ECDSA signing
│ └── eddsa/
│ └── sign.go # EdDSA signing
└── tests/
└── unified_test.go # Comprehensive tests
Advantages
Over Separate Protocols
- Unified Management: Single system for all threshold signatures
- Code Reuse: Common resharing logic for both signature types
- Simplified Operations: One protocol to maintain and audit
Over Static Schemes
- Dynamic Adaptation: Adjust to changing security requirements
- Disaster Recovery: Replace compromised parties
- Operational Flexibility: Scale participants up or down
Compatibility Matrix
| Feature | Unified MPC-LSS | CMP (ECDSA) | FROST (EdDSA) | Original LSS |
|---|---|---|---|---|
| ECDSA Support | ✅ | ✅ | ❌ | ❌ |
| EdDSA Support | ✅ | ❌ | ✅ | ✅ |
| Dynamic Resharing | ✅ | ❌ | ❌ | ✅ |
| Threshold Change | ✅ | ❌ | ❌ | ✅ |
| Add/Remove Parties | ✅ | Limited | ❌ | ✅ |
| Signing Rounds | 2-3 | 5-8 | 2 | 2 |
| Identifiable Abort | ✅ | ✅ | ❌ | ✅ |
Security Considerations
Assumptions
- Honest majority (t < n/2)
- Secure channels between parties
- Random oracle model for hash functions
Additional ECDSA Security
- Paillier key generation security
- Range proofs for ECDSA operations
- Protection against bias in k generation
EdDSA Security
- Deterministic nonce generation option
- Canonical point encoding
- Protection against rogue key attacks
Migration Path
From FROST to Unified
- Export FROST config (private share, public key, verification shares)
- Create UnifiedConfig with SignatureEdDSA
- Run resharing protocol if needed
- Verify signatures match
From CMP to Unified
- Export CMP config (ECDSA share, Paillier keys)
- Create UnifiedConfig with SignatureECDSA
- Import Paillier and Pedersen parameters
- Run test signatures
Testing Strategy
- Unit tests for each component
- Integration tests for cross-signature resharing
- Stress tests with 100+ parties
- Byzantine fault injection tests
- Performance benchmarks for both signature types
Future Enhancements
- BLS Signatures: Add BLS12-381 support
- Threshold RSA: Extend to RSA signatures
- Post-Quantum: Integration with Ringtail
- Hardware Security: HSM integration
- Network Optimization: Reduce communication rounds
Click to show internal directories.
Click to hide internal directories.