Skip to content

Commit

Permalink
Merge pull request #453 from vkubiv/fix-performance-for-jsonld
Browse files Browse the repository at this point in the history
fix(sdk,app)!: performance of json-ld VCs
  • Loading branch information
Derek Trider authored Jun 16, 2023
2 parents 1c80952 + c9c7aa8 commit a9e4516
Show file tree
Hide file tree
Showing 25 changed files with 658 additions and 90 deletions.
12 changes: 9 additions & 3 deletions cmd/wallet-sdk-gomobile/credential/inquirer.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,13 @@ import (

"github.com/hyperledger/aries-framework-go/component/models/presexch"
afgoverifiable "github.com/hyperledger/aries-framework-go/component/models/verifiable"
"github.com/hyperledger/aries-framework-go/component/storageutil/mem"
"github.com/piprate/json-gold/ld"

"github.com/trustbloc/wallet-sdk/cmd/wallet-sdk-gomobile/verifiable"
"github.com/trustbloc/wallet-sdk/cmd/wallet-sdk-gomobile/wrapper"
goapi "github.com/trustbloc/wallet-sdk/pkg/api"
"github.com/trustbloc/wallet-sdk/pkg/common"
"github.com/trustbloc/wallet-sdk/pkg/credentialquery"
)

Expand All @@ -32,7 +34,7 @@ type Inquirer struct {
}

// NewInquirer returns a new Inquirer.
func NewInquirer(opts *InquirerOpts) *Inquirer {
func NewInquirer(opts *InquirerOpts) (*Inquirer, error) {
if opts == nil {
opts = &InquirerOpts{}
}
Expand All @@ -52,7 +54,11 @@ func NewInquirer(opts *InquirerOpts) *Inquirer {
httpClient.Timeout = goapi.DefaultHTTPTimeout
}

goAPIDocumentLoader = ld.NewDefaultDocumentLoader(httpClient)
var err error
goAPIDocumentLoader, err = common.CreateJSONLDDocumentLoader(httpClient, mem.NewProvider())
if err != nil {
return nil, wrapper.ToMobileError(err)
}
}

var goDIDResolver goapi.DIDResolver
Expand All @@ -63,7 +69,7 @@ func NewInquirer(opts *InquirerOpts) *Inquirer {
return &Inquirer{
goAPICredentialQuery: credentialquery.NewInstance(goAPIDocumentLoader),
goDIDResolver: goDIDResolver,
}
}, nil
}

