2025-07-07 11:25:58 -04:00
|
|
|
package varsig_test
|
|
|
|
|
|
|
|
|
|
import (
|
2025-07-23 10:58:51 +02:00
|
|
|
"encoding/hex"
|
2025-07-07 11:25:58 -04:00
|
|
|
"testing"
|
|
|
|
|
|
2025-07-23 10:58:51 +02:00
|
|
|
"github.com/stretchr/testify/require"
|
2025-07-07 11:25:58 -04:00
|
|
|
|
2025-07-08 08:23:30 -04:00
|
|
|
"github.com/ucan-wg/go-varsig"
|
2025-07-07 11:25:58 -04:00
|
|
|
)
|
|
|
|
|
|
2025-07-23 10:58:51 +02:00
|
|
|
func TestRoundTrip(t *testing.T) {
|
|
|
|
|
for _, tc := range []struct {
|
|
|
|
|
name string
|
|
|
|
|
varsig varsig.Varsig
|
|
|
|
|
dataHex string
|
|
|
|
|
dataBytes []byte
|
|
|
|
|
}{
|
|
|
|
|
// Arbitrary use of presets
|
|
|
|
|
{
|
|
|
|
|
name: "Ed25519",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.Ed25519(varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401ed01ed011371",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "Ed448",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.Ed448(varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401ed0183241971",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "RS256",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.RS256(0x100, varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401852412800271",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "RS384",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.RS384(0x100, varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401852420800271",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "RS512",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.RS512(0x100, varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401852413800271",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "ES256",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.ES256(varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401ec0180241271",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "ES256K",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.ES256K(varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401ec01e7011271",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "ES384",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.ES384(varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401ec0181242071",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "ES512",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.ES512(varsig.PayloadEncodingDAGCBOR),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataHex: "3401ec0182241371",
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "EIP191",
|
2025-07-24 13:53:03 +02:00
|
|
|
varsig: must(varsig.EIP191(varsig.PayloadEncodingEIP191Raw)),
|
|
|
|
|
dataHex: "3401ec01e7011b91c3035f",
|
2025-07-23 10:58:51 +02:00
|
|
|
},
|
|
|
|
|
|
|
|
|
|
// from https://github.com/hugomrdias/iso-repo/blob/main/packages/iso-ucan/test/varsig.test.js
|
|
|
|
|
{
|
|
|
|
|
name: "RS256+RAW",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.RS256(256, varsig.PayloadEncodingVerbatim),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataBytes: []byte{52, 1, 133, 36, 18, 128, 2, 95},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "ES256+RAW",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.ES256(varsig.PayloadEncodingVerbatim),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataBytes: []byte{52, 1, 236, 1, 128, 36, 18, 95},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "ES512+RAW",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.ES512(varsig.PayloadEncodingVerbatim),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataBytes: []byte{52, 1, 236, 1, 130, 36, 19, 95},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "ES256K+RAW",
|
2025-07-28 18:40:45 +02:00
|
|
|
varsig: varsig.ES256K(varsig.PayloadEncodingVerbatim),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataBytes: []byte{52, 1, 236, 1, 231, 1, 18, 95},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "EIP191+RAW",
|
2025-07-24 13:53:03 +02:00
|
|
|
varsig: must(varsig.EIP191(varsig.PayloadEncodingEIP191Raw)),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataBytes: []byte{52, 1, 236, 1, 231, 1, 27, 145, 195, 3, 95},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "EIP191+DAG-CBOR",
|
2025-07-24 13:53:03 +02:00
|
|
|
varsig: must(varsig.EIP191(varsig.PayloadEncodingEIP191Cbor)),
|
2025-07-23 10:58:51 +02:00
|
|
|
dataBytes: []byte{52, 1, 236, 1, 231, 1, 27, 145, 195, 3, 113},
|
|
|
|
|
},
|
|
|
|
|
} {
|
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
|
// round-trip encode and back
|
|
|
|
|
data := tc.varsig.Encode()
|
|
|
|
|
|
|
|
|
|
if tc.dataBytes != nil {
|
|
|
|
|
require.Equal(t, tc.dataBytes, data)
|
|
|
|
|
}
|
|
|
|
|
if tc.dataHex != "" {
|
|
|
|
|
require.Equal(t, tc.dataHex, hex.EncodeToString(data))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rt, err := varsig.Decode(data)
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
|
|
|
|
|
require.Equal(t, tc.varsig.Version(), rt.Version())
|
2025-08-05 15:35:12 +02:00
|
|
|
require.Equal(t, tc.varsig.Algorithm(), rt.Algorithm())
|
2025-07-23 10:58:51 +02:00
|
|
|
require.Equal(t, tc.varsig.PayloadEncoding(), rt.PayloadEncoding())
|
|
|
|
|
|
|
|
|
|
switch vs := tc.varsig.(type) {
|
|
|
|
|
case varsig.EdDSAVarsig:
|
|
|
|
|
rt := rt.(varsig.EdDSAVarsig)
|
|
|
|
|
require.Equal(t, vs.Curve(), rt.Curve())
|
|
|
|
|
require.Equal(t, vs.Hash(), rt.Hash())
|
|
|
|
|
case varsig.ECDSAVarsig:
|
|
|
|
|
rt := rt.(varsig.ECDSAVarsig)
|
|
|
|
|
require.Equal(t, vs.Curve(), rt.Curve())
|
|
|
|
|
require.Equal(t, vs.Hash(), rt.Hash())
|
|
|
|
|
case varsig.RSAVarsig:
|
|
|
|
|
rt := rt.(varsig.RSAVarsig)
|
|
|
|
|
require.Equal(t, vs.Hash(), rt.Hash())
|
|
|
|
|
require.Equal(t, vs.KeyLength(), rt.KeyLength())
|
|
|
|
|
default:
|
|
|
|
|
t.Fatalf("unexpected varsig type: %T", vs)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
2025-07-07 15:42:11 -04:00
|
|
|
}
|
|
|
|
|
|
2025-07-23 10:58:51 +02:00
|
|
|
func must[T any](v T, err error) T {
|
|
|
|
|
if err != nil {
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
return v
|
2025-07-07 11:25:58 -04:00
|
|
|
}
|