@@ -15,7 +15,7 @@ import (
1515 "time"
1616
1717 rapidsnark_types "github.com/iden3/go-rapidsnark/types"
18- "github.com/iden3/go-rapidsnark/verifier"
18+ rapidsnark_verifier "github.com/iden3/go-rapidsnark/verifier"
1919
2020 "github.com/ethereum/go-ethereum/crypto"
2121 "github.com/urfave/cli/v2"
@@ -621,30 +621,54 @@ func (o *Operator) verifyGnarkGroth16Proof(proofBytes []byte, pubInputBytes []by
621621
622622// verifyCircomGroth16Bn256Proof verifies a Circom Groth16 proof using BN256 curve.
623623func (o * Operator ) verifyCircomGroth16Bn256Proof (proofBytes []byte , pubInputBytes []byte , verificationKeyBytes []byte ) bool {
624+ bytesToBigInts32 := func (b []byte ) []* big.Int {
625+ if len (b )% 32 != 0 {
626+ panic ("pubInputBytes length is not a multiple of 32" )
627+ }
628+
629+ inputs := make ([]* big.Int , 0 , len (b )/ 32 )
630+ for i := 0 ; i < len (b ); i += 32 {
631+ chunk := b [i : i + 32 ]
632+ bi := new (big.Int ).SetBytes (chunk )
633+ inputs = append (inputs , bi )
634+ }
635+ return inputs
636+ }
637+
624638 proofData := & rapidsnark_types.ProofData {}
625639 err := json .Unmarshal (proofBytes , proofData )
626640 if err != nil {
627- o . Logger . Infof ("Could not marshal proof: %v" , err )
641+ log . Printf ("Could not unmarshal proof: %v" , err )
628642 return false
629643 }
630644
631- var pubSignals []string
632- err = json .Unmarshal (pubInputBytes , & pubSignals )
645+ parsedProofData , err := rapidsnark_verifier .ParseProofData (* proofData )
633646 if err != nil {
634- o . Logger . Infof ("Could not marshal public signals : %v" , err )
647+ log . Printf ("Could not parse proof : %v" , err )
635648 return false
636649 }
637650
638- zkProof := rapidsnark_types.ZKProof {
639- Proof : proofData ,
640- PubSignals : pubSignals ,
651+ var vkStr rapidsnark_verifier.VkJSON
652+ err = json .Unmarshal (verificationKeyBytes , & vkStr )
653+ if err != nil {
654+ log .Printf ("Could not unmarshal vk: %v" , err )
655+ return false
641656 }
642657
643- err = verifier . VerifyGroth16 ( zkProof , verificationKeyBytes )
658+ vk , err := rapidsnark_verifier . ParseVK ( vkStr )
644659 if err != nil {
645- o . Logger . Infof ("Could not verify Circom Groth16 BN256 proof : %v" , err )
660+ log . Printf ("Could not parse vk : %v" , err )
646661 return false
647662 }
663+
664+ inputs := bytesToBigInts32 (pubInputBytes )
665+
666+ err = rapidsnark_verifier .VerifyRaw (vk , parsedProofData , inputs )
667+ if err != nil {
668+ log .Printf ("Could not verify Groth16 proof: %v" , err )
669+ return false
670+ }
671+
648672 return true
649673}
650674
0 commit comments