Skip to content

Commit

Permalink
feat: adding nullifiers in status response
Browse files Browse the repository at this point in the history
  • Loading branch information
javip97 committed Jan 24, 2024
1 parent b911cbf commit 93f213c
Show file tree
Hide file tree
Showing 4 changed files with 135 additions and 31 deletions.
42 changes: 40 additions & 2 deletions api/api.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,18 @@ paths:
"skipClaimRevocationCheck": false,
"scope": [
{
"circuitID": "credentialAtomicQuerySigV2",
"circuitID": "credentialAtomicQueryV3-beta.0",
"id": 1,
"params": {
"nullifierSessionId": "123443290439234342342423423423423"
},
"query": {
"context": "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json-ld/kyc-v3.json-ld",
"allowedIssuers": [ "*" ],
"type": "KYCAgeCredential",
"credentialSubject": {
"birthday": {
"$eq": 19960424
"$lt": 20201010
}
}
}
Expand Down Expand Up @@ -266,6 +269,23 @@ components:
x-omitempty: false
example:
'eyJhbGciOiJncm90aDE2IiwiY2lyY3VpdElkIjoiYXV0aFYyIiwiY3JpdCI6WyJjaXJjdWl0SWQiXSwidHlwIjoiYXBwbGljYXRpb24vaWRlbjMtemtwLWpzb24ifQ.eyJpZCI6IjBlM2Y1YWEwLTZkN2EtNDE5OS1hNDBkLTg2MTU0MTE0MGMxZiIsInR5cCI6ImFwcGxpY2F0aW9uL2lkZW4zLXprcC1qc29uIiwidHlwZSI6Imh0dHBzOi8vaWRlbjMtY29tbXVuaWNhdGlvbi5pby9hdXRob3JpemF0aW9uLzEuMC9yZXNwb25zZSIsInRoaWQiOiJiMzI4YzMzOS0zZWQyLTQzMTItYTg1YS04YmIyMzhmYTk4MDkiLCJib2R5Ijp7ImRpZF9kb2MiOnsiY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvbnMvZGlkL3YxIl0sImlkIjoiZGlkOnBvbHlnb25pZDpwb2x5Z29uOm11bWJhaToycUYxYnBLWjhSMk1WVnE5R3dRUkI1NEoxcVNabmVTR0d6bThHaEZrNkciLCJzZXJ2aWNlIjpbeyJpZCI6ImRpZDpwb2x5Z29uaWQ6cG9seWdvbjptdW1iYWk6MnFGMWJwS1o4UjJNVlZxOUd3UVJCNTRKMXFTWm5lU0dHem04R2hGazZHI3B1c2giLCJ0eXBlIjoicHVzaC1ub3RpZmljYXRpb24iLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwczovL3B1c2gtc3RhZ2luZy5wb2x5Z29uaWQuY29tL2FwaS92MSIsIm1ldGFkYXRhIjp7ImRldmljZXMiOlt7ImNpcGhlcnRleHQiOiJLd1p3aHNrSFRzY1lrRDVOUE5IVjhXZ1FOMVJ0d3Z6d3czWW5BZ0d0UGNhbHp5S0RYWVVJOVhIOENoYk5kY3c3THhhNFcyNjltSE81WkRsSWZRZ0NhTTc4c0g1ZWRhRGFidkNEeU5ERS83akJuL1JzTnoxR0oyL0tlMm5GQ3Axajk1MGVRdU80MXpFcjVMT0lEajlwQ0xNQVhjY28yOGJybklyRkZJeEo4dS9keEJrbWdiek5DcUZKbnhlYnNVTFZjT055bE5VR1dCNzl6MnhhTXVvVzZCaWlnZkI4UjJGOUF2ZkJSdDEzK1ZqSlFhTHBCejc3S0hTbXd3cVpCZ2xHZ0NkTElxMTZ5c3FmUDJ6MVM4M3lWbWEzdmdiTVdmSGozNkxQaUR1ZVYyOUwxS1ZSRUZFdG91Vk9oYVRlS2Q4Z0RIRGx1RVJXamJiZ1BDcENhNGZMTnZQMWkrYlZZNlBrbUsxQTFvMnl4Y1pRKzh5bkorU2NtK2Vyb3ZUQjgycVlDTnlKd0hVZGRsdVNkZ0NkaWpMWlh3TW5CRjMwalVMR2hWaGxzSlNUZTFiem92bmVqVk0wbXhUUlNHSi9reGFRc0lXVWkwMjJRWmVHeDJJNXpseG1vZitTWWZ3UWs5VnMvREZWMUdSTzh4YnpvQWVlS1U4bGJlZXRoR2d0RFZTWGx0Wjk3b0pwSDR6a25TTTJMWW1yWVBaMUwwMGdMTFhvU0s2SllMZ2U2YWlGSVIyZ2YySW00Q29Qa0FjMGxhUjA2REJYb2FUWEY1M3Q1VlBsNkc1cTlkVm9Ldld6ekY2Y2hua2FJZ0Z1aFQwQStjMHNtaHplcSs3UFUxOTBxMEt4Wmo5YmtQUUYwNENwQUlTZzFPQVVudEVtQ0NGaWt4UWF3NHh0djJmbzRxWT0iLCJhbGciOiJSU0EtT0FFUC01MTIifV19fV19LCJtZXNzYWdlIjpudWxsLCJzY29wZSI6W3sicHJvb2YiOnsicGlfYSI6WyIxMjkxNjg4NzE0MDg1NDQ1Nzg5MjY0NzYyMDUwMjA5MTg1MzUyNzIyMzI4NDUwODY0MzU5NzE3NDI2ODIyMDkwMDQ2MDQ3NDQ3NTE2MSIsIjc4MTU4ODU5NjEwMzc0NTA4MTcxMTQ4NTI3OTg3OTE0Mzc3MjMzMjQ4MTY1NzQzMjkzNjY0NTE3MDU0NzA1NjQzOTgzNTQyMjYyMDQiLCIxIl0sInBpX2IiOltbIjE0NjI1OTM0OTE3ODU1NDg5NjQ3MzI2MDQ2MzA3NTYyODU3OTYxNDI0NzU2MjM3MjUzMDIxMzE3MTM1OTIyODMzODIwNjExMTk0MDQ2IiwiNTAxODc0NTQ2MzAwMjIzODI1OTI0NTU3NDQyNjQzMTE3MDAyMjI1NDc0MjY5NTIzMDM0Mzg5MDE0MzIzMzQxOTA3NjU4NjA4MjAwOCJdLFsiOTc3NzYxMDI5MDcwMDQxNTcxNjQzNzk3MjgwODcwMTg1MzYzMTg2NjA0Mzc4MjU1NDE0MDc5NDAyNTM2MjE1ODU3MjMzMDEyNjQwMSIsIjM0MzIxOTEwMTg1MjExODQwMjExNDQwODQyNTk0MDg4OTQ1NTYyNTA2NzE2NzQ1NjI3NzMyODYwMjUxOTcyNTQ0Nzc4NTkzNzQ0OTgiXSxbIjEiLCIwIl1dLCJwaV9jIjpbIjYwMzkzNDI2MjI2NjYzMzg2NDU1MTI1MTAzNjM3MzU4NDk1NTIxNzg0NTc4NjY2OTExNzQ0MzU5MzczODkzOTkyNDExODkzMDYyNDYiLCIxOTc1MDI0NjU3NDQzNDIxNDYwNjE3NDc4NjE5MTQzMjE5OTA5ODgxNjIxMTg5Mjg1MjMyNjYyNzg1MTk4NzAyMjgwNDQxMzY4OTQ2OSIsIjEiXSwicHJvdG9jb2wiOiJncm90aDE2IiwiY3VydmUiOiJibjEyOCJ9LCJwdWJfc2lnbmFscyI6WyIxIiwiMjQ1MTc1NTUyNzkwMjgzNTMwNTExNzgxNTc0NjAzOTk5MzE5OTQzMzk3NTU4NTY2ODk5ODk2MjMxNTczOTUyODYxNzQyMDg1MTQiLCIxOTUxMDEzMjk5NjcyNTM2NjU5NjQ1NDU2ODc4NDY2MjYwMTU2MjYwOTM1MDMyNzEzMzE2NDgxMDcwNzUzMzg5NDU1Nzc3Njg1NDAxMiIsIjEiLCIyMTE5NjQyNTkyNTU0MDYxMTgzNDA3MjA1MDQyNDI0NTkwNzUyMjM3NzY1Mzg1MjYxMjMzNDgwNzUxNDI0NzE4MDM1NDMyNzA0MiIsIjEiLCIxMDc5MzQ3Njc5NzgzNzgzNjA3MjM5Mjc1ODIxNTQ0MTQ5MzMwNDEzNzkxOTk4NDc5MjI4MTAyMjM0MDg2NDI3ODIyODg1OTg1MjMwNiIsIjE3MDI2MzMzMzciLCIxMDYyMjgxMzg1NzgxNzczNzE1NTY0MTI3MzQ3NDAyNTk0MDUwNzMiLCIwIiwiODI2MjE1ODQ1MTY0NTQ2NjExNjgyNTYwMTg4OTUwMzAxMTkwODYwMTE1NTE3NTI3Mzk2ODY4NjkwMDk2MjI1MTk0MzQ5NjIyNzAzOSIsIjAiLCIxIiwiMSIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCIsIjAiLCIwIiwiMCJdLCJpZCI6MSwiY2lyY3VpdElkIjoiY3JlZGVudGlhbEF0b21pY1F1ZXJ5U2lnVjIifV19LCJmcm9tIjoiZGlkOnBvbHlnb25pZDpwb2x5Z29uOm11bWJhaToycUYxYnBLWjhSMk1WVnE5R3dRUkI1NEoxcVNabmVTR0d6bThHaEZrNkciLCJ0byI6ImRpZDpwb2x5Z29uaWQ6cG9seWdvbjptdW1iYWk6MnFIN1RzdHBSUkpIWE5ONG80OUZ1OUgyUWlzbWt1OGhRZVV4RFZyanFUIn0.eyJwcm9vZiI6eyJwaV9hIjpbIjE2MDY2Mzc4ODgyMjA4MTkzMjg3MDkzNzQxMjE3MDUyMjU0NzkxODgwMTg2MzE0MjMxMTU5MDI2MTczMzI5OTkzODczMDk1MTA0NzgwIiwiMTkyOTI4MjgwMzI5MzcyNzczOTk5MDU2OTY4MDAzMzA3NDY3MzAzMTYyOTMyNDU0NzY2NjA2NTk0Mjc1NTU5NzczMjY4OTU1MzI1MTgiLCIxIl0sInBpX2IiOltbIjE2MTE2ODY0NTc2MDg5NDQ5NzY4NDI5MDg5NjE5ODEyODk4NDQ0ODQwMDMwMTE1MjU5NjEwNzE5MTc1Nzc0MTIxNDEyMTM2NTI0OTQ2IiwiNzY4MzYzMzc3MjY2MjY3OTM0NjM3Nzc0NzYxNzU5NDg0MjgzOTM4OTI2MDUzMzcyNDQ4NDQzMTY5MDkzOTM1OTQxMjc5ODI4MTU0Il0sWyIxODY4NzQ3ODU2Mzk4OTQ2NjMzMDUwNjQyMjc3Nzc1MTM4NTY5NTY4MDk4NjMyNjY4NjEwMTY5NjQ5MDY4MDg3NTgzNTIyMTk0NjU0NiIsIjEwMzY1MjMwNDIxOTAxNTI3NDgwMzM0MTUwMTMyMDk5NzI0MTc2NDMxNDg2NTcyNzExMDI4NTQ3MDAyMzQ4NzQ0MTUwNDI4Nzc2OTY4Il0sWyIxIiwiMCJdXSwicGlfYyI6WyIyMTE4NDU4NDU3NTM2NTQ2MDIzMjY0ODc4NTk5Nzg1MzQ1Mjc4Njg5MzEzNDY5MTU3MzI3Nzc4MDI2NzU3NzQ0MDcxMTgyODgzNzYyNSIsIjYzNjY5NjgxOTQ1OTAzNTk3Mjc5ODczMTYxNjU5MTUyMjEzMTU5MTAxNzI2NDM1ODcwMzc4MDc3NzY2MTUyNjk1ODgxMjkyMTUwNjMiLCIxIl0sInByb3RvY29sIjoiZ3JvdGgxNiIsImN1cnZlIjoiYm4xMjgifSwicHViX3NpZ25hbHMiOlsiMjQ1MTc1NTUyNzkwMjgzNTMwNTExNzgxNTc0NjAzOTk5MzE5OTQzMzk3NTU4NTY2ODk5ODk2MjMxNTczOTUyODYxNzQyMDg1MTQiLCIxNjA3MjY1NzAyMjIxODcxMTM3NjYzNTEzNDg3NjkxNzUyODAzOTk3OTA1MjA0NTI4MjIzNDE0MjA4ODMyOTgyNjIxNzUwNDE0MDQzNSIsIjQyMTc4MjI2NjU0MzM4MDcyMjg1MjY0NjU4MTE4MTU3Nzk1OTk3ODczMTc3Mzk1NTYxODc2Nzg1ODkxNjM3ODI4ODkzMjQ2MTU5ODQiXX0'
jwzMetadata:
$ref: '#/components/schemas/JWZMetadata'

JWZMetadata:
type: object
required:
- userDID
properties:
userDID:
type: string
example: 'did:polygonid:polygon:mumbai:2qH7TstpRRJHXNN4o49Fu9H2Qismku8hQeUxDVrjqT'
nullifiers:
type: array
x-omitempty: false
items:
$ref: '#/components/schemas/JWZProofs'



Health:
Expand Down Expand Up @@ -482,6 +502,24 @@ components:
type: string
example: 'polygon-mumbai'

JWZProofs:
type: object
required:
- scopeID
- nullifier
- nullifierSessionID
properties:
scopeID:
type: integer
format: uint32
example: 1
nullifierSessionID:
type: string
example: '123443290439234342342423423423423'
nullifier:
type: string
example: '1234'

UUID:
type: string
x-go-type: uuid.UUID
Expand Down
16 changes: 15 additions & 1 deletion internal/api/api.gen.go

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

93 changes: 65 additions & 28 deletions internal/api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import (

"github.com/go-chi/chi/v5"
"github.com/google/uuid"
"github.com/iden3/go-circuits/v2"
auth "github.com/iden3/go-iden3-auth/v2"
"github.com/iden3/go-iden3-auth/v2/loaders"
"github.com/iden3/go-iden3-auth/v2/pubsignals"
Expand All @@ -24,6 +25,7 @@ import (
"github.com/0xPolygonID/verifier-backend/internal/common"
"github.com/0xPolygonID/verifier-backend/internal/config"
"github.com/0xPolygonID/verifier-backend/internal/loader"
"github.com/0xPolygonID/verifier-backend/internal/models"
)

const (
Expand All @@ -34,7 +36,7 @@ const (
statusError = "error"
mumbaiNetwork = "80001"
mainnetNetwork = "137"
defaultReason = "test flow"
defaultReason = "for testing purposes"
)

// Server represents the API server
Expand Down Expand Up @@ -109,7 +111,7 @@ func (s *Server) Callback(ctx context.Context, request CallbackRequestObject) (C
return nil, err
}

_, err = verifier.FullVerify(ctx, *request.Body,
authRespMsg, err := verifier.FullVerify(ctx, *request.Body,
authRequest.(protocol.AuthorizationRequestMessage),
pubsignals.WithAcceptedStateTransitionDelay(stateTransitionDelay))
if err != nil {
Expand All @@ -121,7 +123,12 @@ func (s *Server) Callback(ctx context.Context, request CallbackRequestObject) (C
return nil, err
}

s.cache.Set(sessionID.String(), *request.Body, cache.DefaultExpiration)
scopes, err := getVerificationResponseScopes(authRespMsg.Body.Scope)
if err != nil {
return nil, err
}

s.cache.Set(sessionID.String(), models.VerificationResponse{Jwz: *request.Body, UserDID: authRespMsg.From, Scopes: scopes}, cache.DefaultExpiration)

return Callback200JSONResponse{}, nil
}
Expand Down Expand Up @@ -279,31 +286,8 @@ func (s *Server) Status(_ context.Context, request StatusRequestObject) (StatusR
Status: statusError,
Message: common.ToPointer(value.Error()),
}, nil
case string:
b, err := json.Marshal(value)
if err != nil {
log.Println(err.Error())
return Status500JSONResponse{
N500JSONResponse: N500JSONResponse{
Message: "failed to marshal response",
},
}, nil
}
//nolint // -
var m string
err = json.Unmarshal(b, &m)
if err != nil {
log.Errorf("failed to unmarshal response: %v", err)
return Status500JSONResponse{
N500JSONResponse: N500JSONResponse{
Message: "failed to unmarshal response",
},
}, nil
}
return Status200JSONResponse{
Status: statusSuccess,
Jwz: common.ToPointer(m),
}, nil
case models.VerificationResponse:
return getStatusVerificationResponse(value), nil
}
return nil, nil
}
Expand Down Expand Up @@ -588,3 +572,56 @@ func getReason(reason *string) string {
}
return *reason
}

func getVerificationResponseScopes(scopes []protocol.ZeroKnowledgeProofResponse) ([]models.VerificationResponseScope, error) {
if len(scopes) == 0 {
return nil, errors.New("scopes are empty")
}

if scopes[0].CircuitID != "credentialAtomicQueryV3-beta.0" {
return []models.VerificationResponseScope{}, nil
}

resp := make([]models.VerificationResponseScope, 0, len(scopes))
ps := circuits.AtomicQueryV3PubSignals{}
for _, scope := range scopes {
signals, err := json.Marshal(scope.PubSignals)
if err != nil {
return nil, err
}

if err := ps.PubSignalsUnmarshal(signals); err != nil {
return nil, err
}

resp = append(resp, models.VerificationResponseScope{
ID: scope.ID,
NullifierSessionID: ps.NullifierSessionID.String(),
Nullifier: ps.Nullifier.String(),
})
}

return resp, nil
}

func getStatusVerificationResponse(verification models.VerificationResponse) Status200JSONResponse {
jwzMetadata := &JWZMetadata{UserDID: verification.UserDID}

if len(verification.Scopes) > 0 {
nullifiers := make([]JWZProofs, 0, len(verification.Scopes))
for _, scope := range verification.Scopes {
nullifiers = append(nullifiers, JWZProofs{
ScopeID: scope.ID,
NullifierSessionID: scope.NullifierSessionID,
Nullifier: scope.Nullifier,
})
}
jwzMetadata.Nullifiers = &nullifiers
}

return Status200JSONResponse{
Status: statusSuccess,
Jwz: common.ToPointer(verification.Jwz),
JwzMetadata: jwzMetadata,
}
}
15 changes: 15 additions & 0 deletions internal/models/verification.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package models

// VerificationResponse is the struct for verification response
type VerificationResponse struct {
Jwz string
UserDID string
Scopes []VerificationResponseScope
}

// VerificationResponseScope is the struct for verification response scope
type VerificationResponseScope struct {
ID uint32
NullifierSessionID string
Nullifier string
}

0 comments on commit 93f213c

Please sign in to comment.