mirror of
https://github.com/luxfi/mpc.git
synced 2026-09-24 00:26:24 +00:00
* Add comprehensive tests for multiple pkg * Add db_path to config * Add e2e testing pipeline * Add github workflow * Remove config.test.yaml * Fix lint issue * Increase timeout * Add e2e testing for signing * Skip signing if node is not in participant list * Code cleanup * Add e2e testing for signing and resharing * Increase timeout * Add test instructions * Update github workflow branching * Add vulnerabilties check in CI * Fix ci
169 lines
4.3 KiB
Go
169 lines
4.3 KiB
Go
package encoding
|
|
|
|
import (
|
|
"crypto/ecdsa"
|
|
"crypto/elliptic"
|
|
"crypto/rand"
|
|
"math/big"
|
|
"testing"
|
|
|
|
"github.com/decred/dcrd/dcrec/edwards/v2"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestEncodeS256PubKey(t *testing.T) {
|
|
// Generate a test ECDSA key pair
|
|
privateKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
|
|
require.NoError(t, err)
|
|
|
|
pubKey := &privateKey.PublicKey
|
|
|
|
// Test encoding
|
|
encoded, err := EncodeS256PubKey(pubKey)
|
|
require.NoError(t, err)
|
|
assert.NotEmpty(t, encoded)
|
|
|
|
// The encoded key should contain both X and Y coordinates appended together
|
|
xBytes := pubKey.X.Bytes()
|
|
yBytes := pubKey.Y.Bytes()
|
|
expectedLength := len(xBytes) + len(yBytes)
|
|
assert.Equal(t, expectedLength, len(encoded))
|
|
|
|
// Verify the encoded data contains the coordinates
|
|
assert.Equal(t, xBytes, encoded[:len(xBytes)])
|
|
assert.Equal(t, yBytes, encoded[len(xBytes):])
|
|
}
|
|
|
|
func TestEncodeS256PubKey_SpecificValues(t *testing.T) {
|
|
// Create a public key with specific values
|
|
x := big.NewInt(12345)
|
|
y := big.NewInt(67890)
|
|
pubKey := &ecdsa.PublicKey{
|
|
Curve: elliptic.P256(),
|
|
X: x,
|
|
Y: y,
|
|
}
|
|
|
|
encoded, err := EncodeS256PubKey(pubKey)
|
|
require.NoError(t, err)
|
|
|
|
// Verify the encoding - should be X bytes followed by Y bytes
|
|
xBytes := x.Bytes()
|
|
yBytes := y.Bytes()
|
|
expected := append(xBytes, yBytes...)
|
|
|
|
assert.Equal(t, expected, encoded)
|
|
}
|
|
|
|
func TestEncodeEDDSAPubKey(t *testing.T) {
|
|
// Generate a test EdDSA key pair using the correct API
|
|
privateKey, err := edwards.GeneratePrivateKey()
|
|
require.NoError(t, err)
|
|
|
|
pubKey := privateKey.PubKey()
|
|
|
|
// Test encoding
|
|
encoded, err := EncodeEDDSAPubKey(pubKey)
|
|
require.NoError(t, err)
|
|
assert.NotEmpty(t, encoded)
|
|
|
|
// EdDSA compressed public key should be 32 bytes (not 33 as initially assumed)
|
|
assert.Equal(t, 32, len(encoded))
|
|
}
|
|
|
|
func TestDecodeEDDSAPubKey(t *testing.T) {
|
|
// Generate a test EdDSA key pair
|
|
privateKey, err := edwards.GeneratePrivateKey()
|
|
require.NoError(t, err)
|
|
|
|
originalPubKey := privateKey.PubKey()
|
|
|
|
// Encode the public key
|
|
encoded, err := EncodeEDDSAPubKey(originalPubKey)
|
|
require.NoError(t, err)
|
|
|
|
// Decode the public key
|
|
decodedPubKey, err := DecodeEDDSAPubKey(encoded)
|
|
require.NoError(t, err)
|
|
assert.NotNil(t, decodedPubKey)
|
|
|
|
// Verify the decoded key matches the original by comparing serialized forms
|
|
originalSerialized := originalPubKey.SerializeCompressed()
|
|
decodedSerialized := decodedPubKey.SerializeCompressed()
|
|
assert.Equal(t, originalSerialized, decodedSerialized)
|
|
}
|
|
|
|
func TestDecodeEDDSAPubKey_InvalidData(t *testing.T) {
|
|
// Test with invalid data
|
|
invalidData := []byte("invalid key data")
|
|
|
|
_, err := DecodeEDDSAPubKey(invalidData)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestDecodeEDDSAPubKey_EmptyData(t *testing.T) {
|
|
// Test with empty data
|
|
emptyData := []byte{}
|
|
|
|
_, err := DecodeEDDSAPubKey(emptyData)
|
|
assert.Error(t, err)
|
|
}
|
|
|
|
func TestEncodeDecodeEDDSA_RoundTrip(t *testing.T) {
|
|
// Test multiple round trips to ensure consistency
|
|
for i := 0; i < 10; i++ {
|
|
// Generate a new key pair
|
|
privateKey, err := edwards.GeneratePrivateKey()
|
|
require.NoError(t, err)
|
|
|
|
originalPubKey := privateKey.PubKey()
|
|
|
|
// Encode
|
|
encoded, err := EncodeEDDSAPubKey(originalPubKey)
|
|
require.NoError(t, err)
|
|
|
|
// Decode
|
|
decodedPubKey, err := DecodeEDDSAPubKey(encoded)
|
|
require.NoError(t, err)
|
|
|
|
// Verify they match by comparing serialized forms
|
|
originalSerialized := originalPubKey.SerializeCompressed()
|
|
decodedSerialized := decodedPubKey.SerializeCompressed()
|
|
assert.Equal(t, originalSerialized, decodedSerialized, "Round trip %d failed", i)
|
|
}
|
|
}
|
|
|
|
func TestEncodeS256PubKey_NilPublicKey(t *testing.T) {
|
|
// Test with nil public key - this should panic or return an error
|
|
// depending on the implementation
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
// Expected panic due to nil pointer
|
|
t.Log("Correctly panicked on nil public key")
|
|
}
|
|
}()
|
|
|
|
_, err := EncodeS256PubKey(nil)
|
|
if err == nil {
|
|
t.Error("Expected error or panic with nil public key")
|
|
}
|
|
}
|
|
|
|
func TestEncodeS256PubKey_ZeroCoordinates(t *testing.T) {
|
|
// Test with zero coordinates
|
|
x := big.NewInt(0)
|
|
y := big.NewInt(0)
|
|
pubKey := &ecdsa.PublicKey{
|
|
Curve: elliptic.P256(),
|
|
X: x,
|
|
Y: y,
|
|
}
|
|
|
|
encoded, err := EncodeS256PubKey(pubKey)
|
|
require.NoError(t, err)
|
|
|
|
// Should still work, though the result will be a very short byte array
|
|
assert.NotNil(t, encoded)
|
|
}
|