Skip to content

Commit

Permalink
chore: add proofs to create claim endpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
martinsaporiti committed Jun 25, 2024
1 parent 3b5670a commit b324263
Show file tree
Hide file tree
Showing 10 changed files with 155 additions and 52 deletions.
7 changes: 7 additions & 0 deletions api/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -675,6 +675,13 @@ components:
$ref: '#/components/schemas/RefreshService'
displayMethod:
$ref: '#/components/schemas/DisplayMethod'
proofs:
type: array
items:
type: string
x-omitempty: false
example: "[ BJJSignatureProof2021, Iden3SparseMerkleTreeProof]"
enum: [ BJJSignatureProof2021, Iden3SparseMerkleTreeProof]
example:
credentialSchema: "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json/KYCAgeCredential-v3.json"
type: "KYCAgeCredential"
Expand Down
32 changes: 21 additions & 11 deletions internal/api/api.gen.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

23 changes: 22 additions & 1 deletion internal/api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,9 @@ func (s *Server) CreateIdentity(ctx context.Context, request CreateIdentityReque

// CreateClaim is claim creation controller
func (s *Server) CreateClaim(ctx context.Context, request CreateClaimRequestObject) (CreateClaimResponseObject, error) {
const BJJSignatureProof2021 = "BJJSignatureProof2021"
const Iden3SparseMerkleTreeProof = "Iden3SparseMerkleTreeProof"

did, err := w3c.ParseDID(request.Identifier)
if err != nil {
return CreateClaim400JSONResponse{N400JSONResponse{Message: err.Error()}}, nil
Expand All @@ -160,7 +163,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) == BJJSignatureProof2021 {
claimRequestProofs.BJJSignatureProof2021 = true
continue
}
if string(proof) == Iden3SparseMerkleTreeProof {
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)
Expand Down
26 changes: 25 additions & 1 deletion internal/api/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -556,6 +556,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)
Expand Down Expand Up @@ -1400,7 +1420,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 {
Expand Down
12 changes: 11 additions & 1 deletion internal/api_ui/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
61 changes: 46 additions & 15 deletions internal/api_ui/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)

Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 {
Expand Down Expand Up @@ -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")
Expand Down Expand Up @@ -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)

Expand All @@ -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)

Expand All @@ -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)
Expand Down Expand Up @@ -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)
Expand Down
Loading

0 comments on commit b324263

Please sign in to comment.