github.com/storacha/go-ucanto@v0.7.2/ucan/lib_test.go (about)

     1  package ucan_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/ipld/go-ipld-prime"
     7  	"github.com/ipld/go-ipld-prime/datamodel"
     8  	"github.com/ipld/go-ipld-prime/node/basicnode"
     9  	"github.com/storacha/go-ucanto/core/ipld/codec/cbor"
    10  	"github.com/storacha/go-ucanto/principal/ed25519/signer"
    11  	"github.com/storacha/go-ucanto/testing/fixtures"
    12  	"github.com/storacha/go-ucanto/testing/helpers"
    13  	"github.com/storacha/go-ucanto/ucan"
    14  	pdm "github.com/storacha/go-ucanto/ucan/datamodel/payload"
    15  	udm "github.com/storacha/go-ucanto/ucan/datamodel/ucan"
    16  	"github.com/storacha/go-ucanto/ucan/formatter"
    17  	"github.com/stretchr/testify/require"
    18  )
    19  
    20  func TestDatamodel(t *testing.T) {
    21  	t.Run("nil caveats", func(t *testing.T) {
    22  		issuer, err := signer.Generate()
    23  		require.NoError(t, err)
    24  
    25  		audience, err := signer.Generate()
    26  		require.NoError(t, err)
    27  
    28  		caps := []udm.CapabilityModel{{
    29  			With: issuer.DID().String(),
    30  			Can:  "test/nilcaveats",
    31  		}}
    32  
    33  		payload := pdm.PayloadModel{
    34  			Iss: issuer.DID().String(),
    35  			Aud: audience.DID().String(),
    36  			Att: caps,
    37  			Prf: []string{},
    38  			Fct: []udm.FactModel{},
    39  		}
    40  
    41  		sigPayload, err := formatter.FormatSignPayload(payload, "0.9.1", issuer.SignatureAlgorithm())
    42  		require.NoError(t, err)
    43  
    44  		model := udm.UCANModel{
    45  			V:   "0.9.1",
    46  			S:   issuer.Sign([]byte(sigPayload)).Bytes(),
    47  			Iss: issuer.DID().Bytes(),
    48  			Aud: audience.DID().Bytes(),
    49  			Att: caps,
    50  			Prf: []ipld.Link{},
    51  			Fct: []udm.FactModel{},
    52  		}
    53  
    54  		bytes, err := cbor.Encode(&model, udm.Type())
    55  		require.NoError(t, err)
    56  
    57  		var decoded udm.UCANModel
    58  		err = cbor.Decode(bytes, &decoded, udm.Type())
    59  		require.NoError(t, err)
    60  		require.Equal(t, model.Att, decoded.Att)
    61  	})
    62  }
    63  
    64  type testCaveats struct {
    65  	SomeCaveat string
    66  }
    67  
    68  func (c testCaveats) ToIPLD() (datamodel.Node, error) {
    69  	np := basicnode.Prototype.Any
    70  	nb := np.NewBuilder()
    71  	ma, _ := nb.BeginMap(1)
    72  	if c.SomeCaveat != "" {
    73  		ma.AssembleKey().AssignString("someCaveat")
    74  		ma.AssembleValue().AssignString(c.SomeCaveat)
    75  	}
    76  	ma.Finish()
    77  	return nb.Build(), nil
    78  }
    79  
    80  type testFacts struct {
    81  	SomeFact string
    82  }
    83  
    84  func (f testFacts) ToIPLD() (map[string]datamodel.Node, error) {
    85  	np := basicnode.Prototype.Any
    86  	nb := np.NewBuilder()
    87  	ma, _ := nb.BeginMap(1)
    88  	if f.SomeFact != "" {
    89  		ma.AssembleKey().AssignString("someFact")
    90  		ma.AssembleValue().AssignString(f.SomeFact)
    91  	}
    92  	ma.Finish()
    93  	return map[string]datamodel.Node{"fact": nb.Build()}, nil
    94  }
    95  
    96  func TestVerifySignature(t *testing.T) {
    97  	cap := ucan.NewCapability(
    98  		"test/capability",
    99  		fixtures.Alice.DID().String(),
   100  		testCaveats{SomeCaveat: "some caveat"},
   101  	)
   102  
   103  	fact := testFacts{SomeFact: "some fact"}
   104  
   105  	// use all available fields to ensure they are all included in the signature
   106  	u, err := ucan.Issue(
   107  		fixtures.Alice,
   108  		fixtures.Bob,
   109  		[]ucan.Capability[testCaveats]{cap},
   110  		ucan.WithExpiration(ucan.Now()+30),
   111  		ucan.WithNonce("1234567890"),
   112  		ucan.WithNotBefore(ucan.Now()-30),
   113  		ucan.WithFacts([]ucan.FactBuilder{fact}),
   114  		ucan.WithProof(helpers.RandomCID()),
   115  	)
   116  	require.NoError(t, err)
   117  
   118  	valid, err := ucan.VerifySignature(u, fixtures.Alice.Verifier())
   119  	require.NoError(t, err)
   120  	require.True(t, valid)
   121  }