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}