Repository: TBD54566975/ssi-service
Pull request #385 (2023-04-20 01:19:46)

Uptake latest SSI SDK
Uptake https://github.com/TBD54566975/ssi-sdk/commit/6d87cd19531450238b82e48f731f4ff7dff9e2e4

codecov-commenter: ## [Codecov](https://codecov.io/gh/TBD54566975/ssi-service/pull/385?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) Report
> Merging [#385](https://codecov.io/gh/TBD54566975/ssi-service/pull/385?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) (a1bc20d) into [main](https://codecov.io/gh/TBD54566975/ssi-service/commit/8aac18d61613cd90ef180aa337e29f8f6cac0f29?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) (8aac18d) will **not change** coverage.
> The diff coverage is `76.92%`.

```diff
@@           Coverage Diff           @@
##             main     #385   +/-   ##
=======================================
  Coverage   20.42%   20.42%           
=======================================
  Files          48       48           
  Lines        5376     5376           
=======================================
  Hits         1098     1098           
  Misses       4114     4114           
  Partials      164      164           
```


| [Impacted Files](https://codecov.io/gh/TBD54566975/ssi-service/pull/385?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975) | Coverage Δ | |
|---|---|---|
| [pkg/server/router/manifest.go](https://codecov.io/gh/TBD54566975/ssi-service/pull/385?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZlci9yb3V0ZXIvbWFuaWZlc3QuZ28=) | `9.96% <ø> (ø)` | |
| [pkg/server/router/presentation.go](https://codecov.io/gh/TBD54566975/ssi-service/pull/385?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZlci9yb3V0ZXIvcHJlc2VudGF0aW9uLmdv) | `3.46% <0.00%> (ø)` | |
| [pkg/service/credential/storage.go](https://codecov.io/gh/TBD54566975/ssi-service/pull/385?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-cGtnL3NlcnZpY2UvY3JlZGVudGlhbC9zdG9yYWdlLmdv) | `1.68% <0.00%> (ø)` | |
| [internal/keyaccess/jwt.go](https://codecov.io/gh/TBD54566975/ssi-service/pull/385?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-aW50ZXJuYWwva2V5YWNjZXNzL2p3dC5nbw==) | `44.62% <90.00%> (ø)` | |
| [internal/keyaccess/dataintegrity.go](https://codecov.io/gh/TBD54566975/ssi-service/pull/385?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975#diff-aW50ZXJuYWwva2V5YWNjZXNzL2RhdGFpbnRlZ3JpdHkuZ28=) | `59.09% <100.00%> (ø)` | |

Help us with your feedback. Take ten seconds to tell us [how you rate us](https://about.codecov.io/nps?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975). Have a feature suggestion? [Share it here.](https://app.codecov.io/gh/feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=TBD54566975)


Patch:
diff --git a/go.mod b/go.mod
index 92a2115..f018054 100644
--- a/go.mod
+++ b/go.mod
@@ -4,7 +4,7 @@ go 1.20
 
 require (
 	github.com/BurntSushi/toml v1.2.1
-	github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230410220001-cbd9818e8367
+	github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230420000447-6d87cd195314
 	github.com/alicebob/miniredis/v2 v2.30.2
 	github.com/ardanlabs/conf v1.5.0
 	github.com/benbjohnson/clock v1.3.3
@@ -47,14 +47,14 @@ require (
 	github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 // indirect
 	github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df // indirect
 	github.com/asaskevich/govalidator v0.0.0-20200428143746-21a406dcc535 // indirect
-	github.com/bits-and-blooms/bitset v1.5.0 // indirect
+	github.com/bits-and-blooms/bitset v1.6.0 // indirect
 	github.com/btcsuite/btcd/btcec/v2 v2.3.2 // indirect
 	github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 // indirect
 	github.com/cespare/xxhash/v2 v2.2.0 // indirect
 	github.com/cristalhq/jwt/v4 v4.0.2 // indirect
 	github.com/dave/jennifer v1.4.0 // indirect
 	github.com/davecgh/go-spew v1.1.1 // indirect
-	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 // indirect
+	github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect
 	github.com/dgraph-io/ristretto v0.0.3 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/dustin/go-humanize v1.0.0 // indirect
@@ -73,7 +73,7 @@ require (
 	github.com/hashicorp/go-cleanhttp v0.5.1 // indirect
 	github.com/hashicorp/go-retryablehttp v0.6.8 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
-	github.com/hyperledger/aries-framework-go v0.1.9 // indirect
+	github.com/hyperledger/aries-framework-go v0.2.0 // indirect
 	github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e // indirect
 	github.com/inconshreveable/mousetrap v1.0.0 // indirect
 	github.com/kilic/bls12-381 v0.1.1-0.20210503002446-7b7597926c69 // indirect
@@ -106,7 +106,7 @@ require (
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/pquerna/cachecontrol v0.1.0 // indirect
 	github.com/redis/go-redis/extra/rediscmd/v9 v9.0.2 // indirect
-	github.com/santhosh-tekuri/jsonschema/v5 v5.2.0 // indirect
+	github.com/santhosh-tekuri/jsonschema/v5 v5.3.0 // indirect
 	github.com/spaolacci/murmur3 v1.1.0 // indirect
 	github.com/spf13/afero v1.3.2 // indirect
 	github.com/spf13/cast v1.3.2-0.20200723214538-8d17101741c8 // indirect
diff --git a/go.sum b/go.sum
index 4ff27c2..2c0d27c 100644
--- a/go.sum
+++ b/go.sum
@@ -29,6 +29,8 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX
 github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI=
 github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230410220001-cbd9818e8367 h1:dYkvkaLS7fLBPy06PDal2DZBHYiD79Z//1sOjaojR1U=
 github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230410220001-cbd9818e8367/go.mod h1:Ro9+HDADuYcLnCYKIL8pu92XWITKetTPOqfwLThplO0=
+github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230420000447-6d87cd195314 h1:UJOrdjU6FwwpYe/1vOjCop/3vE8IaHEwM2iaF1738JU=
+github.com/TBD54566975/ssi-sdk v0.0.3-alpha.0.20230420000447-6d87cd195314/go.mod h1:7FXpy1tc6eGLx39H4J5KlZ7MNre1isAbyKab4JtuCPs=
 github.com/ajg/form v0.0.0-20160822230020-523a5da1a92f/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY=
 github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
@@ -57,6 +59,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 github.com/bits-and-blooms/bitset v1.5.0 h1:NpE8frKRLGHIcEzkR+gZhiioW1+WbYV6fKwD6ZIpQT8=
 github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
+github.com/bits-and-blooms/bitset v1.6.0 h1:FVfaUsleKAUTJnaN9Fd1YFFi1S8vAX5xeXnXHFYOojM=
+github.com/bits-and-blooms/bitset v1.6.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA=
 github.com/bmatcuk/doublestar/v2 v2.0.3/go.mod h1:QMmcs3H2AUQICWhfzLXz+IYln8lRQmTZRptLie8RgRw=
 github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
 github.com/bsm/ginkgo/v2 v2.5.0/go.mod h1:AiKlXPm7ItEHNc/2+OkrNG4E0ITzojb9/xWzvQ9XZ9w=
@@ -116,9 +120,12 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
 github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
+github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y=
 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE=
 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0 h1:HbphB4TFFXpv7MNrT52FGrrgVXF1owhMVTHFZIlnvd4=
 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.1.0/go.mod h1:DZGJHZMqrU4JJqFAWUS2UO1+lbSKsdiOoYi9Zzey7Fc=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs=
+github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0=
 github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA=
 github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw=
@@ -587,6 +594,8 @@ github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/hyperledger/aries-framework-go v0.1.9 h1:qwfjV/zGaH745AMyQwpL3296uRCbM3sJPVFzgW7EBWk=
 github.com/hyperledger/aries-framework-go v0.1.9/go.mod h1:qrOxEGVsu8M2RahaJgM8nz9AcAHjR/dKd1JIJ3ieJhY=
+github.com/hyperledger/aries-framework-go v0.2.0 h1:N654d2MJBmm9IFMJ4VQi5h9suKh+04cvAfRTI3o/05o=
+github.com/hyperledger/aries-framework-go v0.2.0/go.mod h1:qrOxEGVsu8M2RahaJgM8nz9AcAHjR/dKd1JIJ3ieJhY=
 github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e h1:SxbXlF39661T9w/L9PhVdtbJfJ51Pm4JYEEW6XfZHEQ=
 github.com/hyperledger/aries-framework-go/spi v0.0.0-20221025204933-b807371b6f1e/go.mod h1:oryUyWb23l/a3tAP9KW+GBbfcfqp9tZD4y5hSkFrkqI=
 github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
@@ -932,6 +941,8 @@ github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHi
 github.com/santhosh-tekuri/jsonschema/v2 v2.1.0/go.mod h1:yzJzKUGV4RbWqWIBBP4wSOBqavX5saE02yirLS0OTyg=
 github.com/santhosh-tekuri/jsonschema/v5 v5.2.0 h1:WCcC4vZDS1tYNxjWlwRJZQy28r8CMoggKnxNzxsVDMQ=
 github.com/santhosh-tekuri/jsonschema/v5 v5.2.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0=
+github.com/santhosh-tekuri/jsonschema/v5 v5.3.0 h1:uIkTLo0AGRc8l7h5l9r+GcYi9qfVPt6lD4/bhmzfiKo=
+github.com/santhosh-tekuri/jsonschema/v5 v5.3.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0=
 github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
 github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210219220335-367fa274be2c/go.mod h1:/THDZYi7F/BsVEcYzYPqdcWFQ+1C2InkawTKfLOAnzg=
 github.com/segmentio/analytics-go v3.0.1+incompatible/go.mod h1:C7CYBtQWk4vRk2RyLu0qOcbHJ18E3F1HV2C/8JvKN48=
diff --git a/internal/credential/model.go b/internal/credential/model.go
index f0fec06..f0da96f 100644
--- a/internal/credential/model.go
+++ b/internal/credential/model.go
@@ -5,7 +5,6 @@ import (
 	"reflect"
 
 	"github.com/TBD54566975/ssi-sdk/credential"
-	"github.com/TBD54566975/ssi-sdk/credential/signing"
 	"github.com/goccy/go-json"
 	"github.com/pkg/errors"
 
@@ -46,7 +45,7 @@ func (c Container) HasJWTCredential() bool {
 
 // NewCredentialContainerFromJWT attempts to parse a VC-JWT credential from a string into a Container
 func NewCredentialContainerFromJWT(credentialJWT string) (*Container, error) {
-	_, _, cred, err := signing.ParseVerifiableCredentialFromJWT(credentialJWT)
+	_, _, cred, err := credential.ToCredential(credentialJWT)
 	if err != nil {
 		return nil, errors.Wrap(err, "could not parse credential from JWT")
 	}
@@ -60,17 +59,13 @@ func NewCredentialContainerFromJWT(credentialJWT string) (*Container, error) {
 // NewCredentialContainerFromMap attempts to parse a data integrity credential from a piece of JSON,
 // which is represented as a map in go, into a Container
 func NewCredentialContainerFromMap(credMap map[string]any) (*Container, error) {
-	var cred credential.VerifiableCredential
-	credMapBytes, err := json.Marshal(credMap)
+	_, _, cred, err := credential.ToCredential(credMap)
 	if err != nil {
-		return nil, errors.Wrap(err, "could not marshal credential map")
-	}
-	if err = json.Unmarshal(credMapBytes, &cred); err != nil {
-		return nil, errors.Wrap(err, "could not unmarshal credential map")
+		return nil, errors.Wrap(err, "could not parse credential from map")
 	}
 	container := Container{
 		ID:         cred.ID,
-		Credential: &cred,
+		Credential: cred,
 	}
 	if container.HasDataIntegrityCredential() {
 		return &container, nil
diff --git a/internal/credential/verification.go b/internal/credential/verification.go
index cc8c241..7e52edb 100644
--- a/internal/credential/verification.go
+++ b/internal/credential/verification.go
@@ -5,7 +5,6 @@ import (
 	"fmt"
 
 	credsdk "github.com/TBD54566975/ssi-sdk/credential"
-	"github.com/TBD54566975/ssi-sdk/credential/signing"
 	"github.com/TBD54566975/ssi-sdk/credential/verification"
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
@@ -35,7 +34,7 @@ func NewCredentialVerifier(didResolver didsdk.Resolver, schemaResolver schema.Re
 		return nil, errors.New("schemaResolver cannot be nil")
 	}
 	// TODO(gabe): consider making this configurable
-	verifiers := verification.KnownVerifiers
+	verifiers := verification.GetKnownVerifiers()
 	verifier, err := verification.NewCredentialVerifier(verifiers)
 	if err != nil {
 		return nil, errors.Wrap(err, "failed to create static credential verifier")
@@ -53,7 +52,7 @@ func NewCredentialVerifier(didResolver didsdk.Resolver, schemaResolver schema.Re
 // a set of static verification checks on the credential as per the credential service's configuration.
 func (v Verifier) VerifyJWTCredential(ctx context.Context, token keyaccess.JWT) error {
 	// first, parse the token to see if it contains a valid verifiable credential
-	gotHeaders, _, cred, err := signing.ParseVerifiableCredentialFromJWT(token.String())
+	gotHeaders, _, cred, err := credsdk.ParseVerifiableCredentialFromJWT(token.String())
 	if err != nil {
 		return sdkutil.LoggingErrorMsg(err, "could not parse credential from JWT")
 	}
@@ -180,7 +179,7 @@ func (v Verifier) VerifyJWT(ctx context.Context, did string, token keyaccess.JWT
 // service's configuration, such as checking the credential's schema, expiration, and object validity.
 func (v Verifier) staticVerificationChecks(ctx context.Context, credential credsdk.VerifiableCredential) error {
 	// if the credential has a schema, resolve it before it is to be used in verification
-	var verificationOpts []verification.VerificationOption
+	var verificationOpts []verification.Option
 	if credential.CredentialSchema != nil {
 		schemaID := credential.CredentialSchema.ID
 		resolvedSchema, err := v.schemaResolver.Resolve(ctx, schemaID)
diff --git a/internal/keyaccess/dataintegrity.go b/internal/keyaccess/dataintegrity.go
index 442a6e8..7c9b351 100644
--- a/internal/keyaccess/dataintegrity.go
+++ b/internal/keyaccess/dataintegrity.go
@@ -3,6 +3,7 @@ package keyaccess
 import (
 	gocrypto "crypto"
 
+	"github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	"github.com/TBD54566975/ssi-sdk/cryptosuite"
 	"github.com/goccy/go-json"
@@ -36,7 +37,7 @@ func NewDataIntegrityKeyAccess(id, kid string, key gocrypto.PrivateKey) (*DataIn
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not create JWK signer: %s", kid)
 	}
-	verifier, err := cryptosuite.NewJSONWebKeyVerifier(id, kid, *publicKeyJWK)
+	verifier, err := cryptosuite.NewJSONWebKeyVerifier(id, *publicKeyJWK)
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not create JWK verifier: %s", kid)
 	}
@@ -76,3 +77,11 @@ func (ka DataIntegrityKeyAccess) Verify(payload cryptosuite.Provable) error {
 	}
 	return nil
 }
+
+func (ka DataIntegrityKeyAccess) SignVerifiablePresentation(audience string, presentation credential.VerifiablePresentation) (*DataIntegrityJSON, error) {
+	return nil, errors.New("not implemented")
+}
+
+func (ka DataIntegrityKeyAccess) VerifyVerifiablePresentation(presentation cryptosuite.Provable) error {
+	return errors.New("not implemented")
+}
diff --git a/internal/keyaccess/jwt.go b/internal/keyaccess/jwt.go
index 1907f6c..c33a65a 100644
--- a/internal/keyaccess/jwt.go
+++ b/internal/keyaccess/jwt.go
@@ -1,12 +1,13 @@
 package keyaccess
 
 import (
+	"context"
 	gocrypto "crypto"
 	"fmt"
 
 	"github.com/TBD54566975/ssi-sdk/credential"
-	"github.com/TBD54566975/ssi-sdk/credential/signing"
 	"github.com/TBD54566975/ssi-sdk/crypto"
+	didsdk "github.com/TBD54566975/ssi-sdk/did"
 	"github.com/goccy/go-json"
 	"github.com/lestrrat-go/jwx/jws"
 	"github.com/pkg/errors"
@@ -33,7 +34,7 @@ func NewJWKKeyAccess(id, kid string, key gocrypto.PrivateKey) (*JWKKeyAccess, er
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not create JWK Key Access object for kid: %s, error creating signer", kid)
 	}
-	verifier, err := signer.ToVerifier()
+	verifier, err := signer.ToVerifier(id)
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not create JWK Key Access object for kid: %s, error creating verifier", kid)
 	}
@@ -54,7 +55,7 @@ func NewJWKKeyAccessVerifier(id, kid string, key gocrypto.PublicKey) (*JWKKeyAcc
 	if key == nil {
 		return nil, errors.New("key cannot be nil")
 	}
-	verifier, err := crypto.NewJWTVerifier(id, kid, key)
+	verifier, err := crypto.NewJWTVerifier(id, key)
 	if err != nil {
 		return nil, errors.Wrapf(err, "could not create JWK Key Access object for kid: %s, error creating verifier", kid)
 	}
@@ -115,16 +116,17 @@ func (ka JWKKeyAccess) Verify(token JWT) error {
 	return ka.VerifyJWS(string(token))
 }
 
-func (ka JWKKeyAccess) SignVerifiableCredential(credential credential.VerifiableCredential) (*JWT, error) {
+func (ka JWKKeyAccess) SignVerifiableCredential(cred credential.VerifiableCredential) (*JWT, error) {
 	if ka.JWTSigner == nil {
 		return nil, errors.New("cannot sign with nil signer")
 	}
-	if err := credential.IsValid(); err != nil {
+	if err := cred.IsValid(); err != nil {
 		return nil, errors.New("cannot sign invalid credential")
 	}
-	tokenBytes, err := signing.SignVerifiableCredentialJWT(*ka.JWTSigner, credential)
+
+	tokenBytes, err := credential.SignVerifiableCredentialJWT(*ka.JWTSigner, cred)
 	if err != nil {
-		return nil, errors.Wrap(err, "could not sign credential")
+		return nil, errors.Wrap(err, "could not sign cred")
 	}
 	return JWT(tokenBytes).Ptr(), nil
 }
@@ -133,7 +135,7 @@ func (ka JWKKeyAccess) VerifyVerifiableCredential(token JWT) (*credential.Verifi
 	if token == "" {
 		return nil, errors.New("token cannot be empty")
 	}
-	_, _, verifiableCredential, err := signing.VerifyVerifiableCredentialJWT(*ka.JWTVerifier, token.String())
+	_, _, verifiableCredential, err := credential.VerifyVerifiableCredentialJWT(*ka.JWTVerifier, token.String())
 	return verifiableCredential, err
 }
 
@@ -144,18 +146,18 @@ func (ka JWKKeyAccess) SignVerifiablePresentation(audience string, presentation
 	if err := presentation.IsValid(); err != nil {
 		return nil, errors.New("cannot sign invalid presentation")
 	}
-	tokenBytes, err := signing.SignVerifiablePresentationJWT(*ka.JWTSigner, signing.JWTVVPParameters{Audience: audience}, presentation)
+	tokenBytes, err := credential.SignVerifiablePresentationJWT(*ka.JWTSigner, credential.JWTVVPParameters{Audience: audience}, presentation)
 	if err != nil {
 		return nil, errors.Wrap(err, "could not sign presentation")
 	}
 	return JWT(tokenBytes).Ptr(), nil
 }
 
-func (ka JWKKeyAccess) VerifyVerifiablePresentation(token JWT) (*credential.VerifiablePresentation, error) {
+func (ka JWKKeyAccess) VerifyVerifiablePresentation(ctx context.Context, resolver didsdk.Resolver, token JWT) (*credential.VerifiablePresentation, error) {
 	if token == "" {
 		return nil, errors.New("token cannot be empty")
 	}
-	_, _, presentation, err := signing.VerifyVerifiablePresentationJWT(*ka.JWTVerifier, token.String())
+	_, _, presentation, err := credential.VerifyVerifiablePresentationJWT(ctx, *ka.JWTVerifier, resolver, token.String())
 	return presentation, err
 }
 
diff --git a/pkg/server/router/manifest.go b/pkg/server/router/manifest.go
index e609301..e468aae 100644
--- a/pkg/server/router/manifest.go
+++ b/pkg/server/router/manifest.go
@@ -283,8 +283,8 @@ func (sar SubmitApplicationRequest) toServiceRequest() (*model.SubmitApplication
 
 type SubmitApplicationResponse struct {
 	Response manifestsdk.CredentialResponse `json:"credential_response"`
-	// this is an interface type to union Data Integrity and JWT style VCs
-	Credentials any           `json:"verifiableCredentials,omitempty"`
+	// this is an any type to union Data Integrity and JWT style VCs
+	Credentials []any         `json:"verifiableCredentials,omitempty"`
 	ResponseJWT keyaccess.JWT `json:"responseJwt,omitempty"`
 }
 
diff --git a/pkg/server/router/presentation.go b/pkg/server/router/presentation.go
index 6d08346..59aa4f1 100644
--- a/pkg/server/router/presentation.go
+++ b/pkg/server/router/presentation.go
@@ -5,8 +5,8 @@ import (
 	"fmt"
 	"net/http"
 
+	"github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
-	"github.com/TBD54566975/ssi-sdk/credential/signing"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/goccy/go-json"
 	"github.com/pkg/errors"
@@ -246,7 +246,7 @@ type CreateSubmissionRequest struct {
 }
 
 func (r CreateSubmissionRequest) toServiceRequest() (*model.CreateSubmissionRequest, error) {
-	_, _, vp, err := signing.ParseVerifiablePresentationFromJWT(r.SubmissionJWT.String())
+	_, _, vp, err := credential.ParseVerifiablePresentationFromJWT(r.SubmissionJWT.String())
 	if err != nil {
 		return nil, errors.Wrap(err, "parsing presentation from jwt")
 	}
diff --git a/pkg/service/credential/storage.go b/pkg/service/credential/storage.go
index 98ed09e..142c291 100644
--- a/pkg/service/credential/storage.go
+++ b/pkg/service/credential/storage.go
@@ -8,7 +8,6 @@ import (
 	"strings"
 
 	"github.com/TBD54566975/ssi-sdk/credential"
-	"github.com/TBD54566975/ssi-sdk/credential/signing"
 	statussdk "github.com/TBD54566975/ssi-sdk/credential/status"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/goccy/go-json"
@@ -283,7 +282,7 @@ func buildStoredCredential(request StoreCredentialRequest) (*StoredCredential, e
 	// assume we have a Data Integrity credential
 	cred := request.Credential
 	if request.HasJWTCredential() {
-		_, _, parsedCred, err := signing.ParseVerifiableCredentialFromJWT(request.CredentialJWT.String())
+		_, _, parsedCred, err := credential.ParseVerifiableCredentialFromJWT(request.CredentialJWT.String())
 		if err != nil {
 			return nil, errors.Wrap(err, "could not parse credential from jwt")
 		}
diff --git a/pkg/service/presentation/service.go b/pkg/service/presentation/service.go
index 79f84d4..0c21023 100644
--- a/pkg/service/presentation/service.go
+++ b/pkg/service/presentation/service.go
@@ -4,8 +4,8 @@ import (
 	"context"
 	"fmt"
 
+	credsdk "github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
-	"github.com/TBD54566975/ssi-sdk/credential/signing"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
 	sdkutil "github.com/TBD54566975/ssi-sdk/util"
 	"github.com/lestrrat-go/jwx/jws"
@@ -163,7 +163,7 @@ func (s Service) CreateSubmission(ctx context.Context, request model.CreateSubmi
 		return nil, errors.Wrap(err, "provided value is not a valid presentation submission")
 	}
 
-	headers, _, vp, err := signing.ParseVerifiablePresentationFromJWT(request.SubmissionJWT.String())
+	headers, _, vp, err := credsdk.ParseVerifiablePresentationFromJWT(request.SubmissionJWT.String())
 	if err != nil {
 		return nil, errors.Wrap(err, "parsing vp from jwt")
 	}
@@ -208,7 +208,8 @@ func (s Service) CreateSubmission(ctx context.Context, request model.CreateSubmi
 		}
 	}
 
-	if err = exchange.VerifyPresentationSubmissionVP(definition.PresentationDefinition, request.Presentation); err != nil {
+	// TODO(gabe) plug in additional credential verification logic here
+	if _, err = exchange.VerifyPresentationSubmissionVP(definition.PresentationDefinition, request.Presentation); err != nil {
 		return nil, errors.Wrap(err, "verifying presentation submission vp")
 	}
 


Test patch:
diff --git a/integration/steelthread_integration_test.go b/integration/steelthread_integration_test.go
index b76c5c5..b598c0c 100644
--- a/integration/steelthread_integration_test.go
+++ b/integration/steelthread_integration_test.go
@@ -3,7 +3,7 @@ package integration
 import (
 	"testing"
 
-	"github.com/TBD54566975/ssi-sdk/credential/util"
+	credsdk "github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/stretchr/testify/assert"
 
 	"github.com/tbd54566975/ssi-service/pkg/service/operation/storage"
@@ -317,7 +317,7 @@ func TestSubmitAndReviewApplicationIntegration(t *testing.T) {
 	vc, err := getJSONElement(reviewApplicationOutput, "$.verifiableCredentials[0]")
 	assert.NoError(t, err)
 	assert.NotEmpty(t, vc)
-	typedVC, err := util.CredentialsFromInterface(vc)
+	_, _, typedVC, err := credsdk.ToCredential(vc)
 	assert.NoError(t, err)
 	assert.Equal(t, "Mister", typedVC.CredentialSubject["givenName"])
 	assert.Equal(t, "Tee", typedVC.CredentialSubject["familyName"])
diff --git a/integration/testdata/manifest-input.json b/integration/testdata/manifest-input.json
index 2ca5f12..9800bb2 100644
--- a/integration/testdata/manifest-input.json
+++ b/integration/testdata/manifest-input.json
@@ -36,7 +36,7 @@
             {
               "id":"givenName",
               "path":[
-                "$.credentialSubject.givenName"
+                "$.vc.credentialSubject.givenName"
               ],
               "filter":{
                 "type":"string",
@@ -46,7 +46,7 @@
             {
               "id":"additionalName",
               "path":[
-                "$.credentialSubject.additionalName"
+                "$.vc.credentialSubject.additionalName"
               ],
               "filter":{
                 "type":"string",
@@ -56,7 +56,7 @@
             {
               "id":"familyName",
               "path":[
-                "$.credentialSubject.familyName"
+                "$.vc.credentialSubject.familyName"
               ],
               "filter":{
                 "type":"string",
@@ -66,7 +66,7 @@
             {
               "id":"birthDate",
               "path":[
-                "$.credentialSubject.birthDate"
+                "$.vc.credentialSubject.birthDate"
               ],
               "filter":{
                 "type":"string",
@@ -76,7 +76,7 @@
             {
               "id":"taxID",
               "path":[
-                "$.credentialSubject.taxID"
+                "$.vc.credentialSubject.taxID"
               ],
               "filter":{
                 "type":"string"
@@ -85,7 +85,7 @@
             {
               "id":"postalAddress",
               "path":[
-                "$.credentialSubject.postalAddress"
+                "$.vc.credentialSubject.postalAddress"
               ],
               "filter":{
                 "type":"object",
diff --git a/internal/keyaccess/dataintegrity_test.go b/internal/keyaccess/dataintegrity_test.go
index 24fc538..7a8db66 100644
--- a/internal/keyaccess/dataintegrity_test.go
+++ b/internal/keyaccess/dataintegrity_test.go
@@ -50,7 +50,7 @@ func TestDataIntegrityKeyAccessSignVerify(t *testing.T) {
 		assert.NotEmpty(tt, ka)
 
 		// sign
-		testCred := getTestCredential()
+		testCred := getTestCredential(id)
 		signedCred, err := ka.Sign(&testCred)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, signedCred)
@@ -104,7 +104,7 @@ func TestDataIntegrityKeyAccessSignVerify(t *testing.T) {
 		assert.NotEmpty(tt, ka)
 
 		// sign
-		testPres := getTestPresentation()
+		testPres := getDataIntegrityTestPresentation(*ka)
 		signedPres, err := ka.Sign(&testPres)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, signedPres)
@@ -116,5 +116,10 @@ func TestDataIntegrityKeyAccessSignVerify(t *testing.T) {
 		// verify
 		err = ka.Verify(&pres)
 		assert.NoError(tt, err)
+
+		// TODO(gabe) enable with https://github.com/TBD54566975/ssi-sdk/issues/352, https://github.com/TBD54566975/ssi-service/issues/105
+		err = ka.VerifyVerifiablePresentation(&pres)
+		assert.Error(t, err)
+		assert.Contains(t, err.Error(), "not implemented")
 	})
 }
diff --git a/internal/keyaccess/jwt_test.go b/internal/keyaccess/jwt_test.go
index 7c20dae..110c3e9 100644
--- a/internal/keyaccess/jwt_test.go
+++ b/internal/keyaccess/jwt_test.go
@@ -1,10 +1,12 @@
 package keyaccess
 
 import (
+	"context"
 	"testing"
 
 	"github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/crypto"
+	"github.com/TBD54566975/ssi-sdk/did"
 	"github.com/goccy/go-json"
 	"github.com/google/uuid"
 	"github.com/stretchr/testify/assert"
@@ -168,7 +170,7 @@ func TestJWKKeyAccessSignVerifyCredentials(t *testing.T) {
 		assert.NotEmpty(tt, ka)
 
 		// sign
-		testCred := getTestCredential()
+		testCred := getTestCredential(testID)
 		testCredCopy := copyCred(t, testCred)
 		signedCred, err := ka.SignVerifiableCredential(testCredCopy)
 		assert.NoError(tt, err)
@@ -220,24 +222,26 @@ func TestJWKKeyAccessSignVerifyCredentials(t *testing.T) {
 
 func TestJWKKeyAccessSignVerifyPresentations(t *testing.T) {
 	t.Run("Sign and Verify Presentations - Happy Path", func(tt *testing.T) {
-		_, privKey, err := crypto.GenerateEd25519Key()
-		kid := "test-kid"
+		privKey, didKey, err := did.GenerateDIDKey(crypto.Ed25519)
 		assert.NoError(tt, err)
-		testID := "test-id"
-		ka, err := NewJWKKeyAccess(testID, kid, privKey)
+		assert.NotEmpty(tt, privKey)
+		expanded, err := didKey.Expand()
+		assert.NoError(tt, err)
+		kid := expanded.VerificationMethod[0].ID
+		ka, err := NewJWKKeyAccess(didKey.String(), kid, privKey)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, ka)
 
 		// sign
-		testPres := getTestPresentation()
-		signedPres, err := ka.SignVerifiablePresentation("test-audience", testPres)
+		testPres := getJWTTestPresentation(*ka)
+		signedPres, err := ka.SignVerifiablePresentation(didKey.String(), testPres)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, signedPres)
 
-		println(string(*signedPres))
-
 		// verify
-		verifiedPres, err := ka.VerifyVerifiablePresentation(*signedPres)
+		resolver, err := did.NewResolver([]did.Resolver{did.KeyResolver{}}...)
+		assert.NoError(tt, err)
+		verifiedPres, err := ka.VerifyVerifiablePresentation(context.Background(), resolver, *signedPres)
 		assert.NoError(tt, err)
 		assert.NotEmpty(tt, verifiedPres)
 
@@ -274,17 +278,18 @@ func TestJWKKeyAccessSignVerifyPresentations(t *testing.T) {
 		assert.NotEmpty(tt, ka)
 
 		// verify
-		_, err = ka.VerifyVerifiablePresentation("bad")
+		resolver, err := did.NewResolver([]did.Resolver{did.KeyResolver{}}...)
+		assert.NoError(tt, err)
+		_, err = ka.VerifyVerifiablePresentation(context.Background(), resolver, "bad")
 		assert.Error(tt, err)
 		assert.Contains(tt, err.Error(), "invalid JWT")
 	})
 }
 
-func getTestCredential() credential.VerifiableCredential {
+func getTestCredential(issuerDID string) credential.VerifiableCredential {
 	knownContext := []string{"https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"}
 	knownID := uuid.NewString()
 	knownType := []string{"VerifiableCredential", "HappyCredential"}
-	knownIssuer := "https://example.com/issuers/565049"
 	knownIssuanceDate := "2010-01-01T19:23:24Z"
 	knownSubject := map[string]any{
 		"id": "did:example:ebfeb1f712ebc6f1c276e12ec21",
@@ -296,23 +301,41 @@ func getTestCredential() credential.VerifiableCredential {
 		Context:           knownContext,
 		ID:                knownID,
 		Type:              knownType,
-		Issuer:            knownIssuer,
+		Issuer:            issuerDID,
 		IssuanceDate:      knownIssuanceDate,
 		CredentialSubject: knownSubject,
 	}
 }
 
-func getTestPresentation() credential.VerifiablePresentation {
+func getDataIntegrityTestPresentation(ka DataIntegrityKeyAccess) credential.VerifiablePresentation {
+	knownContext := []string{"https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"}
+	knownID := uuid.NewString()
+	knownType := []string{"VerifiablePresentation", "HappyPresentation"}
+	knownHolder := "did:example:ebfeb1f712ebc6f1c276e12ec21"
+	testCredential := getTestCredential(ka.JWTSigner.ID)
+	signedCred, _ := ka.Sign(&testCredential)
+	return credential.VerifiablePresentation{
+		Context:              knownContext,
+		ID:                   knownID,
+		Type:                 knownType,
+		Holder:               knownHolder,
+		VerifiableCredential: []any{signedCred},
+	}
+}
+
+func getJWTTestPresentation(ka JWKKeyAccess) credential.VerifiablePresentation {
 	knownContext := []string{"https://www.w3.org/2018/credentials/v1", "https://www.w3.org/2018/credentials/examples/v1"}
 	knownID := uuid.NewString()
 	knownType := []string{"VerifiablePresentation", "HappyPresentation"}
 	knownHolder := "did:example:ebfeb1f712ebc6f1c276e12ec21"
+	testCredential := getTestCredential(ka.JWTSigner.ID)
+	signedJWT, _ := ka.SignVerifiableCredential(testCredential)
 	return credential.VerifiablePresentation{
 		Context:              knownContext,
 		ID:                   knownID,
 		Type:                 knownType,
 		Holder:               knownHolder,
-		VerifiableCredential: []any{getTestCredential()},
+		VerifiableCredential: []any{signedJWT},
 	}
 }
 
diff --git a/pkg/server/router/manifest_test.go b/pkg/server/router/manifest_test.go
index 08d9a3b..ad581d0 100644
--- a/pkg/server/router/manifest_test.go
+++ b/pkg/server/router/manifest_test.go
@@ -161,7 +161,7 @@ func getValidManifestRequest(issuerDID, issuerKID, schemaID string) model.Create
 					Constraints: &exchange.Constraints{
 						Fields: []exchange.Field{
 							{
-								Path: []string{"$.credentialSubject.licenseType"},
+								Path: []string{"$.vc.credentialSubject.licenseType"},
 							},
 						},
 					},
diff --git a/pkg/server/server_manifest_test.go b/pkg/server/server_manifest_test.go
index 01eef0b..1eb75bb 100644
--- a/pkg/server/server_manifest_test.go
+++ b/pkg/server/server_manifest_test.go
@@ -10,7 +10,6 @@ import (
 
 	credsdk "github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/manifest"
-	"github.com/TBD54566975/ssi-sdk/credential/util"
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
 	"github.com/benbjohnson/clock"
@@ -450,7 +449,7 @@ func TestManifestAPI(t *testing.T) {
 		assert.NoError(tt, err)
 		assert.Len(tt, appResp.Credentials, 2, "each output_descriptor in the definition should result in a credential")
 
-		vc, err := util.CredentialsFromInterface(appResp.Credentials.([]any)[0])
+		_, _, vc, err := credsdk.ToCredential(appResp.Credentials[0])
 		assert.NoError(tt, err)
 		expectedSubject := credsdk.CredentialSubject{
 			"id":        applicantDID.DID.ID,
@@ -463,7 +462,7 @@ func TestManifestAPI(t *testing.T) {
 		assert.Equal(tt, createdSchema.ID, vc.CredentialSchema.ID)
 		assert.Empty(tt, vc.CredentialStatus)
 
-		vc2, err := util.CredentialsFromInterface(appResp.Credentials.([]any)[1])
+		_, _, vc2, err := credsdk.ToCredential(appResp.Credentials[1])
 		assert.NoError(tt, err)
 		expectedSubject = credsdk.CredentialSubject{
 			"id": applicantDID.DID.ID,
@@ -627,7 +626,7 @@ func TestManifestAPI(t *testing.T) {
 		assert.Len(tt, appResp.Credentials, 2)
 		assert.Empty(tt, appResp.Response.Denial)
 
-		vc, err := util.CredentialsFromInterface(appResp.Credentials.([]any)[0])
+		_, _, vc, err := credsdk.ToCredential(appResp.Credentials[0])
 		assert.NoError(tt, err)
 		assert.Equal(tt, credsdk.CredentialSubject{
 			"id":    applicantDID.DID.ID,
diff --git a/pkg/server/server_presentation_test.go b/pkg/server/server_presentation_test.go
index 1754223..39a10f4 100644
--- a/pkg/server/server_presentation_test.go
+++ b/pkg/server/server_presentation_test.go
@@ -9,7 +9,6 @@ import (
 
 	"github.com/TBD54566975/ssi-sdk/credential"
 	"github.com/TBD54566975/ssi-sdk/credential/exchange"
-	"github.com/TBD54566975/ssi-sdk/credential/signing"
 	"github.com/TBD54566975/ssi-sdk/crypto"
 	didsdk "github.com/TBD54566975/ssi-sdk/did"
 	"github.com/goccy/go-json"
@@ -564,7 +563,7 @@ func createSubmission(t *testing.T, pRouter *router.PresentationRouter, definiti
 func createSubmissionRequest(t *testing.T, definitionID, requesterDID string, vc credential.VerifiableCredential, holderSigner crypto.JWTSigner, holderDID didsdk.DIDKey) router.CreateSubmissionRequest {
 	issuerSigner, didKey := getSigner(t)
 	vc.Issuer = didKey.String()
-	vcData, err := signing.SignVerifiableCredentialJWT(issuerSigner, vc)
+	vcData, err := credential.SignVerifiableCredentialJWT(issuerSigner, vc)
 	require.NoError(t, err)
 	ps := exchange.PresentationSubmission{
 		ID:           uuid.NewString(),
@@ -587,7 +586,7 @@ func createSubmissionRequest(t *testing.T, definitionID, requesterDID string, vc
 		VerifiableCredential:   []any{keyaccess.JWT(vcData)},
 	}
 
-	signed, err := signing.SignVerifiablePresentationJWT(holderSigner, signing.JWTVVPParameters{Audience: requesterDID}, vp)
+	signed, err := credential.SignVerifiablePresentationJWT(holderSigner, credential.JWTVVPParameters{Audience: requesterDID}, vp)
 	require.NoError(t, err)
 
 	request := router.CreateSubmissionRequest{SubmissionJWT: keyaccess.JWT(signed)}
diff --git a/pkg/server/server_test.go b/pkg/server/server_test.go
index 43c8c8c..83ea58d 100644
--- a/pkg/server/server_test.go
+++ b/pkg/server/server_test.go
@@ -143,7 +143,7 @@ func getValidManifestRequest(issuerDID, issuerKID, schemaID string) model.Create
 					Constraints: &exchange.Constraints{
 						Fields: []exchange.Field{
 							{
-								Path: []string{"$.credentialSubject.licenseType"},
+								Path: []string{"$.vc.credentialSubject.licenseType"},
 							},
 						},
 					},