From 2a18bbd5fe1ae825d32e1752337a655cdc2e229f Mon Sep 17 00:00:00 2001 From: arnaucube Date: Wed, 8 Apr 2020 11:06:00 +0200 Subject: [PATCH] Add Verification Key & Proof parsers from json --- parsers.go | 134 ++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 122 insertions(+), 12 deletions(-) diff --git a/parsers.go b/parsers.go index bf7b312..c757ef3 100644 --- a/parsers.go +++ b/parsers.go @@ -12,8 +12,8 @@ import ( bn256 "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare" ) -// ProvingKeyString is the equivalent to the ProvingKey struct in string representation -type ProvingKeyString struct { +// PkString is the equivalent to the Pk struct in string representation, containing the ProvingKey +type PkString struct { A [][]string `json:"A"` B2 [][][]string `json:"B2"` B1 [][]string `json:"B1"` @@ -37,10 +37,19 @@ type WitnessString []string // ProofString is the equivalent to the Proof struct in string representation type ProofString struct { - A [3]string `json:"pi_a"` - B [3][2]string `json:"pi_b"` - C [3]string `json:"pi_c"` - Protocol string `json:"protocol"` + A []string `json:"pi_a"` + B [][]string `json:"pi_b"` + C []string `json:"pi_c"` + Protocol string `json:"protocol"` +} + +// VkString is the Verification Key data structure in string format (from json) +type VkString struct { + Alpha []string `json:"vk_alfa_1"` + Beta [][]string `json:"vk_beta_2"` + Gamma [][]string `json:"vk_gamma_2"` + Delta [][]string `json:"vk_delta_2"` + GammaABC [][]string `json:"IC"` } // ParseWitness parses the json []byte data into the Witness struct @@ -62,19 +71,19 @@ func ParseWitness(wJson []byte) (Witness, error) { return w, nil } -// ParseProvingKey parses the json []byte data into the ProvingKey struct -func ParseProvingKey(pkJson []byte) (*ProvingKey, error) { - var pkStr ProvingKeyString +// ParsePk parses the json []byte data into the Pk struct +func ParsePk(pkJson []byte) (*Pk, error) { + var pkStr PkString err := json.Unmarshal(pkJson, &pkStr) if err != nil { return nil, err } - pk, err := provingKeyStringToProvingKey(pkStr) + pk, err := pkStringToPk(pkStr) return pk, err } -func provingKeyStringToProvingKey(ps ProvingKeyString) (*ProvingKey, error) { - var p ProvingKey +func pkStringToPk(ps PkString) (*Pk, error) { + var p Pk var err error p.A, err = arrayStringToG1(ps.A) @@ -143,6 +152,101 @@ func provingKeyStringToProvingKey(ps ProvingKeyString) (*ProvingKey, error) { return &p, nil } +func proofStringToProof(pr ProofString) (*Proof, error) { + var p Proof + var err error + p.A, err = stringToG1(pr.A) + if err != nil { + return nil, err + } + + p.B, err = stringToG2(pr.B) + if err != nil { + return nil, err + } + + p.C, err = stringToG1(pr.C) + if err != nil { + return nil, err + } + + return &p, nil +} + +// ParseProof takes a json []byte and outputs the *Proof struct +func ParseProof(pj []byte) (*Proof, error) { + var pr ProofString + err := json.Unmarshal(pj, &pr) + if err != nil { + return nil, err + } + p, err := proofStringToProof(pr) + return p, err +} + +// ParsePublicSignals takes a json []byte and outputs the []*big.Int struct +func ParsePublicSignals(pj []byte) ([]*big.Int, error) { + var pr []string + err := json.Unmarshal(pj, &pr) + if err != nil { + return nil, err + } + var public []*big.Int + for _, s := range pr { + sb, err := stringToBigInt(s) + if err != nil { + return nil, err + } + public = append(public, sb) + } + return public, nil +} + +// ParseVk takes a json []byte and outputs the *Vk struct +func ParseVk(vj []byte) (*Vk, error) { + var vr VkString + err := json.Unmarshal(vj, &vr) + if err != nil { + return nil, err + } + v, err := vkStringToVk(vr) + return v, err +} + +func vkStringToVk(vr VkString) (*Vk, error) { + var v Vk + var err error + v.Alpha, err = stringToG1(vr.Alpha) + if err != nil { + return nil, err + } + + v.Beta, err = stringToG2(vr.Beta) + if err != nil { + return nil, err + } + + v.Gamma, err = stringToG2(vr.Gamma) + if err != nil { + return nil, err + } + + v.Delta, err = stringToG2(vr.Delta) + if err != nil { + return nil, err + } + + for i := 0; i < len(vr.GammaABC); i++ { + p, err := stringToG1(vr.GammaABC[i]) + if err != nil { + return nil, err + } + v.GammaABC = append(v.GammaABC, p) + } + + return &v, nil +} + // polsStringToBigInt is for taking string polynomials and converting it to *big.Int polynomials func polsStringToBigInt(s []map[string]string) ([]map[int]*big.Int, error) { var o []map[int]*big.Int @@ -362,6 +466,12 @@ func stringToG2(h [][]string) (*bn256.G2, error) { // ProofToJson outputs the Proof i Json format func ProofToJson(p *Proof) ([]byte, error) { var ps ProofString + ps.A = make([]string, 3) + ps.B = make([][]string, 3) + ps.B[0] = make([]string, 2) + ps.B[1] = make([]string, 2) + ps.B[2] = make([]string, 2) + ps.C = make([]string, 3) a := p.A.Marshal() ps.A[0] = new(big.Int).SetBytes(a[:32]).String()