diff --git a/api/api.yaml b/api/api.yaml index 63ff59321..c2554d359 100644 --- a/api/api.yaml +++ b/api/api.yaml @@ -675,6 +675,13 @@ components: $ref: '#/components/schemas/RefreshService' displayMethod: $ref: '#/components/schemas/DisplayMethod' + proofs: + type: array + items: + type: string + x-omitempty: false + example: "BJJSignature2021" + enum: [ BJJSignature2021, Iden3SparseMerkleTreeProof] example: credentialSchema: "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json" type: "KYCAgeCredential" diff --git a/internal/api/api.gen.go b/internal/api/api.gen.go index 738855e98..86951c7df 100644 --- a/internal/api/api.gen.go +++ b/internal/api/api.gen.go @@ -21,6 +21,12 @@ const ( BasicAuthScopes = "basicAuth.Scopes" ) +// Defines values for CreateClaimRequestProofs. +const ( + BJJSignature2021 CreateClaimRequestProofs = "BJJSignature2021" + Iden3SparseMerkleTreeProof CreateClaimRequestProofs = "Iden3SparseMerkleTreeProof" +) + // Defines values for CreateIdentityRequestDidMetadataType. const ( BJJ CreateIdentityRequestDidMetadataType = "BJJ" @@ -53,17 +59,21 @@ type Config = []KeyValue // CreateClaimRequest defines model for CreateClaimRequest. type CreateClaimRequest struct { - CredentialSchema string `json:"credentialSchema"` - CredentialSubject map[string]interface{} `json:"credentialSubject"` - DisplayMethod *DisplayMethod `json:"displayMethod,omitempty"` - Expiration *int64 `json:"expiration,omitempty"` - MerklizedRootPosition *string `json:"merklizedRootPosition,omitempty"` - RefreshService *RefreshService `json:"refreshService,omitempty"` - RevNonce *uint64 `json:"revNonce,omitempty"` - SubjectPosition *string `json:"subjectPosition,omitempty"` - Type string `json:"type"` - Version *uint32 `json:"version,omitempty"` -} + CredentialSchema string `json:"credentialSchema"` + CredentialSubject map[string]interface{} `json:"credentialSubject"` + DisplayMethod *DisplayMethod `json:"displayMethod,omitempty"` + Expiration *int64 `json:"expiration,omitempty"` + MerklizedRootPosition *string `json:"merklizedRootPosition,omitempty"` + Proofs *[]CreateClaimRequestProofs `json:"proofs,omitempty"` + RefreshService *RefreshService `json:"refreshService,omitempty"` + RevNonce *uint64 `json:"revNonce,omitempty"` + SubjectPosition *string `json:"subjectPosition,omitempty"` + Type string `json:"type"` + Version *uint32 `json:"version,omitempty"` +} + +// CreateClaimRequestProofs defines model for CreateClaimRequest.Proofs. +type CreateClaimRequestProofs string // CreateClaimResponse defines model for CreateClaimResponse. type CreateClaimResponse struct { diff --git a/internal/api/server.go b/internal/api/server.go index 734642ff3..0b35502e5 100644 --- a/internal/api/server.go +++ b/internal/api/server.go @@ -160,7 +160,25 @@ func (s *Server) CreateClaim(ctx context.Context, request CreateClaimRequestObje expiration = common.ToPointer(time.Unix(*request.Body.Expiration, 0)) } - req := ports.NewCreateClaimRequest(did, request.Body.CredentialSchema, request.Body.CredentialSubject, expiration, request.Body.Type, request.Body.Version, request.Body.SubjectPosition, request.Body.MerklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, false, s.cfg.CredentialStatus.CredentialStatusType, toVerifiableRefreshService(request.Body.RefreshService), request.Body.RevNonce, + claimRequestProofs := ports.ClaimRequestProofs{} + if request.Body.Proofs == nil { + claimRequestProofs.BJJSignatureProof2021 = true + claimRequestProofs.Iden3SparseMerkleTreeProof = true + } else { + for _, proof := range *request.Body.Proofs { + if string(proof) == string(verifiable.BJJSignatureProofType) { + claimRequestProofs.BJJSignatureProof2021 = true + continue + } + if string(proof) == string(verifiable.Iden3SparseMerkleTreeProofType) { + claimRequestProofs.Iden3SparseMerkleTreeProof = true + continue + } + return CreateClaim400JSONResponse{N400JSONResponse{Message: fmt.Sprintf("unsupported proof type: %s", proof)}}, nil + } + } + + req := ports.NewCreateClaimRequest(did, request.Body.CredentialSchema, request.Body.CredentialSubject, expiration, request.Body.Type, request.Body.Version, request.Body.SubjectPosition, request.Body.MerklizedRootPosition, claimRequestProofs, nil, false, s.cfg.CredentialStatus.CredentialStatusType, toVerifiableRefreshService(request.Body.RefreshService), request.Body.RevNonce, toVerifiableDisplayMethod(request.Body.DisplayMethod)) resp, err := s.claimService.Save(ctx, req) diff --git a/internal/api/server_test.go b/internal/api/server_test.go index 769efbd38..3c35279bc 100644 --- a/internal/api/server_test.go +++ b/internal/api/server_test.go @@ -476,6 +476,76 @@ func TestServer_CreateClaim(t *testing.T) { createCredentialEventsCount: 1, }, }, + { + name: "Happy path with two proofs", + auth: authOk, + did: did, + body: CreateClaimRequest{ + CredentialSchema: "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json", + Type: "KYCAgeCredential", + CredentialSubject: map[string]any{ + "id": "did:polygonid:polygon:mumbai:2qFDkNkWePjd6URt6kGQX14a7wVKhBZt8bpy7HZJZi", + "birthday": 19960425, + "documentType": 2, + }, + Expiration: common.ToPointer(time.Now().Unix()), + Proofs: &[]CreateClaimRequestProofs{ + "BJJSignature2021", + "Iden3SparseMerkleTreeProof", + }, + }, + expected: expected{ + response: CreateClaim201JSONResponse{}, + httpCode: http.StatusCreated, + createCredentialEventsCount: 1, + }, + }, + { + name: "Happy path with bjjSignature proof", + auth: authOk, + did: did, + body: CreateClaimRequest{ + CredentialSchema: "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json", + Type: "KYCAgeCredential", + CredentialSubject: map[string]any{ + "id": "did:polygonid:polygon:mumbai:2qFDkNkWePjd6URt6kGQX14a7wVKhBZt8bpy7HZJZi", + "birthday": 19960425, + "documentType": 2, + }, + Expiration: common.ToPointer(time.Now().Unix()), + Proofs: &[]CreateClaimRequestProofs{ + "BJJSignature2021", + }, + }, + expected: expected{ + response: CreateClaim201JSONResponse{}, + httpCode: http.StatusCreated, + createCredentialEventsCount: 1, + }, + }, + { + name: "Happy path with Iden3SparseMerkleTreeProof proof", + auth: authOk, + did: did, + body: CreateClaimRequest{ + CredentialSchema: "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json", + Type: "KYCAgeCredential", + CredentialSubject: map[string]any{ + "id": "did:polygonid:polygon:mumbai:2qFDkNkWePjd6URt6kGQX14a7wVKhBZt8bpy7HZJZi", + "birthday": 19960425, + "documentType": 2, + }, + Expiration: common.ToPointer(time.Now().Unix()), + Proofs: &[]CreateClaimRequestProofs{ + "Iden3SparseMerkleTreeProof", + }, + }, + expected: expected{ + response: CreateClaim201JSONResponse{}, + httpCode: http.StatusCreated, + createCredentialEventsCount: 0, + }, + }, { name: "Happy path with ipfs schema", auth: authOk, @@ -556,6 +626,26 @@ func TestServer_CreateClaim(t *testing.T) { httpCode: http.StatusUnprocessableEntity, }, }, + { + name: "Wrong proof type", + auth: authOk, + did: did, + body: CreateClaimRequest{ + CredentialSchema: "http://www.wrong.url/cannot/get/the/credential", + Type: "KYCAgeCredential", + CredentialSubject: map[string]any{ + "id": "did:polygonid:polygon:mumbai:2qE1BZ7gcmEoP2KppvFPCZqyzyb5tK9T6Gec5HFANQ", + "birthday": 19960424, + "documentType": 2, + }, + Expiration: common.ToPointer(time.Now().Unix()), + Proofs: &[]CreateClaimRequestProofs{"wrong proof"}, + }, + expected: expected{ + response: CreateClaim400JSONResponse{N400JSONResponse{Message: "unsupported proof type: wrong proof"}}, + httpCode: http.StatusBadRequest, + }, + }, } { t.Run(tc.name, func(t *testing.T) { pubSub.Clear(event.CreateCredentialEvent) @@ -1400,7 +1490,11 @@ func TestServer_GetRevocationStatus(t *testing.T) { typeC := "KYCAgeCredential" merklizedRootPosition := "value" - claim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + claimRequestProofs := ports.ClaimRequestProofs{ + BJJSignatureProof2021: true, + Iden3SparseMerkleTreeProof: true, + } + claim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, claimRequestProofs, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) type expected struct { diff --git a/internal/api_ui/server.go b/internal/api_ui/server.go index 154673e9a..99f08a5ac 100644 --- a/internal/api_ui/server.go +++ b/internal/api_ui/server.go @@ -343,7 +343,17 @@ func (s *Server) CreateCredential(ctx context.Context, request CreateCredentialR if request.Body.SignatureProof == nil && request.Body.MtProof == nil { return CreateCredential400JSONResponse{N400JSONResponse{Message: "you must to provide at least one proof type"}}, nil } - req := ports.NewCreateClaimRequest(&s.cfg.APIUI.IssuerDID, request.Body.CredentialSchema, request.Body.CredentialSubject, request.Body.Expiration, request.Body.Type, nil, nil, nil, request.Body.SignatureProof, request.Body.MtProof, nil, true, s.cfg.CredentialStatus.CredentialStatusType, toVerifiableRefreshService(request.Body.RefreshService), nil, + + claimRequestProofs := ports.ClaimRequestProofs{} + if request.Body.SignatureProof != nil && *request.Body.SignatureProof { + claimRequestProofs.BJJSignatureProof2021 = true + } + + if request.Body.MtProof != nil && *request.Body.MtProof { + claimRequestProofs.Iden3SparseMerkleTreeProof = true + } + + req := ports.NewCreateClaimRequest(&s.cfg.APIUI.IssuerDID, request.Body.CredentialSchema, request.Body.CredentialSubject, request.Body.Expiration, request.Body.Type, nil, nil, nil, claimRequestProofs, nil, true, s.cfg.CredentialStatus.CredentialStatusType, toVerifiableRefreshService(request.Body.RefreshService), nil, toDisplayMethodService(request.Body.DisplayMethod)) resp, err := s.claimService.Save(ctx, req) if err != nil { diff --git a/internal/api_ui/server_test.go b/internal/api_ui/server_test.go index dbc945847..d4a48ac2e 100644 --- a/internal/api_ui/server_test.go +++ b/internal/api_ui/server_test.go @@ -1520,13 +1520,29 @@ func TestServer_GetCredential(t *testing.T) { typeC := "KYCAgeCredential" merklizedRootPosition := "index" schema := "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json" - createdClaim1, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + + createdClaim1Proofs := ports.ClaimRequestProofs{ + BJJSignatureProof2021: true, + Iden3SparseMerkleTreeProof: true, + } + + createdClaim2Proofs := ports.ClaimRequestProofs{ + BJJSignatureProof2021: true, + Iden3SparseMerkleTreeProof: false, + } + + createdClaim3Proofs := ports.ClaimRequestProofs{ + BJJSignatureProof2021: false, + Iden3SparseMerkleTreeProof: true, + } + + createdClaim1, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, createdClaim1Proofs, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) - createdClaim2, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(false), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + createdClaim2, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, createdClaim2Proofs, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) - createdClaim3, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(false), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + createdClaim3, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, createdClaim3Proofs, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) handler := getHandler(ctx, server) @@ -1728,19 +1744,22 @@ func TestServer_GetCredentials(t *testing.T) { _, err = schemaService.ImportSchema(ctx, *did, iReq) require.NoError(t, err) // Never expires - _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: true}, + nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) // Expires in future - _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, &future, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(false), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, &future, typeC, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: false}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) // Expired - claim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, &past, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(false), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + claim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, &past, typeC, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: false}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) // non expired, but revoked - revoked, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, &future, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(false), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + revoked, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, &future, typeC, nil, nil, &merklizedRootPosition, + ports.ClaimRequestProofs{BJJSignatureProof2021: false, Iden3SparseMerkleTreeProof: true}, + nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) id, err := w3c.ParseDID(*revoked.Identifier) @@ -2199,9 +2218,20 @@ func TestServer_GetCredentialQrCode(t *testing.T) { typeC := "KYCAgeCredential" merklizedRootPosition := "index" schema := "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json" - createdSIGClaim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(false), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + + createdSIGClaimProofs := ports.ClaimRequestProofs{ + BJJSignatureProof2021: true, + Iden3SparseMerkleTreeProof: false, + } + + createdMTPClaimProofs := ports.ClaimRequestProofs{ + BJJSignatureProof2021: false, + Iden3SparseMerkleTreeProof: true, + } + + createdSIGClaim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, createdSIGClaimProofs, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) - createdMTPClaim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(false), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + createdMTPClaim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, createdMTPClaimProofs, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) type expected struct { @@ -2576,9 +2606,9 @@ func TestServer_GetConnections(t *testing.T) { } merklizedRootPosition := "index" - _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, nil, schemaType, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject, nil, schemaType, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: true}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) - _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject2, nil, schemaType, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schemaURL, credentialSubject2, nil, schemaType, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: true}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) usrDID, err := w3c.ParseDID("did:polygonid:polygon:mumbai:2qE1BZ7gcmEoP2KppvFPCZqyzyb5tK9T6Gec5HFANQ") @@ -4816,7 +4846,7 @@ func TestServer_GetStateStatus(t *testing.T) { } serverWithSignatureClaim := NewServer(cfg1, identityService, claimsService, NewSchemaMock(), connectionsService, NewLinkMock(), nil, NewPublisherMock(), NewPackageManagerMock(), nil) - _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(didSignatureClaim, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(false), nil, true, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(didSignatureClaim, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: false}, nil, true, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) handlerWithSignatureClaim := getHandler(ctx, serverWithSignatureClaim) @@ -4832,7 +4862,7 @@ func TestServer_GetStateStatus(t *testing.T) { }, } serverWithMTPClaim := NewServer(cfgWithMTPClaim, identityService, claimsService, NewSchemaMock(), connectionsService, NewLinkMock(), nil, NewPublisherMock(), NewPackageManagerMock(), nil) - _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(didWithMTPClaim, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, true, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(didWithMTPClaim, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: true}, nil, true, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) handlerWithMTPClaim := getHandler(ctx, serverWithMTPClaim) @@ -4848,7 +4878,7 @@ func TestServer_GetStateStatus(t *testing.T) { }, } serverWithRevokedClaim := NewServer(cfgWithRevokedClaim, identityService, claimsService, NewSchemaMock(), connectionsService, NewLinkMock(), nil, NewPublisherMock(), NewPackageManagerMock(), nil) - cred, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(didWithRevokedClaim, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(false), nil, true, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + cred, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(didWithRevokedClaim, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: false}, nil, true, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) require.NoError(t, claimsService.Revoke(ctx, cfgWithRevokedClaim.APIUI.IssuerDID, uint64(cred.RevNonce), "not valid")) handlerWithRevokedClaim := getHandler(ctx, serverWithRevokedClaim) @@ -5065,7 +5095,8 @@ func TestServer_GetRevocationStatus(t *testing.T) { typeC := "KYCAgeCredential" merklizedRootPosition := "index" schema := "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json" - createdCredential, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + + createdCredential, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, nil, typeC, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: true}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) require.NoError(t, err) handler := getHandler(ctx, server) diff --git a/internal/core/ports/claims_service.go b/internal/core/ports/claims_service.go index f894d8f9f..47204bd19 100644 --- a/internal/core/ports/claims_service.go +++ b/internal/core/ports/claims_service.go @@ -13,11 +13,16 @@ import ( comm "github.com/iden3/iden3comm/v2" "github.com/iden3/iden3comm/v2/protocol" - "github.com/polygonid/sh-id-platform/internal/common" "github.com/polygonid/sh-id-platform/internal/core/domain" "github.com/polygonid/sh-id-platform/internal/sqltools" ) +// ClaimRequestProofs - defines the proofs that can be requested for a claim +type ClaimRequestProofs struct { + BJJSignatureProof2021 bool + Iden3SparseMerkleTreeProof bool +} + // CreateClaimRequest struct type CreateClaimRequest struct { DID *w3c.DID @@ -112,22 +117,14 @@ func NewClaimsFilter(schemaHash, schemaType, subject, queryField, queryValue *st } // NewCreateClaimRequest returns a new claim object with the given parameters -func NewCreateClaimRequest(did *w3c.DID, credentialSchema string, credentialSubject map[string]any, expiration *time.Time, typ string, cVersion *uint32, subjectPos *string, merklizedRootPosition *string, sigProof *bool, mtProof *bool, linkID *uuid.UUID, singleIssuer bool, credentialStatusType verifiable.CredentialStatusType, refreshService *verifiable.RefreshService, revNonce *uint64, displayMethod *verifiable.DisplayMethod) *CreateClaimRequest { - if sigProof == nil { - sigProof = common.ToPointer(false) - } - - if mtProof == nil { - mtProof = common.ToPointer(false) - } - +func NewCreateClaimRequest(did *w3c.DID, credentialSchema string, credentialSubject map[string]any, expiration *time.Time, typ string, cVersion *uint32, subjectPos *string, merklizedRootPosition *string, claimRequestProofs ClaimRequestProofs, linkID *uuid.UUID, singleIssuer bool, credentialStatusType verifiable.CredentialStatusType, refreshService *verifiable.RefreshService, revNonce *uint64, displayMethod *verifiable.DisplayMethod) *CreateClaimRequest { req := &CreateClaimRequest{ DID: did, Schema: credentialSchema, CredentialSubject: credentialSubject, Type: typ, - SignatureProof: *sigProof, - MTProof: *mtProof, + SignatureProof: claimRequestProofs.BJJSignatureProof2021, + MTProof: claimRequestProofs.Iden3SparseMerkleTreeProof, RefreshService: refreshService, DisplayMethod: displayMethod, } diff --git a/internal/core/services/link.go b/internal/core/services/link.go index 5edaf3581..61f07a0b7 100644 --- a/internal/core/services/link.go +++ b/internal/core/services/link.go @@ -15,7 +15,6 @@ import ( "github.com/iden3/iden3comm/v2/protocol" "github.com/jackc/pgx/v4" - "github.com/polygonid/sh-id-platform/internal/common" "github.com/polygonid/sh-id-platform/internal/core/domain" "github.com/polygonid/sh-id-platform/internal/core/event" "github.com/polygonid/sh-id-platform/internal/core/ports" @@ -246,6 +245,11 @@ func (ls *Link) IssueClaim(ctx context.Context, sessionID string, issuerDID w3c. log.Error(ctx, "cannot fetch the schema", "err", err) return err } + + claimRequestProofs := ports.ClaimRequestProofs{ + BJJSignatureProof2021: link.CredentialSignatureProof, + Iden3SparseMerkleTreeProof: link.CredentialMTPProof, + } if len(issuedByUser) == 0 { link.CredentialSubject["id"] = userDID.String() @@ -255,8 +259,7 @@ func (ls *Link) IssueClaim(ctx context.Context, sessionID string, issuerDID w3c. link.CredentialExpiration, schema.Type, nil, nil, nil, - common.ToPointer(link.CredentialSignatureProof), - common.ToPointer(link.CredentialMTPProof), + claimRequestProofs, &linkID, true, credentialStatusType, diff --git a/internal/core/services/tests/identity_test.go b/internal/core/services/tests/identity_test.go index 598aa7e08..0d080685a 100644 --- a/internal/core/services/tests/identity_test.go +++ b/internal/core/services/tests/identity_test.go @@ -71,7 +71,7 @@ func Test_identity_UpdateState(t *testing.T) { merklizedRootPosition := "index" _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, - common.ToPointer(true), common.ToPointer(true), nil, false, + ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: true}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) @@ -93,7 +93,7 @@ func Test_identity_UpdateState(t *testing.T) { merklizedRootPosition := "index" _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, - common.ToPointer(false), common.ToPointer(true), nil, false, + ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: true}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) @@ -115,7 +115,7 @@ func Test_identity_UpdateState(t *testing.T) { merklizedRootPosition := "index" claim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, - common.ToPointer(false), common.ToPointer(true), nil, false, + ports.ClaimRequestProofs{BJJSignatureProof2021: false, Iden3SparseMerkleTreeProof: true}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) @@ -141,7 +141,7 @@ func Test_identity_UpdateState(t *testing.T) { merklizedRootPosition := "index" claimMTP, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, - common.ToPointer(false), common.ToPointer(true), nil, false, + ports.ClaimRequestProofs{BJJSignatureProof2021: false, Iden3SparseMerkleTreeProof: true}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) @@ -163,7 +163,7 @@ func Test_identity_UpdateState(t *testing.T) { claimSIG, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, - common.ToPointer(true), common.ToPointer(false), nil, false, + ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: false}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) @@ -190,7 +190,7 @@ func Test_identity_UpdateState(t *testing.T) { merklizedRootPosition := "index" _, err = claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, - common.ToPointer(true), common.ToPointer(false), nil, false, + ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: false}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) @@ -205,7 +205,7 @@ func Test_identity_UpdateState(t *testing.T) { merklizedRootPosition := "index" claim, err := claimsService.Save(ctx, ports.NewCreateClaimRequest(did, schema, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, - common.ToPointer(true), common.ToPointer(false), nil, false, + ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: false}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) diff --git a/internal/core/services/tests/link_test.go b/internal/core/services/tests/link_test.go index be3c8b606..d62de7121 100644 --- a/internal/core/services/tests/link_test.go +++ b/internal/core/services/tests/link_test.go @@ -79,7 +79,7 @@ func Test_link_issueClaim(t *testing.T) { typeC := "KYCAgeCredential" merklizedRootPosition := "index" - _, err = claimsService.Save(context.Background(), ports.NewCreateClaimRequest(did, schemaUrl, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, common.ToPointer(true), common.ToPointer(true), nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) + _, err = claimsService.Save(context.Background(), ports.NewCreateClaimRequest(did, schemaUrl, credentialSubject, common.ToPointer(time.Now()), typeC, nil, nil, &merklizedRootPosition, ports.ClaimRequestProofs{BJJSignatureProof2021: true, Iden3SparseMerkleTreeProof: true}, nil, false, verifiable.Iden3commRevocationStatusV1, nil, nil, nil)) assert.NoError(t, err) linkRepository := repositories.NewLink(*storage)