From c7f498dfd62a4d90d48745b11875025a9aab54ce Mon Sep 17 00:00:00 2001 From: Oleg Lomaka Date: Wed, 20 Mar 2024 13:41:25 -0400 Subject: [PATCH] validate linked multi query --- errors.go | 4 ++++ linkedMultiQuery.go | 34 +++++++++++++++++++++++++++++ linkedMultiQuery_test.go | 47 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+) diff --git a/errors.go b/errors.go index cae9021..5f5ee78 100644 --- a/errors.go +++ b/errors.go @@ -21,6 +21,10 @@ const ( ErrorEmptyChallenge = "empty challenge" ErrorEmptyGISTProof = "empty GIST identity mtp proof" ErrorEmptyRequestID = "empty request ID" + ErrorEmptyLinkNonce = "empty link nonce" + ErrorEmptyClaim = "empty claim" + ErrorEmptyQueries = "empty queries" + ErrorTooManyQueries = "too many queries" ErrorInvalidProofType = "invalid proof type" ErrorEmptySignatureProof = "empty signature proof" ErrorEmptyMTPProof = "empty MTP proof" diff --git a/linkedMultiQuery.go b/linkedMultiQuery.go index b2e02e6..9dad57c 100644 --- a/linkedMultiQuery.go +++ b/linkedMultiQuery.go @@ -8,6 +8,7 @@ import ( core "github.com/iden3/go-iden3-core/v2" "github.com/iden3/go-merkletree-sql/v2" + "github.com/pkg/errors" ) const LinkedMultiQueryLength = 10 @@ -37,8 +38,41 @@ type linkedMultiQueryCircuitInputs struct { ActualValueArraySize []int `json:"valueArraySize"` } +func (l LinkedMultiQueryInputs) Validate() error { + if l.LinkNonce == nil { + return errors.New(ErrorEmptyLinkNonce) + } + + if l.Claim == nil { + return errors.New(ErrorEmptyClaim) + } + + if len(l.Query) == 0 { + return errors.New(ErrorEmptyQueries) + } + + if len(l.Query) > LinkedMultiQueryLength { + return errors.New(ErrorTooManyQueries) + } + + for _, q := range l.Query { + if q == nil { + continue + } + if err := q.ValidateValueArraySize(l.GetValueArrSize()); err != nil { + return err + } + } + + return nil +} + // InputsMarshal returns Circom private inputs for linkedMultiQuery10.circom func (l LinkedMultiQueryInputs) InputsMarshal() ([]byte, error) { + if err := l.Validate(); err != nil { + return nil, err + } + s := linkedMultiQueryCircuitInputs{} s.LinkNonce = l.LinkNonce.String() s.IssuerClaim = l.Claim diff --git a/linkedMultiQuery_test.go b/linkedMultiQuery_test.go index 19dcf40..71e9dad 100644 --- a/linkedMultiQuery_test.go +++ b/linkedMultiQuery_test.go @@ -89,6 +89,53 @@ func TestLinkedMultiQueryInputs_PrepareInputs_Ln(t *testing.T) { require.JSONEq(t, exp, string(bytesInputs)) } +func TestLinkedMultiQueryInputs_PrepareInputs_Error(t *testing.T) { + user := it.NewIdentity(t, userPK) + subjectID := user.ID + claim := it.DefaultUserClaim(t, subjectID) + in := LinkedMultiQueryInputs{ + //LinkNonce: big.NewInt(35346346369657418), + //Claim: claim, + } + _, err := in.InputsMarshal() + require.EqualError(t, err, "empty link nonce") + + in.LinkNonce = big.NewInt(35346346369657418) + _, err = in.InputsMarshal() + require.EqualError(t, err, "empty claim") + + in.Claim = claim + _, err = in.InputsMarshal() + require.EqualError(t, err, "empty queries") + + in.Query = append(in.Query, + &Query{ + ValueProof: nil, + Operator: EQ, + Values: []*big.Int{big.NewInt(10)}, + SlotIndex: 2, + }, + &Query{ + ValueProof: nil, + Operator: LT, + Values: []*big.Int{big.NewInt(133)}, + SlotIndex: 2, + }, + &Query{ + ValueProof: nil, + Operator: LTE, + Values: []*big.Int{big.NewInt(555)}, + SlotIndex: 2, + }, + ) + + bytesInputs, err := in.InputsMarshal() + require.NoError(t, err) + + exp := it.TestData(t, "linkedMultiQuery_inputs", string(bytesInputs), *generate) + require.JSONEq(t, exp, string(bytesInputs)) +} + func TestLinkedMultiQueryPubSignals_CircuitUnmarshal(t *testing.T) { out := new(LinkedMultiQueryPubSignals) err := out.PubSignalsUnmarshal([]byte(