122 lines
2.8 KiB
Go
122 lines
2.8 KiB
Go
package envelope_test
|
|
|
|
import (
|
|
_ "embed"
|
|
"encoding/base64"
|
|
"fmt"
|
|
"sync"
|
|
"testing"
|
|
|
|
"code.sonr.org/go/did-it/crypto"
|
|
"code.sonr.org/go/did-it/crypto/ed25519"
|
|
"github.com/ipld/go-ipld-prime"
|
|
"github.com/ipld/go-ipld-prime/codec/dagcbor"
|
|
"github.com/ipld/go-ipld-prime/datamodel"
|
|
"github.com/ipld/go-ipld-prime/fluent/qp"
|
|
"github.com/ipld/go-ipld-prime/node/basicnode"
|
|
"github.com/ipld/go-ipld-prime/node/bindnode"
|
|
"github.com/ipld/go-ipld-prime/schema"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"code.sonr.org/go/ucan/token/internal/envelope"
|
|
)
|
|
|
|
const (
|
|
exampleCID = "zdpuAn4jksvc1gc9PLDqHw2NoFq8CBkRVTTo2xFuW2JUPS5DY"
|
|
exampleDID = "did:key:z6MkuqvEtTW9L1E91CY3GmL83muetLAA2h8A5fUHjJgqq2Ab"
|
|
exampleGreeting = "world"
|
|
examplePrivKeyB64 = "V4hh1lcFV43Y6vyOBEVOFTwl1XS/DR0F/kYcz5i6W/DkrUTG8yx09lOwSf36NCHPKSFYv/T1R3WKjNfndgVucA=="
|
|
exampleTag = "ucan/example@v1.0.0-rc.1"
|
|
|
|
invalidSignatureStr = "PZV6A2aI7n+MlyADqcqmWhkuyNrgUCDz+qSLSnI9bpasOwOhKUTx95m5Nu5CO/INa1LqzHGioD9+PVf6qdtTBK"
|
|
)
|
|
|
|
//go:embed testdata/example.ipldsch
|
|
var schemaBytes []byte
|
|
|
|
//go:embed testdata/example.dagcbor
|
|
var exampleDagCbor []byte
|
|
|
|
//go:embed testdata/example.dagjson
|
|
var exampleDagJson []byte
|
|
|
|
var (
|
|
once sync.Once
|
|
ts *schema.TypeSystem
|
|
errSchema error
|
|
)
|
|
|
|
func mustLoadSchema() *schema.TypeSystem {
|
|
once.Do(func() {
|
|
ts, errSchema = ipld.LoadSchemaBytes(schemaBytes)
|
|
})
|
|
|
|
if errSchema != nil {
|
|
panic(fmt.Errorf("failed to load IPLD schema: %s", errSchema))
|
|
}
|
|
|
|
return ts
|
|
}
|
|
|
|
func exampleType() schema.Type {
|
|
return mustLoadSchema().TypeByName("Example")
|
|
}
|
|
|
|
var _ envelope.Tokener = (*Example)(nil)
|
|
|
|
type Example struct {
|
|
Hello string
|
|
Issuer string
|
|
}
|
|
|
|
func newExample() *Example {
|
|
return &Example{
|
|
Hello: exampleGreeting,
|
|
Issuer: exampleDID,
|
|
}
|
|
}
|
|
|
|
func (e *Example) Prototype() schema.TypedPrototype {
|
|
return bindnode.Prototype(e, exampleType())
|
|
}
|
|
|
|
func (*Example) Tag() string {
|
|
return exampleTag
|
|
}
|
|
|
|
func examplePrivKey(t *testing.T) crypto.PrivateKeySigningBytes {
|
|
t.Helper()
|
|
|
|
privBytes, err := base64.StdEncoding.DecodeString(examplePrivKeyB64)
|
|
require.NoError(t, err)
|
|
|
|
privKey, err := ed25519.PrivateKeyFromBytes(privBytes)
|
|
require.NoError(t, err)
|
|
|
|
return privKey
|
|
}
|
|
|
|
// nodeWithInvalidSignature creates an IPLD node of a token, with an invalid signature
|
|
func nodeWithInvalidSignature(t *testing.T) datamodel.Node {
|
|
t.Helper()
|
|
|
|
invalidSig, err := base64.RawStdEncoding.DecodeString(invalidSignatureStr)
|
|
require.NoError(t, err)
|
|
|
|
cbor := exampleDagCbor
|
|
|
|
envelNode, err := ipld.Decode(cbor, dagcbor.Decode)
|
|
require.NoError(t, err)
|
|
|
|
sigPayloadNode, err := envelNode.LookupByIndex(1)
|
|
require.NoError(t, err)
|
|
|
|
node, err := qp.BuildList(basicnode.Prototype.Any, 2, func(la datamodel.ListAssembler) {
|
|
qp.ListEntry(la, qp.Bytes(invalidSig))
|
|
qp.ListEntry(la, qp.Node(sigPayloadNode))
|
|
})
|
|
require.NoError(t, err)
|
|
|
|
return node
|
|
}
|