• kilic's avatar
    core/vm, crypto/bls12381, params: add bls12-381 elliptic curve precompiles (#21018) · 4fc67854
    kilic authored
    * crypto: add bls12-381 elliptic curve wrapper
    
    * params: add bls12-381 precompile gas parameters
    
    * core/vm: add bls12-381 precompiles
    
    * core/vm: add bls12-381 precompile tests
    
    * go.mod, go.sum: use latest bls12381 lib
    
    * core/vm: move point encode/decode functions to base library
    
    * crypto/bls12381: introduce bls12-381 library init function
    
    * crypto/bls12381: import bls12381 elliptic curve implementation
    
    * go.mod, go.sum: remove bls12-381 library
    
    * remove unsued frobenious coeffs
    
    supress warning for inp that used in asm
    
    * add mappings tests for zero inputs
    
    fix swu g2 minus z inverse constant
    
    * crypto/bls12381: fix typo
    
    * crypto/bls12381: better comments for bls12381 constants
    
    * crypto/bls12381: swu, use single conditional for e2
    
    * crypto/bls12381: utils, delete empty line
    
    * crypto/bls12381: utils, use FromHex for string to big
    
    * crypto/bls12381: g1, g2, strict length check for FromBytes
    
    * crypto/bls12381: field_element, comparision changes
    
    * crypto/bls12381: change swu, isogeny constants with hex values
    
    * core/vm: fix point multiplication comments
    
    * core/vm: fix multiexp gas calculation and lookup for g1 and g2
    
    * core/vm: simpler imput length check for multiexp and pairing precompiles
    
    * core/vm: rm empty multiexp result declarations
    
    * crypto/bls12381: remove modulus type definition
    
    * crypto/bls12381: use proper init function
    
    * crypto/bls12381: get rid of new lines at fatal desciprtions
    
    * crypto/bls12-381: fix no-adx assembly multiplication
    
    * crypto/bls12-381: remove old config function
    
    * crypto/bls12381: update multiplication backend
    
    this commit changes mul backend to 6limb eip1962 backend
    
    mul assign operations are dropped
    
    * core/vm/contracts_tests: externalize test vectors for precompiles
    
    * core/vm/contracts_test: externalize failure-cases for precompiles
    
    * core/vm: linting
    
    * go.mod: tiny up sum file
    
    * core/vm: fix goimports linter issues
    
    * crypto/bls12381: build tags for plain ASM or ADX implementation
    Co-authored-by: 's avatarMartin Holst Swende <martin@swende.se>
    Co-authored-by: 's avatarPéter Szilágyi <peterke@gmail.com>
    4fc67854
utils.go 1.38 KB
// Copyright 2020 The go-ethereum Authors
// This file is part of the go-ethereum library.
//
// The go-ethereum library is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// The go-ethereum library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.

package bls12381

import (
	"errors"
	"math/big"

	"github.com/ethereum/go-ethereum/common"
)

func bigFromHex(hex string) *big.Int {
	return new(big.Int).SetBytes(common.FromHex(hex))
}

// decodeFieldElement expects 64 byte input with zero top 16 bytes,
// returns lower 48 bytes.
func decodeFieldElement(in []byte) ([]byte, error) {
	if len(in) != 64 {
		return nil, errors.New("invalid field element length")
	}
	// check top bytes
	for i := 0; i < 16; i++ {
		if in[i] != byte(0x00) {
			return nil, errors.New("invalid field element top bytes")
		}
	}
	out := make([]byte, 48)
	copy(out[:], in[16:])
	return out, nil
}