Skip to content
This repository has been archived by the owner on Mar 27, 2024. It is now read-only.

Commit

Permalink
fix: vc subject marshal (#3324)
Browse files Browse the repository at this point in the history
Signed-off-by: Firas Qutishat <firas.qutishat@securekey.com>

Signed-off-by: Firas Qutishat <firas.qutishat@securekey.com>
  • Loading branch information
fqutishat committed Aug 10, 2022
1 parent dd90d1d commit 9957132
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 33 deletions.
13 changes: 2 additions & 11 deletions pkg/doc/verifiable/credential.go
Original file line number Diff line number Diff line change
Expand Up @@ -456,11 +456,6 @@ type Subject struct {

// MarshalJSON marshals Subject to JSON.
func (s *Subject) MarshalJSON() ([]byte, error) {
if len(s.CustomFields) == 0 {
// Subject ID as string
return json.Marshal(s.ID)
}

type Alias Subject

alias := Alias(*s)
Expand Down Expand Up @@ -730,7 +725,7 @@ func parseIssuer(issuerBytes json.RawMessage) (Issuer, error) {
// parseSubject parses raw credential subject.
//
// Subject can be defined as a string (subject ID) or single object or array of objects.
func parseSubject(subjectBytes json.RawMessage) ([]Subject, error) {
func parseSubject(subjectBytes json.RawMessage) (interface{}, error) {
if len(subjectBytes) == 0 {
return nil, nil
}
Expand All @@ -739,10 +734,7 @@ func parseSubject(subjectBytes json.RawMessage) ([]Subject, error) {

err := json.Unmarshal(subjectBytes, &subjectID)
if err == nil {
return []Subject{{
ID: subjectID,
CustomFields: make(CustomFields),
}}, nil
return subjectID, nil
}

var subject Subject
Expand Down Expand Up @@ -806,7 +798,6 @@ func ParseCredential(vcData []byte, opts ...CredentialOpt) (*Credential, error)
if err != nil {
return nil, fmt.Errorf("decode new credential: %w", err)
}

// Unmarshal raw credential from JSON.
var raw rawCredential

Expand Down
37 changes: 16 additions & 21 deletions pkg/doc/verifiable/credential_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1361,15 +1361,13 @@ func TestParseSubject(t *testing.T) {

subject, err := parseSubject(subjectBytes)
require.NoError(t, err)
require.Len(t, subject, 1)
require.Equal(t, "did:example:ebfeb1f712ebc6f1c276e12ec21", subject[0].ID)
require.Empty(t, subject[0].CustomFields)
require.Equal(t, "did:example:ebfeb1f712ebc6f1c276e12ec21", subject.(string))
})

t.Run("Parse empty subject", func(t *testing.T) {
subject, err := parseSubject(nil)
require.NoError(t, err)
require.Len(t, subject, 0)
require.Nil(t, subject)
})

t.Run("Parse single Subject object", func(t *testing.T) {
Expand All @@ -1383,10 +1381,10 @@ func TestParseSubject(t *testing.T) {
subject, err := parseSubject(subjectBytes)
require.NoError(t, err)
require.Len(t, subject, 1)
require.Equal(t, "did:example:ebfeb1f712ebc6f1c276e12ec21", subject[0].ID)
require.NotEmpty(t, subject[0].CustomFields)
require.Equal(t, "Jayden Doe", subject[0].CustomFields["name"])
require.Equal(t, "did:example:c276e12ec21ebfeb1f712ebc6f1", subject[0].CustomFields["spouse"])
require.Equal(t, "did:example:ebfeb1f712ebc6f1c276e12ec21", subject.([]Subject)[0].ID)
require.NotEmpty(t, subject.([]Subject)[0].CustomFields)
require.Equal(t, "Jayden Doe", subject.([]Subject)[0].CustomFields["name"])
require.Equal(t, "did:example:c276e12ec21ebfeb1f712ebc6f1", subject.([]Subject)[0].CustomFields["spouse"])
})

t.Run("Parse several Subject objects", func(t *testing.T) {
Expand All @@ -1407,14 +1405,14 @@ func TestParseSubject(t *testing.T) {
subject, err := parseSubject(subjectBytes)
require.NoError(t, err)
require.Len(t, subject, 2)
require.Equal(t, "did:example:ebfeb1f712ebc6f1c276e12ec21", subject[0].ID)
require.NotEmpty(t, subject[0].CustomFields)
require.Equal(t, "Jayden Doe", subject[0].CustomFields["name"])
require.Equal(t, "did:example:c276e12ec21ebfeb1f712ebc6f1", subject[0].CustomFields["spouse"])
require.Equal(t, "did:example:c276e12ec21ebfeb1f712ebc6f1", subject[1].ID)
require.NotEmpty(t, subject[1].CustomFields)
require.Equal(t, "Morgan Doe", subject[1].CustomFields["name"])
require.Equal(t, "did:example:ebfeb1f712ebc6f1c276e12ec21", subject[1].CustomFields["spouse"])
require.Equal(t, "did:example:ebfeb1f712ebc6f1c276e12ec21", subject.([]Subject)[0].ID)
require.NotEmpty(t, subject.([]Subject)[0].CustomFields)
require.Equal(t, "Jayden Doe", subject.([]Subject)[0].CustomFields["name"])
require.Equal(t, "did:example:c276e12ec21ebfeb1f712ebc6f1", subject.([]Subject)[0].CustomFields["spouse"])
require.Equal(t, "did:example:c276e12ec21ebfeb1f712ebc6f1", subject.([]Subject)[1].ID)
require.NotEmpty(t, subject.([]Subject)[1].CustomFields)
require.Equal(t, "Morgan Doe", subject.([]Subject)[1].CustomFields["name"])
require.Equal(t, "did:example:ebfeb1f712ebc6f1c276e12ec21", subject.([]Subject)[1].CustomFields["spouse"])
})
}

Expand Down Expand Up @@ -1467,12 +1465,9 @@ func TestMarshalSubject(t *testing.T) {
t.Run("Marshal Subject with ID defined only", func(t *testing.T) {
subject := Subject{ID: "did:example:76e12ec712ebc6f1c221ebfeb1f"}

expectedSubjectBytes, err := json.Marshal("did:example:76e12ec712ebc6f1c221ebfeb1f")
require.NoError(t, err)

subjectBytes, err := subject.MarshalJSON()
require.NoError(t, err)
require.Equal(t, expectedSubjectBytes, subjectBytes)
require.Equal(t, `{"id":"did:example:76e12ec712ebc6f1c221ebfeb1f"}`, string(subjectBytes))
})

t.Run("Marshal Subject with ID, name, spouse defined", func(t *testing.T) {
Expand Down Expand Up @@ -2034,7 +2029,7 @@ func TestSubjectToBytes(t *testing.T) {
ID: "did:example:ebfeb1f712ebc6f1c276e12ec21",
})
r.NoError(err)
r.Equal("\"did:example:ebfeb1f712ebc6f1c276e12ec21\"", string(subjectBytes))
r.Equal("{\"id\":\"did:example:ebfeb1f712ebc6f1c276e12ec21\"}", string(subjectBytes))

subjectBytes, err = subjectToBytes(Subject{
ID: "did:example:ebfeb1f712ebc6f1c276e12ec21",
Expand Down
2 changes: 1 addition & 1 deletion pkg/doc/verifiable/presentation_jwt.go
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ func (jpc *JWTPresClaims) refineFromJWTClaims() {

// newJWTPresClaims creates JWT Claims of VP with an option to minimize certain fields put into "vp" claim.
func newJWTPresClaims(vp *Presentation, audience []string, minimizeVP bool) (*JWTPresClaims, error) {
// currently jwt encoding supports only single subject (by the spec)
// currently jwt encoding supports only single subject.([]Subject) (by the spec)
jwtClaims := &jwt.Claims{
Issuer: vp.Holder, // iss
ID: vp.ID, // jti
Expand Down

0 comments on commit 9957132

Please sign in to comment.