crypto: use btcec/v2 for no-cgo (#24533)
This updates the no-cgo implementations in the crypto package to use the github.com/btcsuite/btcd/btcec/v2 module instead of the older btcec package that was part of the main github.com/btcsuite/btcd module. name old time/op new time/op delta EcrecoverSignature-32 198µs ± 0% 144µs ± 0% -27.11% VerifySignature-32 177µs ± 0% 128µs ± 0% -27.44% DecompressPubkey-32 20.9µs ± 0% 10.1µs ± 0% -51.51% Use (*ModNScalar).IsOverHalfOrder instead of math/big.Int when checking for malleable signatures.
This commit is contained in:
		
				
					committed by
					
						
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							7a80cf6543
						
					
				
				
					commit
					830231c1c4
				
			@@ -24,37 +24,48 @@ import (
 | 
			
		||||
	"crypto/elliptic"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"math/big"
 | 
			
		||||
 | 
			
		||||
	"github.com/btcsuite/btcd/btcec"
 | 
			
		||||
	"github.com/btcsuite/btcd/btcec/v2"
 | 
			
		||||
	btc_ecdsa "github.com/btcsuite/btcd/btcec/v2/ecdsa"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Ecrecover returns the uncompressed public key that created the given signature.
 | 
			
		||||
func Ecrecover(hash, sig []byte) ([]byte, error) {
 | 
			
		||||
	pub, err := SigToPub(hash, sig)
 | 
			
		||||
	pub, err := sigToPub(hash, sig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	bytes := (*btcec.PublicKey)(pub).SerializeUncompressed()
 | 
			
		||||
	bytes := pub.SerializeUncompressed()
 | 
			
		||||
	return bytes, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func sigToPub(hash, sig []byte) (*btcec.PublicKey, error) {
 | 
			
		||||
	if len(sig) != SignatureLength {
 | 
			
		||||
		return nil, errors.New("invalid signature")
 | 
			
		||||
	}
 | 
			
		||||
	// Convert to btcec input format with 'recovery id' v at the beginning.
 | 
			
		||||
	btcsig := make([]byte, SignatureLength)
 | 
			
		||||
	btcsig[0] = sig[RecoveryIDOffset] + 27
 | 
			
		||||
	copy(btcsig[1:], sig)
 | 
			
		||||
 | 
			
		||||
	pub, _, err := btc_ecdsa.RecoverCompact(btcsig, hash)
 | 
			
		||||
	return pub, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// SigToPub returns the public key that created the given signature.
 | 
			
		||||
func SigToPub(hash, sig []byte) (*ecdsa.PublicKey, error) {
 | 
			
		||||
	// Convert to btcec input format with 'recovery id' v at the beginning.
 | 
			
		||||
	btcsig := make([]byte, SignatureLength)
 | 
			
		||||
	btcsig[0] = sig[64] + 27
 | 
			
		||||
	copy(btcsig[1:], sig)
 | 
			
		||||
 | 
			
		||||
	pub, _, err := btcec.RecoverCompact(btcec.S256(), btcsig, hash)
 | 
			
		||||
	return (*ecdsa.PublicKey)(pub), err
 | 
			
		||||
	pub, err := sigToPub(hash, sig)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return pub.ToECDSA(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Sign calculates an ECDSA signature.
 | 
			
		||||
//
 | 
			
		||||
// This function is susceptible to chosen plaintext attacks that can leak
 | 
			
		||||
// information about the private key that is used for signing. Callers must
 | 
			
		||||
// be aware that the given hash cannot be chosen by an adversery. Common
 | 
			
		||||
// be aware that the given hash cannot be chosen by an adversary. Common
 | 
			
		||||
// solution is to hash any input before calculating the signature.
 | 
			
		||||
//
 | 
			
		||||
// The produced signature is in the [R || S || V] format where V is 0 or 1.
 | 
			
		||||
@@ -65,14 +76,20 @@ func Sign(hash []byte, prv *ecdsa.PrivateKey) ([]byte, error) {
 | 
			
		||||
	if prv.Curve != btcec.S256() {
 | 
			
		||||
		return nil, fmt.Errorf("private key curve is not secp256k1")
 | 
			
		||||
	}
 | 
			
		||||
	sig, err := btcec.SignCompact(btcec.S256(), (*btcec.PrivateKey)(prv), hash, false)
 | 
			
		||||
	// ecdsa.PrivateKey -> btcec.PrivateKey
 | 
			
		||||
	var priv btcec.PrivateKey
 | 
			
		||||
	if overflow := priv.Key.SetByteSlice(prv.D.Bytes()); overflow || priv.Key.IsZero() {
 | 
			
		||||
		return nil, fmt.Errorf("invalid private key")
 | 
			
		||||
	}
 | 
			
		||||
	defer priv.Zero()
 | 
			
		||||
	sig, err := btc_ecdsa.SignCompact(&priv, hash, false) // ref uncompressed pubkey
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	// Convert to Ethereum signature format with 'recovery id' v at the end.
 | 
			
		||||
	v := sig[0] - 27
 | 
			
		||||
	copy(sig, sig[1:])
 | 
			
		||||
	sig[64] = v
 | 
			
		||||
	sig[RecoveryIDOffset] = v
 | 
			
		||||
	return sig, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -83,13 +100,20 @@ func VerifySignature(pubkey, hash, signature []byte) bool {
 | 
			
		||||
	if len(signature) != 64 {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	sig := &btcec.Signature{R: new(big.Int).SetBytes(signature[:32]), S: new(big.Int).SetBytes(signature[32:])}
 | 
			
		||||
	key, err := btcec.ParsePubKey(pubkey, btcec.S256())
 | 
			
		||||
	var r, s btcec.ModNScalar
 | 
			
		||||
	if r.SetByteSlice(signature[:32]) {
 | 
			
		||||
		return false // overflow
 | 
			
		||||
	}
 | 
			
		||||
	if s.SetByteSlice(signature[32:]) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	sig := btc_ecdsa.NewSignature(&r, &s)
 | 
			
		||||
	key, err := btcec.ParsePubKey(pubkey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	// Reject malleable signatures. libsecp256k1 does this check but btcec doesn't.
 | 
			
		||||
	if sig.S.Cmp(secp256k1halfN) > 0 {
 | 
			
		||||
	if s.IsOverHalfOrder() {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	return sig.Verify(hash, key)
 | 
			
		||||
@@ -100,16 +124,26 @@ func DecompressPubkey(pubkey []byte) (*ecdsa.PublicKey, error) {
 | 
			
		||||
	if len(pubkey) != 33 {
 | 
			
		||||
		return nil, errors.New("invalid compressed public key length")
 | 
			
		||||
	}
 | 
			
		||||
	key, err := btcec.ParsePubKey(pubkey, btcec.S256())
 | 
			
		||||
	key, err := btcec.ParsePubKey(pubkey)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return key.ToECDSA(), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// CompressPubkey encodes a public key to the 33-byte compressed format.
 | 
			
		||||
// CompressPubkey encodes a public key to the 33-byte compressed format. The
 | 
			
		||||
// provided PublicKey must be valid. Namely, the coordinates must not be larger
 | 
			
		||||
// than 32 bytes each, they must be less than the field prime, and it must be a
 | 
			
		||||
// point on the secp256k1 curve. This is the case for a PublicKey constructed by
 | 
			
		||||
// elliptic.Unmarshal (see UnmarshalPubkey), or by ToECDSA and ecdsa.GenerateKey
 | 
			
		||||
// when constructing a PrivateKey.
 | 
			
		||||
func CompressPubkey(pubkey *ecdsa.PublicKey) []byte {
 | 
			
		||||
	return (*btcec.PublicKey)(pubkey).SerializeCompressed()
 | 
			
		||||
	// NOTE: the coordinates may be validated with
 | 
			
		||||
	// btcec.ParsePubKey(FromECDSAPub(pubkey))
 | 
			
		||||
	var x, y btcec.FieldVal
 | 
			
		||||
	x.SetByteSlice(pubkey.X.Bytes())
 | 
			
		||||
	y.SetByteSlice(pubkey.Y.Bytes())
 | 
			
		||||
	return btcec.NewPublicKey(&x, &y).SerializeCompressed()
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// S256 returns an instance of the secp256k1 curve.
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								go.mod
									
									
									
									
									
								
							@@ -10,7 +10,7 @@ require (
 | 
			
		||||
	github.com/aws/aws-sdk-go-v2/config v1.1.1
 | 
			
		||||
	github.com/aws/aws-sdk-go-v2/credentials v1.1.1
 | 
			
		||||
	github.com/aws/aws-sdk-go-v2/service/route53 v1.1.1
 | 
			
		||||
	github.com/btcsuite/btcd v0.20.1-beta
 | 
			
		||||
	github.com/btcsuite/btcd/btcec/v2 v2.1.2
 | 
			
		||||
	github.com/cespare/cp v0.1.0
 | 
			
		||||
	github.com/cloudflare/cloudflare-go v0.14.0
 | 
			
		||||
	github.com/consensys/gnark-crypto v0.4.1-0.20210426202927-39ac3d4b3f1f
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										25
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										25
									
								
								go.sum
									
									
									
									
									
								
							@@ -32,7 +32,6 @@ github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIO
 | 
			
		||||
github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
 | 
			
		||||
github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o=
 | 
			
		||||
github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw=
 | 
			
		||||
github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII=
 | 
			
		||||
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
 | 
			
		||||
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
 | 
			
		||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 | 
			
		||||
@@ -62,15 +61,10 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24
 | 
			
		||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
 | 
			
		||||
github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c=
 | 
			
		||||
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
 | 
			
		||||
github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw=
 | 
			
		||||
github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ=
 | 
			
		||||
github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA=
 | 
			
		||||
github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg=
 | 
			
		||||
github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg=
 | 
			
		||||
github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY=
 | 
			
		||||
github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc=
 | 
			
		||||
github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY=
 | 
			
		||||
github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs=
 | 
			
		||||
github.com/btcsuite/btcd/btcec/v2 v2.1.2 h1:YoYoC9J0jwfukodSBMzZYUVQ8PTiYg4BnOWiJVzTmLs=
 | 
			
		||||
github.com/btcsuite/btcd/btcec/v2 v2.1.2/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE=
 | 
			
		||||
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0 h1:MSskdM4/xJYcFzy0altH/C/xHopifpWzHUi1JeVI34Q=
 | 
			
		||||
github.com/btcsuite/btcd/chaincfg/chainhash v1.0.0/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc=
 | 
			
		||||
github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34=
 | 
			
		||||
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
 | 
			
		||||
github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk=
 | 
			
		||||
@@ -92,12 +86,15 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma
 | 
			
		||||
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
 | 
			
		||||
github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4=
 | 
			
		||||
github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg=
 | 
			
		||||
github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
 | 
			
		||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 | 
			
		||||
github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4=
 | 
			
		||||
github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo=
 | 
			
		||||
github.com/decred/dcrd/crypto/blake256 v1.0.0 h1:/8DMNYp9SGi5f0w7uCm6d6M4OU2rGFK09Y2A4Xv7EE0=
 | 
			
		||||
github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc=
 | 
			
		||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc=
 | 
			
		||||
github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs=
 | 
			
		||||
github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M=
 | 
			
		||||
github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU=
 | 
			
		||||
github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw=
 | 
			
		||||
@@ -241,10 +238,8 @@ github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7Bd
 | 
			
		||||
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
 | 
			
		||||
github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e h1:UvSe12bq+Uj2hWd8aOlwPmoZ+CITRFrdit+sDGfAg8U=
 | 
			
		||||
github.com/jedisct1/go-minisign v0.0.0-20190909160543-45766022959e/go.mod h1:G1CVv03EnqU1wYL2dFwXxW2An0az9JTl/ZsqXQeBlkU=
 | 
			
		||||
github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI=
 | 
			
		||||
github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
 | 
			
		||||
github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U=
 | 
			
		||||
github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ=
 | 
			
		||||
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
 | 
			
		||||
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
 | 
			
		||||
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 | 
			
		||||
@@ -258,7 +253,6 @@ github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4=
 | 
			
		||||
github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU=
 | 
			
		||||
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
 | 
			
		||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 | 
			
		||||
github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4=
 | 
			
		||||
github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
 | 
			
		||||
github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
 | 
			
		||||
github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg=
 | 
			
		||||
@@ -318,11 +312,9 @@ github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn
 | 
			
		||||
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
 | 
			
		||||
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
 | 
			
		||||
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
			
		||||
github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 | 
			
		||||
github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk=
 | 
			
		||||
github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA=
 | 
			
		||||
github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY=
 | 
			
		||||
github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 | 
			
		||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
 | 
			
		||||
github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE=
 | 
			
		||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
 | 
			
		||||
@@ -408,7 +400,6 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 | 
			
		||||
go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 | 
			
		||||
go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 | 
			
		||||
go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
 | 
			
		||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 | 
			
		||||
 
 | 
			
		||||
@@ -21,7 +21,7 @@ package secp256k1
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"github.com/btcsuite/btcd/btcec"
 | 
			
		||||
	"github.com/btcsuite/btcd/btcec/v2"
 | 
			
		||||
	"github.com/ethereum/go-ethereum/crypto/secp256k1"
 | 
			
		||||
	fuzz "github.com/google/gofuzz"
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user