arnaucube
arnaucube/go-circom-prover-verifierPublic Self-hosted repository
go-circom-prover-verifier/parsers.go
parsers.goRaw
  1package gocircomprover
  2
  3import (
  4	"encoding/hex"
  5	"fmt"
  6	"math/big"
  7	"strings"
  8
  9	bn256 "github.com/ethereum/go-ethereum/crypto/bn256/cloudflare"
 10)
 11
 12func addZPadding(b []byte) []byte {
 13	var z [32]byte
 14	var r []byte
 15	r = append(r, z[len(b):]...) // add padding on the left
 16	r = append(r, b...)
 17	return r[:32]
 18}
 19
 20func stringToBytes(s string) ([]byte, error) {
 21	if s == "1" {
 22		s = "0"
 23	}
 24	bi, ok := new(big.Int).SetString(s, 10)
 25	if !ok {
 26		return nil, fmt.Errorf("error parsing bigint stringToBytes")
 27	}
 28	b := bi.Bytes()
 29	if len(b) != 32 {
 30		b = addZPadding(b)
 31	}
 32	return b, nil
 33
 34}
 35
 36func arrayStringToG1(h [][]string) ([]*bn256.G1, error) {
 37	var o []*bn256.G1
 38	for i := 0; i < len(h); i++ {
 39		hi, err := stringToG1(h[i])
 40		if err != nil {
 41			return o, err
 42		}
 43		o = append(o, hi)
 44	}
 45	return o, nil
 46}
 47
 48func arrayStringToG2(h [][][]string) ([]*bn256.G2, error) {
 49	var o []*bn256.G2
 50	for i := 0; i < len(h); i++ {
 51		hi, err := stringToG2(h[i])
 52		if err != nil {
 53			return o, err
 54		}
 55		o = append(o, hi)
 56	}
 57	return o, nil
 58}
 59
 60func stringToG1(h []string) (*bn256.G1, error) {
 61	if len(h) <= 2 {
 62		return nil, fmt.Errorf("not enought data for stringToG1")
 63	}
 64	h = h[:2]
 65	hexa := false
 66	if len(h[0]) > 1 {
 67		if "0x" == h[0][:2] {
 68			hexa = true
 69		}
 70	}
 71	in := ""
 72
 73	var b []byte
 74	var err error
 75	if hexa {
 76		for i := range h {
 77			in += strings.TrimPrefix(h[i], "0x")
 78		}
 79		b, err = hex.DecodeString(in)
 80		if err != nil {
 81			return nil, err
 82		}
 83	} else {
 84		// TODO TMP
 85		// TODO use stringToBytes()
 86		if h[0] == "1" {
 87			h[0] = "0"
 88		}
 89		if h[1] == "1" {
 90			h[1] = "0"
 91		}
 92		bi0, ok := new(big.Int).SetString(h[0], 10)
 93		if !ok {
 94			return nil, fmt.Errorf("error parsing stringToG1")
 95		}
 96		bi1, ok := new(big.Int).SetString(h[1], 10)
 97		if !ok {
 98			return nil, fmt.Errorf("error parsing stringToG1")
 99		}
100		b0 := bi0.Bytes()
101		b1 := bi1.Bytes()
102		if len(b0) != 32 {
103			b0 = addZPadding(b0)
104		}
105		if len(b1) != 32 {
106			b1 = addZPadding(b1)
107		}
108
109		b = append(b, b0...)
110		b = append(b, b1...)
111	}
112	p := new(bn256.G1)
113	_, err = p.Unmarshal(b)
114
115	return p, err
116}
117
118func stringToG2(h [][]string) (*bn256.G2, error) {
119	if len(h) <= 2 {
120		return nil, fmt.Errorf("not enought data for stringToG2")
121	}
122	h = h[:2]
123	hexa := false
124	if len(h[0][0]) > 1 {
125		if "0x" == h[0][0][:2] {
126			hexa = true
127		}
128	}
129	in := ""
130	var b []byte
131	var err error
132	if hexa {
133		for i := 0; i < len(h); i++ {
134			for j := 0; j < len(h[i]); j++ {
135				in += strings.TrimPrefix(h[i][j], "0x")
136			}
137		}
138		b, err = hex.DecodeString(in)
139		if err != nil {
140			return nil, err
141		}
142	} else {
143		// TODO TMP
144		bH, err := stringToBytes(h[0][1])
145		if err != nil {
146			return nil, err
147		}
148		b = append(b, bH...)
149		bH, err = stringToBytes(h[0][0])
150		if err != nil {
151			return nil, err
152		}
153		b = append(b, bH...)
154		bH, err = stringToBytes(h[1][1])
155		if err != nil {
156			return nil, err
157		}
158		b = append(b, bH...)
159		bH, err = stringToBytes(h[1][0])
160		if err != nil {
161			return nil, err
162		}
163		b = append(b, bH...)
164	}
165
166	p := new(bn256.G2)
167	_, err = p.Unmarshal(b)
168	return p, err
169}