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 }