// GetSubmissionRequirements returns information about VCs matching requirements.
Expand Down
28 changes: 18 additions & 10 deletions cmd/wallet-sdk-gomobile/credential/inquirer_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,14 @@ func TestNewInquirer(t *testing.T) {
t.Run("Using the default network-based document loader", func(t *testing.T) {
opts := credential.NewInquirerOpts().SetHTTPTimeoutNanoseconds(0)

inquirer := credential.NewInquirer(opts)
inquirer, err := credential.NewInquirer(opts)
require.NoError(t, err)
require.NotNil(t, inquirer)
})

t.Run("Default opts", func(t *testing.T) {
inquirer := credential.NewInquirer(nil)
inquirer, err := credential.NewInquirer(nil)
require.NoError(t, err)
require.NotNil(t, inquirer)
})
}
Expand All @@ -80,7 +82,8 @@ func TestInstance_GetSubmissionRequirements(t *testing.T) {
opts.SetDIDResolver(&mocksDIDResolver{})

t.Run("Success", func(t *testing.T) {
query := credential.NewInquirer(opts)
query, err := credential.NewInquirer(opts)
require.NoError(t, err)

requirements, err := query.GetSubmissionRequirements(multiInputPD, createCredJSONArray(t, contents))

Expand All @@ -106,7 +109,8 @@ func TestInstance_GetSubmissionRequirements(t *testing.T) {
})

t.Run("Success nested requirements", func(t *testing.T) {
query := credential.NewInquirer(opts)
query, err := credential.NewInquirer(opts)
require.NoError(t, err)

requirements, err := query.GetSubmissionRequirements(nestedRequirementsPD, createCredJSONArray(t, contents))

Expand Down Expand Up @@ -134,27 +138,30 @@ func TestInstance_GetSubmissionRequirements(t *testing.T) {
})

t.Run("PD parse failed", func(t *testing.T) {
query := credential.NewInquirer(opts)
query, err := credential.NewInquirer(opts)
require.NoError(t, err)

_, err := query.GetSubmissionRequirements(nil,
_, err = query.GetSubmissionRequirements(nil,
createCredJSONArray(t, [][]byte{universityDegreeVCJWT, permanentResidentCardVC}),
)

require.Contains(t, err.Error(), "unmarshal of presentation definition failed:")
})

t.Run("PD validation failed", func(t *testing.T) {
query := credential.NewInquirer(opts)
query, err := credential.NewInquirer(opts)
require.NoError(t, err)

_, err := query.GetSubmissionRequirements([]byte("{}"),
_, err = query.GetSubmissionRequirements([]byte("{}"),
createCredJSONArray(t, [][]byte{universityDegreeVCJWT, permanentResidentCardVC}),
)

require.Contains(t, err.Error(), "validation of presentation definition failed:")
})

t.Run("Nil credentials", func(t *testing.T) {
query := credential.NewInquirer(opts)
query, err := credential.NewInquirer(opts)
require.NoError(t, err)

submissionRequirements, err := query.GetSubmissionRequirements(nil, nil)

Expand All @@ -178,7 +185,8 @@ func TestInstance_GetSubmissionRequirementsCitizenship(t *testing.T) {
opts.SetDIDResolver(&mocksDIDResolver{})

t.Run("Success", func(t *testing.T) {
query := credential.NewInquirer(opts)
query, err := credential.NewInquirer(opts)
require.NoError(t, err)

requirements, err := query.GetSubmissionRequirements(citizenshipPD, createCredJSONArray(t, contents))

Expand Down
3 changes: 2 additions & 1 deletion cmd/wallet-sdk-gomobile/docs/usage.md
Original file line number Diff line number Diff line change
Expand Up @@ -1145,7 +1145,8 @@ let opts = Openid4vpNewOpts().setActivityLogger(activityLogger) // Optional, but
var newInteractionError: NSError?
let interaction = Openid4vpNewInteraction(args, opts, &newInteractionError)
let query = interaction.getQuery()
let inquirer = CredentialNewInquirer(nil)
var newInquirerError: NSError?
let inquirer = CredentialNewInquirer(nil, &newInquirerError)
let savedCredentials = VerifiableCredentialsArray() // Would need some actual credentials for this to work

// Use this code to display information about the verifier.
Expand Down
2 changes: 1 addition & 1 deletion cmd/wallet-sdk-gomobile/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ require (
github.com/hyperledger/aries-framework-go v0.3.3-0.20230615141038-5d444d6c36de
github.com/hyperledger/aries-framework-go/component/kmscrypto v0.0.0-20230615141038-5d444d6c36de
github.com/hyperledger/aries-framework-go/component/models v0.0.0-20230615141038-5d444d6c36de
github.com/hyperledger/aries-framework-go/component/storageutil v0.0.0-20230427134832-0c9969493bd3
github.com/hyperledger/aries-framework-go/component/vdr v0.0.0-20230615141038-5d444d6c36de
github.com/hyperledger/aries-framework-go/spi v0.0.0-20230615141038-5d444d6c36de
github.com/piprate/json-gold v0.5.1-0.20230111113000-6ddbe6e6f19f
Expand Down Expand Up @@ -41,7 +42,6 @@ require (
github.com/hyperledger/aries-framework-go-ext/component/vdr/longform v0.0.0-20221209153644-5a3273a805c1 // indirect
github.com/hyperledger/aries-framework-go-ext/component/vdr/sidetree v1.0.0-rc3.0.20221104150937-07bfbe450122 // indirect
github.com/hyperledger/aries-framework-go/component/log v0.0.0-20230427134832-0c9969493bd3 // indirect
github.com/hyperledger/aries-framework-go/component/storageutil v0.0.0-20230427134832-0c9969493bd3 // indirect
github.com/hyperledger/fabric-amcl v0.0.0-20230602173724-9e02669dceb2 // indirect
github.com/hyperledger/ursa-wrapper-go v0.3.1 // indirect
github.com/jinzhu/copier v0.0.0-20190924061706-b57f9002281a // indirect
Expand Down
18 changes: 15 additions & 3 deletions cmd/wallet-sdk-gomobile/openid4ci/interaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
"errors"

afgoverifiable "github.com/hyperledger/aries-framework-go/component/models/verifiable"
"github.com/hyperledger/aries-framework-go/component/storageutil/mem"

"github.com/trustbloc/wallet-sdk/cmd/wallet-sdk-gomobile/api"
"github.com/trustbloc/wallet-sdk/cmd/wallet-sdk-gomobile/otel"
Expand Down Expand Up @@ -55,7 +56,10 @@ func NewInteraction(args *InteractionArgs, opts *InteractionOpts) (*Interaction,
opts.AddHeader(oTel.TraceHeader())
}

goAPIClientConfig := createGoAPIClientConfig(args, opts)
goAPIClientConfig, err := createGoAPIClientConfig(args, opts)
if err != nil {
return nil, wrapper.ToMobileErrorWithTrace(err, oTel)
}

goAPIInteraction, err := openid4cigoapi.NewInteraction(args.initiateIssuanceURI, goAPIClientConfig)
if err != nil {
Expand Down Expand Up @@ -213,7 +217,7 @@ func (i *Interaction) createSigner(vm *api.VerificationMethod) (*common.JWSSigne

func createGoAPIClientConfig(config *InteractionArgs,
opts *InteractionOpts,
) *openid4cigoapi.ClientConfig {
) (*openid4cigoapi.ClientConfig, error) {
activityLogger := createGoAPIActivityLogger(opts.activityLogger)

httpClient := wrapper.NewHTTPClient(opts.httpTimeout, opts.additionalHeaders, opts.disableHTTPClientTLSVerification)
Expand All @@ -233,9 +237,17 @@ func createGoAPIClientConfig(config *InteractionArgs,
}

goAPIClientConfig.DocumentLoader = documentLoaderWrapper
} else {
dlHTTPClient := wrapper.NewHTTPClient(opts.httpTimeout, api.Headers{}, opts.disableHTTPClientTLSVerification)

var err error
goAPIClientConfig.DocumentLoader, err = common.CreateJSONLDDocumentLoader(dlHTTPClient, mem.NewProvider())
if err != nil {
return nil, err
}
}

return goAPIClientConfig
return goAPIClientConfig, nil
}

func createGoAPIActivityLogger(mobileAPIActivityLogger api.ActivityLogger) goapi.ActivityLogger {
Expand Down
15 changes: 15 additions & 0 deletions cmd/wallet-sdk-gomobile/openid4ci/interaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,21 @@ func TestNewInteraction(t *testing.T) {
require.NotNil(t, interaction)
})

t.Run("Success HTTP timeout", func(t *testing.T) {
kms, err := localkms.NewKMS(localkms.NewMemKMSStore())
require.NoError(t, err)

resolver := &mockResolver{keyWriter: kms}

requiredArgs := openid4ci.NewInteractionArgs(createTestRequestURI("example.com"), kms.GetCrypto(), resolver)
opts := openid4ci.NewInteractionOpts()
opts.SetHTTPTimeoutNanoseconds((10 * time.Second).Nanoseconds())

interaction, err := openid4ci.NewInteraction(requiredArgs, opts)
require.NoError(t, err)
require.NotNil(t, interaction)
})

t.Run("Failed, args is nil", func(t *testing.T) {
interaction, err := openid4ci.NewInteraction(nil, nil)
require.Error(t, err)
Expand Down
15 changes: 14 additions & 1 deletion cmd/wallet-sdk-gomobile/openid4vp/interaction.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import (
"github.com/hyperledger/aries-framework-go/component/models/jwt"
"github.com/hyperledger/aries-framework-go/component/models/presexch"
afgoverifiable "github.com/hyperledger/aries-framework-go/component/models/verifiable"
"github.com/hyperledger/aries-framework-go/component/storageutil/mem"
"github.com/piprate/json-gold/ld"

"github.com/trustbloc/wallet-sdk/cmd/wallet-sdk-gomobile/api"
Expand Down Expand Up @@ -92,11 +93,23 @@ func NewInteraction(args *Args, opts *Opts) (*Interaction, error) { //nolint:fun
goAPIDocumentLoader = &wrapper.DocumentLoaderWrapper{
DocumentLoader: opts.documentLoader,
}
} else {
dlHTTPClient := wrapper.NewHTTPClient(opts.httpTimeout, api.Headers{}, opts.disableHTTPClientTLSVerification)

var err error
goAPIDocumentLoader, err = common.CreateJSONLDDocumentLoader(dlHTTPClient, mem.NewProvider())
if err != nil {
return nil, wrapper.ToMobileErrorWithTrace(err, oTel)
}
}

inquirerOpts := credential.NewInquirerOpts()
inquirerOpts.SetDocumentLoader(opts.documentLoader)
inquirer := credential.NewInquirer(inquirerOpts)

inquirer, err := credential.NewInquirer(inquirerOpts)
if err != nil {
return nil, err
}

return &Interaction{
ldDocumentLoader: opts.documentLoader,
Expand Down
17 changes: 17 additions & 0 deletions cmd/wallet-sdk-gomobile/openid4vp/interaction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,23 @@ func TestOpenID4VP_GetQuery(t *testing.T) {
require.NotNil(t, instance)
require.Empty(t, instance.OTelTraceID())
})

t.Run("With Document loader", func(t *testing.T) {
requiredArgs := NewArgs(
requestObjectJWT,
&mockCrypto{},
&mocksDIDResolver{},
)

// Note: in-depth testing of opts functionality is done in the integration tests.
opts := NewOpts()
opts.SetDocumentLoader(&documentLoaderWrapper{goAPIDocumentLoader: testutil.DocumentLoader(t)})

instance, err := NewInteraction(requiredArgs, opts)
require.NoError(t, err)
require.NotNil(t, instance)
require.NotEmpty(t, instance.OTelTraceID())
})
})

t.Run("GetQuery success", func(t *testing.T) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import dev.trustbloc.wallet.sdk.api.*
import dev.trustbloc.wallet.sdk.display.*
import dev.trustbloc.wallet.sdk.openid4ci.*
import dev.trustbloc.wallet.sdk.otel.Otel
import dev.trustbloc.wallet.sdk.stderr.MetricsLogger
import dev.trustbloc.wallet.sdk.verifiable.Credential
import dev.trustbloc.wallet.sdk.verifiable.CredentialsArray

Expand All @@ -23,6 +24,7 @@ class OpenID4CI constructor(
val opts = InteractionOpts()
opts.addHeader(trace.traceHeader())
opts.setActivityLogger(activityLogger)
opts.setMetricsLogger(MetricsLogger())

newInteraction = Interaction(args, opts)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import dev.trustbloc.wallet.sdk.openid4vp.Args
import dev.trustbloc.wallet.sdk.openid4vp.VerifierDisplayData
import dev.trustbloc.wallet.sdk.otel.Otel
import dev.trustbloc.wallet.sdk.verifiable.CredentialsArray
import dev.trustbloc.wallet.sdk.stderr.MetricsLogger
import java.lang.Exception

class OpenID4VP constructor(
Expand All @@ -39,6 +40,7 @@ class OpenID4VP constructor(
val opts = Opts()
opts.setActivityLogger(activityLogger)
opts.addHeader(trace.traceHeader())
opts.setMetricsLogger(MetricsLogger())

val interaction = Interaction(args, opts)

Expand Down
2 changes: 1 addition & 1 deletion demo/app/ios/Runner/OpenID4VP.swift
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public class OpenID4VP {
throw OpenID4VPError.runtimeError("OpenID4VP interaction not properly initialized, call processAuthorizationRequest first")
}

return try CredentialNewInquirer(CredentialInquirerOpts()?.setDIDResolver(didResolver))!.getSubmissionRequirements(vpQueryContent, credentials: storedCredentials)
return try CredentialNewInquirer(CredentialInquirerOpts()?.setDIDResolver(didResolver), nil)!.getSubmissionRequirements(vpQueryContent, credentials: storedCredentials)
}

/**
Expand Down
5 changes: 4 additions & 1 deletion demo/app/ios/Runner/Tests/IntegrationTest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,10 @@ class IntegrationTest: XCTestCase {
let vpInteraction = Openid4vpNewInteraction(openID4VPArgs, opts, nil)!

let credentialsQuery = try vpInteraction.getQuery()
let inquirer = CredentialNewInquirer(nil)!

var newInquirerError: NSError?
let inquirer = CredentialNewInquirer(nil, &newInquirerError)!
XCTAssertNil(newInquirerError)

let submissionRequirements = try inquirer.getSubmissionRequirements(
credentialsQuery, credentials: issuedCreds)
Expand Down
Loading

0 comments on commit a9e4516

Please sign in to comment.