github.com/consensys/gnark@v0.11.0/backend/groth16/bn254/marshal.go (about) 1 // Copyright 2020 ConsenSys Software Inc. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Code generated by gnark DO NOT EDIT 16 17 package groth16 18 19 import ( 20 curve "github.com/consensys/gnark-crypto/ecc/bn254" 21 22 "github.com/consensys/gnark-crypto/ecc/bn254/fr/pedersen" 23 "github.com/consensys/gnark-crypto/utils/unsafe" 24 "github.com/consensys/gnark/internal/utils" 25 "io" 26 ) 27 28 // WriteTo writes binary encoding of the Proof elements to writer 29 // points are stored in compressed form Ar | Krs | Bs 30 // use WriteRawTo(...) to encode the proof without point compression 31 func (proof *Proof) WriteTo(w io.Writer) (n int64, err error) { 32 return proof.writeTo(w, false) 33 } 34 35 // WriteRawTo writes binary encoding of the Proof elements to writer 36 // points are stored in uncompressed form Ar | Krs | Bs 37 // use WriteTo(...) to encode the proof with point compression 38 func (proof *Proof) WriteRawTo(w io.Writer) (n int64, err error) { 39 return proof.writeTo(w, true) 40 } 41 42 func (proof *Proof) writeTo(w io.Writer, raw bool) (int64, error) { 43 var enc *curve.Encoder 44 if raw { 45 enc = curve.NewEncoder(w, curve.RawEncoding()) 46 } else { 47 enc = curve.NewEncoder(w) 48 } 49 50 if err := enc.Encode(&proof.Ar); err != nil { 51 return enc.BytesWritten(), err 52 } 53 if err := enc.Encode(&proof.Bs); err != nil { 54 return enc.BytesWritten(), err 55 } 56 if err := enc.Encode(&proof.Krs); err != nil { 57 return enc.BytesWritten(), err 58 } 59 if err := enc.Encode(proof.Commitments); err != nil { 60 return enc.BytesWritten(), err 61 } 62 if err := enc.Encode(&proof.CommitmentPok); err != nil { 63 return enc.BytesWritten(), err 64 } 65 66 return enc.BytesWritten(), nil 67 } 68 69 // ReadFrom attempts to decode a Proof from reader 70 // Proof must be encoded through WriteTo (compressed) or WriteRawTo (uncompressed) 71 func (proof *Proof) ReadFrom(r io.Reader) (n int64, err error) { 72 73 dec := curve.NewDecoder(r) 74 75 if err := dec.Decode(&proof.Ar); err != nil { 76 return dec.BytesRead(), err 77 } 78 if err := dec.Decode(&proof.Bs); err != nil { 79 return dec.BytesRead(), err 80 } 81 if err := dec.Decode(&proof.Krs); err != nil { 82 return dec.BytesRead(), err 83 } 84 if err := dec.Decode(&proof.Commitments); err != nil { 85 return dec.BytesRead(), err 86 } 87 if err := dec.Decode(&proof.CommitmentPok); err != nil { 88 return dec.BytesRead(), err 89 } 90 91 return dec.BytesRead(), nil 92 } 93 94 // WriteTo writes binary encoding of the key elements to writer 95 // points are compressed 96 // use WriteRawTo(...) to encode the key without point compression 97 func (vk *VerifyingKey) WriteTo(w io.Writer) (n int64, err error) { 98 return vk.writeTo(w, false) 99 } 100 101 // WriteRawTo writes binary encoding of the key elements to writer 102 // points are not compressed 103 // use WriteTo(...) to encode the key with point compression 104 func (vk *VerifyingKey) WriteRawTo(w io.Writer) (n int64, err error) { 105 return vk.writeTo(w, true) 106 } 107 108 // writeTo serialization format: 109 // follows bellman format: 110 // https://github.com/zkcrypto/bellman/blob/fa9be45588227a8c6ec34957de3f68705f07bd92/src/groth16/mod.rs#L143 111 // [α]1,[β]1,[β]2,[γ]2,[δ]1,[δ]2,uint32(len(Kvk)),[Kvk]1 112 func (vk *VerifyingKey) writeTo(w io.Writer, raw bool) (int64, error) { 113 var enc *curve.Encoder 114 if raw { 115 enc = curve.NewEncoder(w, curve.RawEncoding()) 116 } else { 117 enc = curve.NewEncoder(w) 118 } 119 if vk.PublicAndCommitmentCommitted == nil { 120 vk.PublicAndCommitmentCommitted = [][]int{} // only matters in tests 121 } 122 toEncode := []interface{}{ 123 // [α]1,[β]1,[β]2,[γ]2,[δ]1,[δ]2 124 &vk.G1.Alpha, 125 &vk.G1.Beta, 126 &vk.G2.Beta, 127 &vk.G2.Gamma, 128 &vk.G1.Delta, 129 &vk.G2.Delta, 130 // uint32(len(Kvk)),[Kvk]1 131 vk.G1.K, 132 utils.IntSliceSliceToUint64SliceSlice(vk.PublicAndCommitmentCommitted), 133 uint32(len(vk.CommitmentKeys)), 134 } 135 for _, v := range toEncode { 136 if err := enc.Encode(v); err != nil { 137 return enc.BytesWritten(), err 138 } 139 } 140 var n int64 141 for i := range vk.CommitmentKeys { 142 var ( 143 m int64 144 err error 145 ) 146 if raw { 147 m, err = vk.CommitmentKeys[i].WriteRawTo(w) 148 } else { 149 m, err = vk.CommitmentKeys[i].WriteTo(w) 150 } 151 n += m 152 if err != nil { 153 return n + enc.BytesWritten(), err 154 } 155 } 156 return n + enc.BytesWritten(), nil 157 } 158 159 // ReadFrom attempts to decode a VerifyingKey from reader 160 // VerifyingKey must be encoded through WriteTo (compressed) or WriteRawTo (uncompressed) 161 // serialization format: 162 // https://github.com/zkcrypto/bellman/blob/fa9be45588227a8c6ec34957de3f68705f07bd92/src/groth16/mod.rs#L143 163 // [α]1,[β]1,[β]2,[γ]2,[δ]1,[δ]2,uint32(len(Kvk)),[Kvk]1 164 func (vk *VerifyingKey) ReadFrom(r io.Reader) (int64, error) { 165 return vk.readFrom(r, false) 166 } 167 168 // UnsafeReadFrom has the same behavior as ReadFrom, except that it will not check that decode points 169 // are on the curve and in the correct subgroup. 170 func (vk *VerifyingKey) UnsafeReadFrom(r io.Reader) (int64, error) { 171 return vk.readFrom(r, true) 172 } 173 174 func (vk *VerifyingKey) readFrom(r io.Reader, raw bool) (int64, error) { 175 var dec *curve.Decoder 176 if raw { 177 dec = curve.NewDecoder(r, curve.NoSubgroupChecks()) 178 } else { 179 dec = curve.NewDecoder(r) 180 } 181 182 var publicCommitted [][]uint64 183 var nbCommitments uint32 184 185 toDecode := []interface{}{ 186 // [α]1,[β]1,[β]2,[γ]2,[δ]1,[δ]2 187 &vk.G1.Alpha, 188 &vk.G1.Beta, 189 &vk.G2.Beta, 190 &vk.G2.Gamma, 191 &vk.G1.Delta, 192 &vk.G2.Delta, 193 // uint32(len(Kvk)),[Kvk]1 194 &vk.G1.K, 195 &publicCommitted, 196 &nbCommitments, 197 } 198 199 for _, v := range toDecode { 200 if err := dec.Decode(v); err != nil { 201 return dec.BytesRead(), err 202 } 203 } 204 205 vk.PublicAndCommitmentCommitted = utils.Uint64SliceSliceToIntSliceSlice(publicCommitted) 206 207 vk.CommitmentKeys = make([]pedersen.VerifyingKey, nbCommitments) 208 var n int64 209 for i := range vk.CommitmentKeys { 210 var ( 211 m int64 212 err error 213 ) 214 if raw { 215 m, err = vk.CommitmentKeys[i].UnsafeReadFrom(r) 216 } else { 217 m, err = vk.CommitmentKeys[i].ReadFrom(r) 218 } 219 n += m 220 if err != nil { 221 return n + dec.BytesRead(), err 222 } 223 } 224 225 // recompute vk.e (e(α, β)) and -[δ]2, -[γ]2 226 if err := vk.Precompute(); err != nil { 227 return n + dec.BytesRead(), err 228 } 229 230 return n + dec.BytesRead(), nil 231 } 232 233 // WriteTo writes binary encoding of the key elements to writer 234 // points are compressed 235 // use WriteRawTo(...) to encode the key without point compression 236 func (pk *ProvingKey) WriteTo(w io.Writer) (n int64, err error) { 237 return pk.writeTo(w, false) 238 } 239 240 // WriteRawTo writes binary encoding of the key elements to writer 241 // points are not compressed 242 // use WriteTo(...) to encode the key with point compression 243 func (pk *ProvingKey) WriteRawTo(w io.Writer) (n int64, err error) { 244 return pk.writeTo(w, true) 245 } 246 247 func (pk *ProvingKey) writeTo(w io.Writer, raw bool) (int64, error) { 248 n, err := pk.Domain.WriteTo(w) 249 if err != nil { 250 return n, err 251 } 252 253 var enc *curve.Encoder 254 if raw { 255 enc = curve.NewEncoder(w, curve.RawEncoding()) 256 } else { 257 enc = curve.NewEncoder(w) 258 } 259 nbWires := uint64(len(pk.InfinityA)) 260 261 toEncode := []interface{}{ 262 &pk.G1.Alpha, 263 &pk.G1.Beta, 264 &pk.G1.Delta, 265 pk.G1.A, 266 pk.G1.B, 267 pk.G1.Z, 268 pk.G1.K, 269 &pk.G2.Beta, 270 &pk.G2.Delta, 271 pk.G2.B, 272 nbWires, 273 pk.NbInfinityA, 274 pk.NbInfinityB, 275 pk.InfinityA, 276 pk.InfinityB, 277 uint32(len(pk.CommitmentKeys)), 278 } 279 280 for _, v := range toEncode { 281 if err := enc.Encode(v); err != nil { 282 return n + enc.BytesWritten(), err 283 } 284 } 285 286 for i := range pk.CommitmentKeys { 287 var ( 288 n2 int64 289 err error 290 ) 291 if raw { 292 n2, err = pk.CommitmentKeys[i].WriteRawTo(w) 293 } else { 294 n2, err = pk.CommitmentKeys[i].WriteTo(w) 295 } 296 297 n += n2 298 if err != nil { 299 return n + enc.BytesWritten(), err 300 } 301 } 302 303 return n + enc.BytesWritten(), nil 304 305 } 306 307 // ReadFrom attempts to decode a ProvingKey from reader 308 // ProvingKey must be encoded through WriteTo (compressed) or WriteRawTo (uncompressed) 309 // note that we don't check that the points are on the curve or in the correct subgroup at this point 310 func (pk *ProvingKey) ReadFrom(r io.Reader) (int64, error) { 311 return pk.readFrom(r) 312 } 313 314 // UnsafeReadFrom behaves like ReadFrom excepts it doesn't check if the decoded points are on the curve 315 // or in the correct subgroup 316 func (pk *ProvingKey) UnsafeReadFrom(r io.Reader) (int64, error) { 317 return pk.readFrom(r, curve.NoSubgroupChecks()) 318 } 319 320 func (pk *ProvingKey) readFrom(r io.Reader, decOptions ...func(*curve.Decoder)) (int64, error) { 321 n, err := pk.Domain.ReadFrom(r) 322 if err != nil { 323 return n, err 324 } 325 326 dec := curve.NewDecoder(r, decOptions...) 327 328 var nbWires uint64 329 var nbCommitments uint32 330 331 toDecode := []interface{}{ 332 &pk.G1.Alpha, 333 &pk.G1.Beta, 334 &pk.G1.Delta, 335 &pk.G1.A, 336 &pk.G1.B, 337 &pk.G1.Z, 338 &pk.G1.K, 339 &pk.G2.Beta, 340 &pk.G2.Delta, 341 &pk.G2.B, 342 &nbWires, 343 &pk.NbInfinityA, 344 &pk.NbInfinityB, 345 } 346 347 for _, v := range toDecode { 348 if err := dec.Decode(v); err != nil { 349 return n + dec.BytesRead(), err 350 } 351 } 352 pk.InfinityA = make([]bool, nbWires) 353 pk.InfinityB = make([]bool, nbWires) 354 355 if err := dec.Decode(&pk.InfinityA); err != nil { 356 return n + dec.BytesRead(), err 357 } 358 if err := dec.Decode(&pk.InfinityB); err != nil { 359 return n + dec.BytesRead(), err 360 } 361 if err := dec.Decode(&nbCommitments); err != nil { 362 return n + dec.BytesRead(), err 363 } 364 365 pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) 366 for i := range pk.CommitmentKeys { 367 n2, err := pk.CommitmentKeys[i].ReadFrom(r) 368 n += n2 369 if err != nil { 370 return n, err 371 } 372 } 373 374 return n + dec.BytesRead(), nil 375 } 376 377 // WriteDump behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe 378 // Output is compatible with ReadDump, with the caveat that, not only the points are not checked for 379 // correctness, but the raw bytes are platform dependent (endianness, etc.) 380 func (pk *ProvingKey) WriteDump(w io.Writer) error { 381 // it behaves like WriteRawTo, excepts, the slices of points are "dumped" using gnark-crypto/utils/unsafe 382 383 // start by writing an unsafe marker to fail early. 384 if err := unsafe.WriteMarker(w); err != nil { 385 return err 386 } 387 388 if _, err := pk.Domain.WriteTo(w); err != nil { 389 return err 390 } 391 392 enc := curve.NewEncoder(w, curve.RawEncoding()) 393 nbWires := uint64(len(pk.InfinityA)) 394 395 toEncode := []interface{}{ 396 &pk.G1.Alpha, 397 &pk.G1.Beta, 398 &pk.G1.Delta, 399 // pk.G1.A, 400 // pk.G1.B, 401 // pk.G1.Z, 402 // pk.G1.K, 403 &pk.G2.Beta, 404 &pk.G2.Delta, 405 // pk.G2.B, 406 nbWires, 407 pk.NbInfinityA, 408 pk.NbInfinityB, 409 pk.InfinityA, 410 pk.InfinityB, 411 uint32(len(pk.CommitmentKeys)), 412 } 413 414 for _, v := range toEncode { 415 if err := enc.Encode(v); err != nil { 416 return err 417 } 418 } 419 420 // dump slices of points 421 if err := unsafe.WriteSlice(w, pk.G1.A); err != nil { 422 return err 423 } 424 if err := unsafe.WriteSlice(w, pk.G1.B); err != nil { 425 return err 426 } 427 if err := unsafe.WriteSlice(w, pk.G1.Z); err != nil { 428 return err 429 } 430 if err := unsafe.WriteSlice(w, pk.G1.K); err != nil { 431 return err 432 } 433 if err := unsafe.WriteSlice(w, pk.G2.B); err != nil { 434 return err 435 } 436 437 for i := range pk.CommitmentKeys { 438 if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].Basis); err != nil { 439 return err 440 } 441 if err := unsafe.WriteSlice(w, pk.CommitmentKeys[i].BasisExpSigma); err != nil { 442 return err 443 } 444 } 445 446 return nil 447 } 448 449 // ReadDump reads a ProvingKey from a dump written by WriteDump. 450 // This is platform dependent and very unsafe (no checks, no endianness translation, etc.) 451 func (pk *ProvingKey) ReadDump(r io.Reader) error { 452 // read the marker to fail early in case of malformed input 453 if err := unsafe.ReadMarker(r); err != nil { 454 return err 455 } 456 457 if _, err := pk.Domain.ReadFrom(r); err != nil { 458 return err 459 } 460 461 dec := curve.NewDecoder(r, curve.NoSubgroupChecks()) 462 463 var nbWires uint64 464 var nbCommitments uint32 465 466 toDecode := []interface{}{ 467 &pk.G1.Alpha, 468 &pk.G1.Beta, 469 &pk.G1.Delta, 470 // &pk.G1.A, 471 // &pk.G1.B, 472 // &pk.G1.Z, 473 // &pk.G1.K, 474 &pk.G2.Beta, 475 &pk.G2.Delta, 476 // &pk.G2.B, 477 &nbWires, 478 &pk.NbInfinityA, 479 &pk.NbInfinityB, 480 } 481 482 for _, v := range toDecode { 483 if err := dec.Decode(v); err != nil { 484 return err 485 } 486 } 487 pk.InfinityA = make([]bool, nbWires) 488 pk.InfinityB = make([]bool, nbWires) 489 490 if err := dec.Decode(&pk.InfinityA); err != nil { 491 return err 492 } 493 if err := dec.Decode(&pk.InfinityB); err != nil { 494 return err 495 } 496 if err := dec.Decode(&nbCommitments); err != nil { 497 return err 498 } 499 500 // read slices of points 501 var err error 502 pk.G1.A, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) 503 if err != nil { 504 return err 505 } 506 pk.G1.B, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) 507 if err != nil { 508 return err 509 } 510 pk.G1.Z, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) 511 if err != nil { 512 return err 513 } 514 pk.G1.K, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) 515 if err != nil { 516 return err 517 } 518 pk.G2.B, _, err = unsafe.ReadSlice[[]curve.G2Affine](r) 519 if err != nil { 520 return err 521 } 522 523 pk.CommitmentKeys = make([]pedersen.ProvingKey, nbCommitments) 524 for i := range pk.CommitmentKeys { 525 pk.CommitmentKeys[i].Basis, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) 526 if err != nil { 527 return err 528 } 529 pk.CommitmentKeys[i].BasisExpSigma, _, err = unsafe.ReadSlice[[]curve.G1Affine](r) 530 if err != nil { 531 return err 532 } 533 } 534 535 return nil 536 537 }