diff --git a/pkg/service/oidc4vp/api.go b/pkg/service/oidc4vp/api.go index 0a5dfe793..c038dd808 100644 --- a/pkg/service/oidc4vp/api.go +++ b/pkg/service/oidc4vp/api.go @@ -48,6 +48,10 @@ type CredentialMetadata struct { IssuanceDate *util.TimeWrapper `json:"issuanceDate,omitempty"` ExpirationDate *util.TimeWrapper `json:"expirationDate,omitempty"` CustomClaims map[string]Claims `json:"customClaims,omitempty"` + + Name interface{} `json:"name,omitempty"` + AwardedDate interface{} `json:"awardedDate,omitempty"` + Description interface{} `json:"description,omitempty"` } type ServiceInterface interface { diff --git a/pkg/service/oidc4vp/oidc4vp_service.go b/pkg/service/oidc4vp/oidc4vp_service.go index 2a1c7ed21..c271d1e26 100644 --- a/pkg/service/oidc4vp/oidc4vp_service.go +++ b/pkg/service/oidc4vp/oidc4vp_service.go @@ -53,6 +53,12 @@ const ( customScopeProperty = "_scope" ) +const ( + additionalClaimFieldName = "name" + additionalClaimFieldDesc = "description" + additionalClaimFieldAwardedDate = "awardedDate" +) + var ErrDataNotFound = errors.New("data not found") type eventService interface { @@ -601,6 +607,10 @@ func (s *Service) RetrieveClaims( ExpirationDate: credContents.Expired, } + credMeta.Name = cred.CustomField(additionalClaimFieldName) + credMeta.Description = cred.CustomField(additionalClaimFieldDesc) + credMeta.AwardedDate = cred.CustomField(additionalClaimFieldAwardedDate) + if credContents.Issuer != nil { credMeta.Issuer = verifiable.IssuerToJSON(*credContents.Issuer) } diff --git a/pkg/service/oidc4vp/oidc4vp_service_test.go b/pkg/service/oidc4vp/oidc4vp_service_test.go index 288acf273..c65d4f4cc 100644 --- a/pkg/service/oidc4vp/oidc4vp_service_test.go +++ b/pkg/service/oidc4vp/oidc4vp_service_test.go @@ -993,6 +993,11 @@ func TestService_RetrieveClaims(t *testing.T) { require.NotEmpty(t, claims["http://example.gov/credentials/3732"].Issuer) require.NotEmpty(t, claims["http://example.gov/credentials/3732"].IssuanceDate) require.Empty(t, claims["http://example.gov/credentials/3732"].ExpirationDate) + + require.Equal(t, "abcd", claims["http://example.gov/credentials/3732"].Name) + require.Equal(t, "some-description", claims["http://example.gov/credentials/3732"].Description) + require.Nil(t, claims["http://example.gov/credentials/3732"].AwardedDate) + require.Equal(t, oidc4vp.CredentialMetadata{CustomClaims: map[string]oidc4vp.Claims{customScope: {"key1": "value1"}}}, claims["_scope"], diff --git a/pkg/service/oidc4vp/testdata/university_degree.jwt b/pkg/service/oidc4vp/testdata/university_degree.jwt index 82b6eba23..6d072778f 100644 --- a/pkg/service/oidc4vp/testdata/university_degree.jwt +++ b/pkg/service/oidc4vp/testdata/university_degree.jwt @@ -1 +1 @@ -eyJhbGciOiJub25lIiwidHlwIjoiSldUIn0.eyJpYXQiOjE1ODQzOTgyNDYsImlzcyI6ImRpZDp0cnVzdGJsb2NrOmFiYyIsImp0aSI6Imh0dHA6Ly9leGFtcGxlLmdvdi9jcmVkZW50aWFscy8zNzMyIiwibmJmIjoxNTg0Mzk4MjQ2LCJzdWIiOiJkaWQ6ZXhhbXBsZTplYmZlYjFmNzEyZWJjNmYxYzI3NmUxMmVjMjEiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdzNjLWNjZy5naXRodWIuaW8vbGRzLWp3czIwMjAvY29udGV4dHMvbGRzLWp3czIwMjAtdjEuanNvbiIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIiwiaHR0cHM6Ly93M2lkLm9yZy92Yy9zdGF0dXMtbGlzdC8yMDIxL3YxIl0sImNyZWRlbnRpYWxTdGF0dXMiOnsiaWQiOiJodHRwczovL2lzc3Vlci12Y3Muc2FuZGJveC50cnVzdGJsb2MuZGV2L3ZjLWlzc3Vlci10ZXN0LTIvc3RhdHVzLzEjMCIsInN0YXR1c0xpc3RDcmVkZW50aWFsIjoiIiwic3RhdHVzTGlzdEluZGV4IjoiMSIsInN0YXR1c1B1cnBvc2UiOiIyIiwidHlwZSI6IlN0YXR1c0xpc3QyMDIxRW50cnkifSwiY3JlZGVudGlhbFN1YmplY3QiOnsiZGVncmVlIjp7ImRlZ3JlZSI6Ik1JVCIsInR5cGUiOiJCYWNoZWxvckRlZ3JlZSJ9LCJpZCI6ImRpZDpleGFtcGxlOmViZmViMWY3MTJlYmM2ZjFjMjc2ZTEyZWMyMSIsIm5hbWUiOiJKYXlkZW4gRG9lIiwic3BvdXNlIjoiZGlkOmV4YW1wbGU6YzI3NmUxMmVjMjFlYmZlYjFmNzEyZWJjNmYxIn0sImlkIjoiaHR0cDovL2V4YW1wbGUuZ292L2NyZWRlbnRpYWxzLzM3MzIiLCJpc3N1YW5jZURhdGUiOiIyMDIwLTAzLTE2VDIyOjM3OjI2LjU0NFoiLCJpc3N1ZXIiOnsiaWQiOiJkaWQ6dHJ1c3RibG9jazphYmMiLCJuYW1lIjoiVW5pdmVyc2l0eSJ9LCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiVW5pdmVyc2l0eURlZ3JlZUNyZWRlbnRpYWwiXX19. \ No newline at end of file +eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1ODQzOTgyNDYsImlzcyI6ImRpZDp0cnVzdGJsb2NrOmFiYyIsImp0aSI6Imh0dHA6Ly9leGFtcGxlLmdvdi9jcmVkZW50aWFscy8zNzMyIiwibmJmIjoxNTg0Mzk4MjQ2LCJzdWIiOiJkaWQ6ZXhhbXBsZTplYmZlYjFmNzEyZWJjNmYxYzI3NmUxMmVjMjEiLCJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSIsImh0dHBzOi8vdzNjLWNjZy5naXRodWIuaW8vbGRzLWp3czIwMjAvY29udGV4dHMvbGRzLWp3czIwMjAtdjEuanNvbiIsImh0dHBzOi8vd3d3LnczLm9yZy8yMDE4L2NyZWRlbnRpYWxzL2V4YW1wbGVzL3YxIiwiaHR0cHM6Ly93M2lkLm9yZy92Yy9zdGF0dXMtbGlzdC8yMDIxL3YxIl0sIm5hbWUiOiJhYmNkIiwiZGVzY3JpcHRpb24iOiJzb21lLWRlc2NyaXB0aW9uIiwiY3JlZGVudGlhbFN0YXR1cyI6eyJpZCI6Imh0dHBzOi8vaXNzdWVyLXZjcy5zYW5kYm94LnRydXN0YmxvYy5kZXYvdmMtaXNzdWVyLXRlc3QtMi9zdGF0dXMvMSMwIiwic3RhdHVzTGlzdENyZWRlbnRpYWwiOiIiLCJzdGF0dXNMaXN0SW5kZXgiOiIxIiwic3RhdHVzUHVycG9zZSI6IjIiLCJ0eXBlIjoiU3RhdHVzTGlzdDIwMjFFbnRyeSJ9LCJjcmVkZW50aWFsU3ViamVjdCI6eyJkZWdyZWUiOnsiZGVncmVlIjoiTUlUIiwidHlwZSI6IkJhY2hlbG9yRGVncmVlIn0sImlkIjoiZGlkOmV4YW1wbGU6ZWJmZWIxZjcxMmViYzZmMWMyNzZlMTJlYzIxIiwibmFtZSI6IkpheWRlbiBEb2UiLCJzcG91c2UiOiJkaWQ6ZXhhbXBsZTpjMjc2ZTEyZWMyMWViZmViMWY3MTJlYmM2ZjEifSwiaWQiOiJodHRwOi8vZXhhbXBsZS5nb3YvY3JlZGVudGlhbHMvMzczMiIsImlzc3VhbmNlRGF0ZSI6IjIwMjAtMDMtMTZUMjI6Mzc6MjYuNTQ0WiIsImlzc3VlciI6eyJpZCI6ImRpZDp0cnVzdGJsb2NrOmFiYyIsIm5hbWUiOiJVbml2ZXJzaXR5In0sInR5cGUiOlsiVmVyaWZpYWJsZUNyZWRlbnRpYWwiLCJVbml2ZXJzaXR5RGVncmVlQ3JlZGVudGlhbCJdfX0.bhCHeeHB840slD03CTLcNjv0Dan_eeMNjOrDtjm89T8 \ No newline at end of file