Skip to content

Commit

Permalink
fix: SD-JWT V5 create presentation for arrays (#56)
Browse files Browse the repository at this point in the history
* fix: presentation digest

* chore: rev

* feat: distinct values

* feat: extract by key

* feat: digest

* fix: lint
  • Loading branch information
skynet2 authored Jul 8, 2024
1 parent 81ac176 commit 6bd2317
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 1 deletion.
41 changes: 40 additions & 1 deletion presexch/definition.go
Original file line number Diff line number Diff line change
Expand Up @@ -1116,7 +1116,22 @@ func getLimitedDisclosures(constraints *Constraints, displaySrc []byte, credenti
return nil, err
}

for _, dc := range credential.SDJWTDisclosures() {
disclosures := credential.SDJWTDisclosures()
disclosuresMap := map[string]*common.DisclosureClaim{}

for _, dc := range disclosures {
disclosuresMap[dc.Digest] = dc
}

arrayElements := ExtractArrayValuesForSDJWTV5(parentObj)
for _, elem := range arrayElements {
dis, disOk := disclosuresMap[elem]
if disOk {
limitedDisclosures = append(limitedDisclosures, dis)
}
}

for _, dc := range disclosures {
if dc.Name == key {
digest, err := common.GetHash(*credentialContents.SDJWTHashAlg, dc.Disclosure)
if err != nil {
Expand All @@ -1134,6 +1149,30 @@ func getLimitedDisclosures(constraints *Constraints, displaySrc []byte, credenti
return limitedDisclosures, nil
}

// ExtractArrayValuesForSDJWTV5 extracts array values for SD JWT V5.
func ExtractArrayValuesForSDJWTV5(obj map[string]interface{}) []string {
var extractedValues []string

for key, v := range obj {
switch val := v.(type) {
case string:
if key == "..." {
extractedValues = append(extractedValues, val)
}
case map[string]interface{}:
extractedValues = append(extractedValues, ExtractArrayValuesForSDJWTV5(val)...)
case []interface{}:
for _, valData := range val {
if d1, ok1 := valData.(map[string]interface{}); ok1 {
extractedValues = append(extractedValues, ExtractArrayValuesForSDJWTV5(d1)...)
}
}
}
}

return extractedValues
}

func frameCreds(frame map[string]interface{}, creds []*verifiable.Credential,
sdBBSProofCreator *verifiable.BBSProofCreator,
opts ...verifiable.CredentialOpt) ([]*verifiable.Credential, error) {
Expand Down
30 changes: 30 additions & 0 deletions presexch/definition_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2361,6 +2361,36 @@ func TestPresentationDefinition_CreateVPArray(t *testing.T) {
})
}

func TestExtractExtraFields(t *testing.T) {
results := ExtractArrayValuesForSDJWTV5(map[string]interface{}{
"_sd": []interface{}{
"k1NxQSAyCCHlGw-93hxPzOFqUY4Ye7gLqLiKMkSZfHLa48Sevxr5zGHS6Yrb3arK",
"wu3GHwpa1pJaIv2U71-Y_9kdzjBxlZYRVOG03SIqrOMuytclBPOAU1FSlAnEgOzh",
},
"type": []interface{}{
map[string]interface{}{
"...": "mhV9Kt70m-8slbu1TgIpdr6_AWO-kG51Q2amF3w9qQyyxM-aXsTn77uxMBAnFM67",
},
},
"someObject": map[string]interface{}{
"nested": map[string]interface{}{
"nested2": map[string]interface{}{
"type": []interface{}{
map[string]interface{}{
"...": "xxx",
},
},
},
},
},
})

require.EqualValues(t, []string{
"mhV9Kt70m-8slbu1TgIpdr6_AWO-kG51Q2amF3w9qQyyxM-aXsTn77uxMBAnFM67",
"xxx",
}, results)
}

func getTestVCWithContext(t *testing.T, issuerID string, ctx []string) *verifiable.Credential {
subjectJSON := map[string]interface{}{
"id": uuid.New().String(),
Expand Down

0 comments on commit 6bd2317

Please sign in to comment.