Skip to content

Commit

Permalink
feat: opt for default vp format.
Browse files Browse the repository at this point in the history
Signed-off-by: Volodymyr Kubiv <volodymyr.kubiv@euristiq.com>
  • Loading branch information
vkubiv committed Apr 18, 2024
1 parent 664ef7b commit beb6f86
Show file tree
Hide file tree
Showing 2 changed files with 104 additions and 8 deletions.
27 changes: 19 additions & 8 deletions presexch/definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,7 @@ type matchRequirementsOpts struct {
applySelectiveDisclosure bool
sdBBSProofCreator *verifiable.BBSProofCreator
credOpts []verifiable.CredentialOpt
defaultVPFormat string
}

// MatchRequirementsOpt is the MatchSubmissionRequirement option.
Expand All @@ -249,6 +250,13 @@ func WithSDBBSProofCreator(sdBBSProofCreator *verifiable.BBSProofCreator) MatchR
}
}

// WithDefaultPresentationFormat sets the default presentation format.
func WithDefaultPresentationFormat(format string) MatchRequirementsOpt {
return func(opts *matchRequirementsOpts) {
opts.defaultVPFormat = format
}
}

// ValidateSchema validates presentation definition.
func (pd *PresentationDefinition) ValidateSchema() error {
result, err := gojsonschema.Validate(
Expand Down Expand Up @@ -451,13 +459,13 @@ func makeRequirement(requirements []*SubmissionRequirement, descriptors []*Input
// CreateVP creates verifiable presentation.
func (pd *PresentationDefinition) CreateVP(credentials []*verifiable.Credential,
documentLoader ld.DocumentLoader, opts ...MatchRequirementsOpt) (*verifiable.Presentation, error) {
matchOpts := &matchRequirementsOpts{}
matchOpts := &matchRequirementsOpts{defaultVPFormat: FormatLDPVP}
for _, opt := range opts {
opt(matchOpts)
}

applicableCredentials, submission, err := presentationData(pd, credentials, documentLoader, false,
matchOpts.sdBBSProofCreator, matchOpts.credOpts...)
matchOpts.sdBBSProofCreator, matchOpts.defaultVPFormat, matchOpts.credOpts...)
if err != nil {
return nil, err
}
Expand All @@ -481,13 +489,13 @@ func (pd *PresentationDefinition) CreateVPArray(
documentLoader ld.DocumentLoader,
opts ...MatchRequirementsOpt,
) ([]*verifiable.Presentation, *PresentationSubmission, error) {
matchOpts := &matchRequirementsOpts{}
matchOpts := &matchRequirementsOpts{defaultVPFormat: FormatLDPVP}
for _, opt := range opts {
opt(matchOpts)
}

applicableCredentials, submission, err := presentationData(pd, credentials, documentLoader, true,
matchOpts.sdBBSProofCreator, matchOpts.credOpts...)
matchOpts.sdBBSProofCreator, matchOpts.defaultVPFormat, matchOpts.credOpts...)
if err != nil {
return nil, nil, err
}
Expand All @@ -512,6 +520,7 @@ func presentationData(
documentLoader ld.DocumentLoader,
separatePresentations bool,
sdBBSProofCreator *verifiable.BBSProofCreator,
defaultVPFormat string,
opts ...verifiable.CredentialOpt,
) ([]*verifiable.Credential, *PresentationSubmission, error) {
if err := pd.ValidateSchema(); err != nil {
Expand All @@ -523,7 +532,8 @@ func presentationData(
return nil, nil, err
}

format, result, err := pd.applyRequirement(req, credentials, documentLoader, sdBBSProofCreator, opts...)
format, result, err := pd.applyRequirement(
req, credentials, documentLoader, sdBBSProofCreator, defaultVPFormat, opts...)
if err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -582,7 +592,7 @@ func makeRequirementsForMatch(requirements []*SubmissionRequirement,
// MatchSubmissionRequirement return information about matching VCs.
func (pd *PresentationDefinition) MatchSubmissionRequirement(credentials []*verifiable.Credential,
documentLoader ld.DocumentLoader, opts ...MatchRequirementsOpt) ([]*MatchedSubmissionRequirement, error) {
matchOpts := &matchRequirementsOpts{}
matchOpts := &matchRequirementsOpts{defaultVPFormat: FormatLDPVP}
for _, opt := range opts {
opt(matchOpts)
}
Expand Down Expand Up @@ -694,6 +704,7 @@ func (pd *PresentationDefinition) applyRequirement( // nolint:funlen,gocyclo
creds []*verifiable.Credential,
documentLoader ld.DocumentLoader,
sdBBSProofCreator *verifiable.BBSProofCreator,
defaultVPFormat string,
opts ...verifiable.CredentialOpt,
) (string, map[string][]*credWrapper, error) {
reqLogic := req.toLogic()
Expand Down Expand Up @@ -765,10 +776,10 @@ func (pd *PresentationDefinition) applyRequirement( // nolint:funlen,gocyclo
if solved {
result := make(map[string][]*credWrapper)

// assume LDPVP format if pd.Format is not set.
// use defaultVPFormat format if pd.Format is not set.
// Usually pd.Format will be set when creds include a non-empty Proofs field since they represent the designated
// format.
vpFormat := FormatLDPVP
vpFormat := defaultVPFormat

for _, descID := range sol {
result[descID] = descriptorMatches[descID].creds
Expand Down
85 changes: 85 additions & 0 deletions presexch/definition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2185,6 +2185,47 @@ func TestPresentationDefinition_CreateVP(t *testing.T) {
checkSubmission(t, vp, pd)
checkVP(t, vp)
})

t.Run("Matches two descriptors(jwt_vp)", func(t *testing.T) {
pd := &PresentationDefinition{
ID: uuid.New().String(),
InputDescriptors: []*InputDescriptor{{
ID: uuid.New().String(),
Schema: []*Schema{{
URI: "https://example.org/examples#UniversityDegreeCredential",
}},
}, {
ID: uuid.New().String(),
Schema: []*Schema{{
URI: "https://example.org/examples#DocumentVerification",
}},
}},
}

vp, err := pd.CreateVP([]*verifiable.Credential{
createTestCredential(t, credentialProto{
Context: []string{verifiable.ContextURI, "https://www.w3.org/2018/credentials/examples/v1"},
Types: []string{verifiable.VCType, "UniversityDegreeCredential"},
ID: uuid.New().String(),
}),
createTestCredential(t, credentialProto{
Context: []string{verifiable.ContextURI, "https://trustbloc.github.io/context/vc/examples-v1.jsonld"},
Types: []string{verifiable.VCType, "DocumentVerification"},
ID: uuid.New().String(),
}),
}, lddl, WithDefaultPresentationFormat("jwt_vp"))

require.NoError(t, err)
require.NotNil(t, vp)

checkSubmission(t, vp, pd)

ps, ok := vp.CustomFields["presentation_submission"].(*PresentationSubmission)
require.True(t, ok)
require.Equal(t, "jwt_vp", ps.DescriptorMap[0].Format)

checkVP(t, vp)
})
}

func TestPresentationDefinition_CreateVPArray(t *testing.T) {
Expand Down Expand Up @@ -2225,6 +2266,50 @@ func TestPresentationDefinition_CreateVPArray(t *testing.T) {

checkExternalSubmission(t, vpList, ps, pd)

require.Equal(t, "ldp_vp", ps.DescriptorMap[0].Format)

for _, vp := range vpList {
checkVP(t, vp)
}
})

t.Run("Matches two descriptors(jwt_vp)", func(t *testing.T) {
pd := &PresentationDefinition{
ID: uuid.New().String(),
InputDescriptors: []*InputDescriptor{{
ID: uuid.New().String(),
Schema: []*Schema{{
URI: "https://example.org/examples#UniversityDegreeCredential",
}},
}, {
ID: uuid.New().String(),
Schema: []*Schema{{
URI: "https://example.org/examples#DocumentVerification",
}},
}},
}

vpList, ps, err := pd.CreateVPArray([]*verifiable.Credential{
createTestCredential(t, credentialProto{
Context: []string{verifiable.ContextURI, "https://www.w3.org/2018/credentials/examples/v1"},
Types: []string{verifiable.VCType, "UniversityDegreeCredential"},
ID: uuid.New().String(),
}),
createTestCredential(t, credentialProto{
Context: []string{verifiable.ContextURI, "https://trustbloc.github.io/context/vc/examples-v1.jsonld"},
Types: []string{verifiable.VCType, "DocumentVerification"},
ID: uuid.New().String(),
}),
}, lddl, WithDefaultPresentationFormat("jwt_vp"))

require.NoError(t, err)
require.NotNil(t, vpList)
require.Len(t, vpList, 2)

checkExternalSubmission(t, vpList, ps, pd)

require.Equal(t, "jwt_vp", ps.DescriptorMap[0].Format)

for _, vp := range vpList {
checkVP(t, vp)
}
Expand Down

0 comments on commit beb6f86

Please sign in to comment.