From 04673c84f82798227ee5a22a7619365eb824868b Mon Sep 17 00:00:00 2001 From: Oleh Lomaka Date: Mon, 18 Mar 2024 12:27:42 -0400 Subject: [PATCH] Query.Values could be nil for V3 circuits (#83) --- credentialAtomicQueryV3.go | 4 - credentialAtomicQueryV3OnChain.go | 4 - credentialAtomicQueryV3OnChain_test.go | 105 +++++ credentialAtomicQueryV3_test.go | 66 +++ testdata/V3_mtp_noop_inputs.json | 322 ++++++++++++++ testdata/onchain_V3_sig_noop_inputs.json | 507 +++++++++++++++++++++++ 6 files changed, 1000 insertions(+), 8 deletions(-) create mode 100644 testdata/V3_mtp_noop_inputs.json create mode 100755 testdata/onchain_V3_sig_noop_inputs.json diff --git a/credentialAtomicQueryV3.go b/credentialAtomicQueryV3.go index f51b16d..d309a68 100644 --- a/credentialAtomicQueryV3.go +++ b/credentialAtomicQueryV3.go @@ -123,10 +123,6 @@ func (a AtomicQueryV3Inputs) Validate() error { return errors.New(ErrorEmptyClaimNonRevProof) } - if a.Query.Values == nil { - return errors.New(ErrorEmptyQueryValue) - } - if err := a.Query.ValidateValueArraySize(a.GetValueArrSize()); err != nil { return err } diff --git a/credentialAtomicQueryV3OnChain.go b/credentialAtomicQueryV3OnChain.go index c5bf9df..ef32c79 100644 --- a/credentialAtomicQueryV3OnChain.go +++ b/credentialAtomicQueryV3OnChain.go @@ -159,10 +159,6 @@ func (a AtomicQueryV3OnChainInputs) Validate() error { return errors.New(ErrorEmptyClaimNonRevProof) } - if a.Query.Values == nil { - return errors.New(ErrorEmptyQueryValue) - } - if err := a.Query.ValidateValueArraySize(a.GetValueArrSize()); err != nil { return err } diff --git a/credentialAtomicQueryV3OnChain_test.go b/credentialAtomicQueryV3OnChain_test.go index 14cfb24..34fb992 100644 --- a/credentialAtomicQueryV3OnChain_test.go +++ b/credentialAtomicQueryV3OnChain_test.go @@ -119,6 +119,111 @@ func TestAttrQueryV3OnChain_SigPart_PrepareInputs(t *testing.T) { require.JSONEq(t, exp, string(bytesInputs)) } +func TestAttrQueryV3OnChain_SigPart_Noop_PrepareInputs(t *testing.T) { + + user := it.NewIdentity(t, userPK) + + issuer := it.NewIdentity(t, issuerPK) + + subjectID := user.ID + profileNonce := big.NewInt(0) + + nonceSubject := big.NewInt(0) + + claim := it.DefaultUserClaim(t, subjectID) + + // Sig claim + claimSig := issuer.SignClaim(t, claim) + + issuerClaimNonRevMtp, _ := issuer.ClaimRevMTPRaw(t, claim) + + issuerAuthClaimNonRevMtp, _ := issuer.ClaimRevMTPRaw(t, issuer.AuthClaim) + issuerAuthClaimMtp, _ := issuer.ClaimMTPRaw(t, issuer.AuthClaim) + + gTree := it.GISTTree(context.Background()) + err := gTree.Add(context.Background(), issuer.ID.BigInt(), issuer.State(t).BigInt()) + require.NoError(t, err) + globalProof, _, err := gTree.GenerateProof(context.Background(), user.ID.BigInt(), nil) + require.NoError(t, err) + authClaimIncMTP, _ := user.ClaimMTPRaw(t, user.AuthClaim) + authClaimNonRevMTP, _ := user.ClaimRevMTPRaw(t, user.AuthClaim) + require.NoError(t, err) + challenge := big.NewInt(10) + signature, err := user.SignBBJJ(challenge.Bytes()) + require.NoError(t, err) + + in := AtomicQueryV3OnChainInputs{ + RequestID: big.NewInt(23), + ID: &user.ID, + ProfileNonce: profileNonce, + ClaimSubjectProfileNonce: nonceSubject, + Claim: ClaimWithSigAndMTPProof{ + IssuerID: &issuer.ID, + Claim: claim, + NonRevProof: MTProof{ + TreeState: TreeState{ + State: issuer.State(t), + ClaimsRoot: issuer.Clt.Root(), + RevocationRoot: issuer.Ret.Root(), + RootOfRoots: issuer.Rot.Root(), + }, + Proof: issuerClaimNonRevMtp, + }, + SignatureProof: &BJJSignatureProof{ + Signature: claimSig, + IssuerAuthClaim: issuer.AuthClaim, + IssuerAuthIncProof: MTProof{ + TreeState: TreeState{ + State: issuer.State(t), + ClaimsRoot: issuer.Clt.Root(), + RevocationRoot: issuer.Ret.Root(), + RootOfRoots: issuer.Rot.Root(), + }, + Proof: issuerAuthClaimMtp, + }, + IssuerAuthNonRevProof: MTProof{ + TreeState: TreeState{ + State: issuer.State(t), + ClaimsRoot: issuer.Clt.Root(), + RevocationRoot: issuer.Ret.Root(), + RootOfRoots: issuer.Rot.Root(), + }, + Proof: issuerAuthClaimNonRevMtp, + }, + }, + }, + Query: Query{ + ValueProof: nil, + Operator: NOOP, + Values: nil, + SlotIndex: 2, + }, + CurrentTimeStamp: timestamp, + ProofType: BJJSignatureProofType, + AuthClaim: user.AuthClaim, + AuthClaimIncMtp: authClaimIncMTP, + AuthClaimNonRevMtp: authClaimNonRevMTP, + TreeState: GetTreeState(t, user), + GISTProof: GISTProof{ + Root: gTree.Root(), + Proof: globalProof, + }, + Signature: signature, + Challenge: challenge, + LinkNonce: big.NewInt(0), + VerifierID: it.IDFromStr( + t, "21929109382993718606847853573861987353620810345503358891473103689157378049"), + NullifierSessionID: big.NewInt(32), + IsBJJAuthEnabled: 1, + } + + bytesInputs, err := in.InputsMarshal() + require.Nil(t, err) + + exp := it.TestData(t, "onchain_V3_sig_noop_inputs", string(bytesInputs), *generate) + require.JSONEq(t, exp, string(bytesInputs)) +} + func TestAttrQueryV3OnChain_MTPPart_PrepareInputs(t *testing.T) { user := it.NewIdentity(t, userPK) diff --git a/credentialAtomicQueryV3_test.go b/credentialAtomicQueryV3_test.go index 17c59e7..ff6adf7 100644 --- a/credentialAtomicQueryV3_test.go +++ b/credentialAtomicQueryV3_test.go @@ -162,6 +162,72 @@ func TestAttrQueryV3_MTPPart_PrepareInputs(t *testing.T) { } +func TestAttrQueryV3_MTPPart_Noop_PrepareInputs(t *testing.T) { + user := it.NewIdentity(t, userPK) + issuer := it.NewIdentity(t, issuerPK) + + nonce := big.NewInt(0) + + subjectID := user.ID + nonceSubject := big.NewInt(0) + + claim := it.DefaultUserClaim(t, subjectID) + + issuer.AddClaim(t, claim) + + issuerClaimMtp, _ := issuer.ClaimMTPRaw(t, claim) + + issuerClaimNonRevMtp, _ := issuer.ClaimRevMTPRaw(t, claim) + + in := AtomicQueryV3Inputs{ + RequestID: big.NewInt(23), + ID: &user.ID, + ProfileNonce: nonce, + ClaimSubjectProfileNonce: nonceSubject, + Claim: ClaimWithSigAndMTPProof{ + IssuerID: &issuer.ID, + Claim: claim, + IncProof: &MTProof{ + Proof: issuerClaimMtp, + TreeState: TreeState{ + State: issuer.State(t), + ClaimsRoot: issuer.Clt.Root(), + RevocationRoot: issuer.Ret.Root(), + RootOfRoots: issuer.Rot.Root(), + }, + }, + NonRevProof: MTProof{ + TreeState: TreeState{ + State: issuer.State(t), + ClaimsRoot: issuer.Clt.Root(), + RevocationRoot: issuer.Ret.Root(), + RootOfRoots: issuer.Rot.Root(), + }, + Proof: issuerClaimNonRevMtp, + }, + }, + Query: Query{ + ValueProof: nil, + Operator: NOOP, + Values: nil, + SlotIndex: 2, + }, + CurrentTimeStamp: timestamp, + ProofType: Iden3SparseMerkleTreeProofType, + LinkNonce: big.NewInt(0), + VerifierID: it.IDFromStr( + t, "21929109382993718606847853573861987353620810345503358891473103689157378049"), + NullifierSessionID: big.NewInt(32), + } + + bytesInputs, err := in.InputsMarshal() + require.Nil(t, err) + + exp := it.TestData(t, "V3_mtp_noop_inputs", string(bytesInputs), *generate) + require.JSONEq(t, exp, string(bytesInputs)) + +} + func TestAtomicQueryV3Outputs_Sig_CircuitUnmarshal(t *testing.T) { out := new(AtomicQueryV3PubSignals) err := out.PubSignalsUnmarshal([]byte( diff --git a/testdata/V3_mtp_noop_inputs.json b/testdata/V3_mtp_noop_inputs.json new file mode 100644 index 0000000..35624fa --- /dev/null +++ b/testdata/V3_mtp_noop_inputs.json @@ -0,0 +1,322 @@ +{ + "requestID": "23", + "userGenesisID": "26109404700696283154998654512117952420503675471097392618762221546565140481", + "profileNonce": "0", + "claimSubjectProfileNonce": "0", + "issuerID": "27918766665310231445021466320959318414450284884582375163563581940319453185", + "issuerClaim": [ + "3583233690122716044519380227940806650830", + "26109404700696283154998654512117952420503675471097392618762221546565140481", + "10", + "0", + "30803922965249841627828060161", + "0", + "0", + "0" + ], + "issuerClaimNonRevClaimsTreeRoot": "21551875744466996287712204148827400686061292275961899951444219768723484280073", + "issuerClaimNonRevRevTreeRoot": "0", + "issuerClaimNonRevRootsTreeRoot": "0", + "issuerClaimNonRevState": "19157496396839393206871475267813888069926627705277243727237933406423274512449", + "issuerClaimNonRevMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "issuerClaimNonRevMtpAuxHi": "0", + "issuerClaimNonRevMtpAuxHv": "0", + "issuerClaimNonRevMtpNoAux": "1", + "claimSchema": "180410020913331409885634153623124536270", + "issuerClaimSignatureR8x": "0", + "issuerClaimSignatureR8y": "0", + "issuerClaimSignatureS": "0", + "issuerAuthClaim": ["0", "0", "0", "0", "0", "0", "0", "0"], + "issuerAuthClaimMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "issuerAuthClaimNonRevMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "issuerAuthClaimNonRevMtpAuxHi": "0", + "issuerAuthClaimNonRevMtpAuxHv": "0", + "issuerAuthClaimNonRevMtpNoAux": "0", + "issuerAuthClaimsTreeRoot": "0", + "issuerAuthRevTreeRoot": "0", + "issuerAuthRootsTreeRoot": "0", + "issuerAuthState": "0", + "isRevocationChecked": 1, + "claimPathMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "claimPathMtpNoAux": "1", + "claimPathMtpAuxHi": "0", + "claimPathMtpAuxHv": "0", + "claimPathKey": "0", + "claimPathValue": "0", + "operator": 0, + "slotIndex": 2, + "timestamp": 1642074362, + "value": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "valueArraySize": 0, + "issuerClaimMtp": [ + "0", + "10304430946970870697981400054531724100803206948489006715521525892274350097449", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "issuerClaimClaimsTreeRoot": "21551875744466996287712204148827400686061292275961899951444219768723484280073", + "issuerClaimRevTreeRoot": "0", + "issuerClaimRootsTreeRoot": "0", + "issuerClaimIdenState": "19157496396839393206871475267813888069926627705277243727237933406423274512449", + "proofType": "2", + "linkNonce": "0", + "verifierID": "21929109382993718606847853573861987353620810345503358891473103689157378049", + "nullifierSessionID": "32" +} diff --git a/testdata/onchain_V3_sig_noop_inputs.json b/testdata/onchain_V3_sig_noop_inputs.json new file mode 100755 index 0000000..f822323 --- /dev/null +++ b/testdata/onchain_V3_sig_noop_inputs.json @@ -0,0 +1,507 @@ +{ + "requestID": "23", + "userGenesisID": "26109404700696283154998654512117952420503675471097392618762221546565140481", + "profileNonce": "0", + "claimSubjectProfileNonce": "0", + "issuerID": "27918766665310231445021466320959318414450284884582375163563581940319453185", + "issuerClaim": [ + "3583233690122716044519380227940806650830", + "26109404700696283154998654512117952420503675471097392618762221546565140481", + "10", + "0", + "30803922965249841627828060161", + "0", + "0", + "0" + ], + "issuerClaimNonRevClaimsTreeRoot": "10304430946970870697981400054531724100803206948489006715521525892274350097449", + "issuerClaimNonRevRevTreeRoot": "0", + "issuerClaimNonRevRootsTreeRoot": "0", + "issuerClaimNonRevState": "20177832565449474772630743317224985532862797657496372535616634430055981993180", + "issuerClaimNonRevMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "issuerClaimNonRevMtpAuxHi": "0", + "issuerClaimNonRevMtpAuxHv": "0", + "issuerClaimNonRevMtpNoAux": "1", + "claimSchema": "180410020913331409885634153623124536270", + "issuerClaimSignatureR8x": "1651985418874087649697147889073653461168250997226887249132054770010575868904", + "issuerClaimSignatureR8y": "21186185889289266863036576968009990777000485497741800844819909873882380374550", + "issuerClaimSignatureS": "1462737848034339569304412491966425713268123077483712855404323511126257598464", + "issuerAuthClaim": [ + "80551937543569765027552589160822318028", + "0", + "9582165609074695838007712438814613121302719752874385708394134542816240804696", + "18271435592817415588213874506882839610978320325722319742324814767882756910515", + "11203087622270641253", + "0", + "0", + "0" + ], + "issuerAuthClaimMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "issuerAuthClaimNonRevMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "issuerAuthClaimNonRevMtpAuxHi": "0", + "issuerAuthClaimNonRevMtpAuxHv": "0", + "issuerAuthClaimNonRevMtpNoAux": "1", + "issuerAuthClaimsTreeRoot": "10304430946970870697981400054531724100803206948489006715521525892274350097449", + "issuerAuthRevTreeRoot": "0", + "issuerAuthRootsTreeRoot": "0", + "issuerAuthState": "20177832565449474772630743317224985532862797657496372535616634430055981993180", + "isRevocationChecked": 1, + "claimPathMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "claimPathMtpNoAux": "1", + "claimPathMtpAuxHi": "0", + "claimPathMtpAuxHv": "0", + "claimPathKey": "0", + "claimPathValue": "0", + "operator": 0, + "slotIndex": 2, + "timestamp": 1642074362, + "value": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "authClaim": [ + "80551937543569765027552589160822318028", + "0", + "17640206035128972995519606214765283372613874593503528180869261482403155458945", + "20634138280259599560273310290025659992320584624461316485434108770067472477956", + "15930428023331155902", + "0", + "0", + "0" + ], + "authClaimIncMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "authClaimNonRevMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "authClaimNonRevMtpAuxHi": "0", + "authClaimNonRevMtpAuxHv": "0", + "authClaimNonRevMtpNoAux": "1", + "challenge": "10", + "challengeSignatureR8x": "2436614617352067078274240654647841101298221663194055411539273018411814965042", + "challengeSignatureR8y": "18597752099468941062473075570139025288787892531282848931228194191266230422780", + "challengeSignatureS": "1642466479083925938589665711747519202726798003514101885795868643287098549939", + "userClaimsTreeRoot": "9860409408344985873118363460916733946840214387455464863344022463808838582364", + "userRevTreeRoot": "0", + "userRootsTreeRoot": "0", + "userState": "1648710229725601204870171311149827592640182384459240511403224642152766848235", + "gistRoot": "11098939821764568131087645431296528907277253709936443029379587475821759259406", + "gistMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "gistMtpAuxHi": "27918766665310231445021466320959318414450284884582375163563581940319453185", + "gistMtpAuxHv": "20177832565449474772630743317224985532862797657496372535616634430055981993180", + "gistMtpNoAux": "0", + "proofType": "1", + "issuerClaimMtp": [ + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0", + "0" + ], + "valueArraySize": 0, + "issuerClaimClaimsTreeRoot": "0", + "issuerClaimRevTreeRoot": "0", + "issuerClaimRootsTreeRoot": "0", + "issuerClaimIdenState": "0", + "linkNonce": "0", + "verifierID": "21929109382993718606847853573861987353620810345503358891473103689157378049", + "nullifierSessionID": "32", + "isBJJAuthEnabled": "1" +}