52 lines
1.4 KiB
Go
52 lines
1.4 KiB
Go
package bn256
|
|
|
|
import (
|
|
"math/big"
|
|
|
|
"github.com/consensys/gnark-crypto/ecc/bn254"
|
|
)
|
|
|
|
// G1 is the affine representation of a G1 group element.
|
|
//
|
|
// Since this code is used for precompiles, using Jacobian
|
|
// points are not beneficial because there are no intermediate
|
|
// points to allow us to save on inversions.
|
|
//
|
|
// Note: We also use this struct so that we can conform to the existing API
|
|
// that the precompiles want.
|
|
type G1 struct {
|
|
inner bn254.G1Affine
|
|
}
|
|
|
|
// Add adds `a` and `b` together, storing the result in `g`
|
|
func (g *G1) Add(a, b *G1) {
|
|
g.inner.Add(&a.inner, &b.inner)
|
|
}
|
|
|
|
// ScalarMult computes the scalar multiplication between `a` and
|
|
// `scalar`, storing the result in `g`
|
|
func (g *G1) ScalarMult(a *G1, scalar *big.Int) {
|
|
g.inner.ScalarMultiplication(&a.inner, scalar)
|
|
}
|
|
|
|
// Unmarshal deserializes `buf` into `g`
|
|
//
|
|
// Note: whether the deserialization is of a compressed
|
|
// or an uncompressed point, is encoded in the bytes.
|
|
//
|
|
// For our purpose, the point will always be serialized
|
|
// as uncompressed, ie 64 bytes.
|
|
//
|
|
// This method also checks whether the point is on the
|
|
// curve and in the prime order subgroup.
|
|
func (g *G1) Unmarshal(buf []byte) (int, error) {
|
|
return g.inner.SetBytes(buf)
|
|
}
|
|
|
|
// Marshal serializes the point into a byte slice.
|
|
//
|
|
// Note: The point is serialized as uncompressed.
|
|
func (p *G1) Marshal() []byte {
|
|
return p.inner.Marshal()
|
|
}
|