@@ -14,8 +14,7 @@ import "C"
1414import (
1515 "bytes"
1616 "encoding/json"
17- "github.com/iden3/go-rapidsnark/types"
18- "github.com/iden3/go-rapidsnark/verifier"
17+ "math/big"
1918
2019 "log"
2120 "unsafe"
@@ -24,6 +23,8 @@ import (
2423 "github.com/consensys/gnark/backend/groth16"
2524 "github.com/consensys/gnark/backend/plonk"
2625 "github.com/consensys/gnark/backend/witness"
26+ "github.com/iden3/go-rapidsnark/types"
27+ "github.com/iden3/go-rapidsnark/verifier"
2728)
2829
2930func listRefToBytes (listRef C.ListRef ) []byte {
@@ -122,6 +123,20 @@ func verifyGnarkGroth16Proof(proofBytesRef C.ListRef, pubInputBytesRef C.ListRef
122123 return err == nil
123124}
124125
126+ func bytesToBigInts32 (b []byte ) []* big.Int {
127+ if len (b )% 32 != 0 {
128+ panic ("pubInputBytes length is not a multiple of 32" )
129+ }
130+
131+ inputs := make ([]* big.Int , 0 , len (b )/ 32 )
132+ for i := 0 ; i < len (b ); i += 32 {
133+ chunk := b [i : i + 32 ]
134+ bi := new (big.Int ).SetBytes (chunk )
135+ inputs = append (inputs , bi )
136+ }
137+ return inputs
138+ }
139+
125140//export VerifyCircomGroth16ProofBN256
126141func VerifyCircomGroth16ProofBN256 (proofBytesRef C.ListRef , pubInputBytesRef C.ListRef , verificationKeyBytesRef C.ListRef ) bool {
127142 proofBytes := listRefToBytes (proofBytesRef )
@@ -131,26 +146,36 @@ func VerifyCircomGroth16ProofBN256(proofBytesRef C.ListRef, pubInputBytesRef C.L
131146 proofData := & types.ProofData {}
132147 err := json .Unmarshal (proofBytes , proofData )
133148 if err != nil {
134- log .Printf ("Could not marshal proof: %v" , err )
149+ log .Printf ("Could not unmarshal proof: %v" , err )
135150 return false
136151 }
137152
138- var pubSignals []string
139- err = json .Unmarshal (pubInputBytes , & pubSignals )
153+ parsedProofData , err := verifier .ParseProofData (* proofData )
140154 if err != nil {
141- log .Printf ("Error unmarshaling JSON : %v" , err )
155+ log .Printf ("Could not parse proof : %v" , err )
142156 return false
143157 }
144158
145- zkProof := types.ZKProof {
146- Proof : proofData ,
147- PubSignals : pubSignals ,
159+ var vkStr verifier.VkJSON
160+ err = json .Unmarshal (verificationKeyBytes , & vkStr )
161+ if err != nil {
162+ log .Printf ("Could not unmarshal vk: %v" , err )
163+ return false
164+ }
165+
166+ vk , err := verifier .ParseVK (vkStr )
167+ if err != nil {
168+ log .Printf ("Could not parse vk: %v" , err )
169+ return false
148170 }
149171
150- err = verifier .VerifyGroth16 (zkProof , verificationKeyBytes )
172+ inputs := bytesToBigInts32 (pubInputBytes )
173+
174+ err = verifier .VerifyRaw (vk , parsedProofData , inputs )
151175 if err != nil {
152176 log .Printf ("Could not verify Groth16 proof: %v" , err )
153177 return false
154178 }
179+
155180 return true
156181}
0 commit comments