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  }