mirror of
https://github.com/btcsuite/btcd.git
synced 2025-02-24 06:47:59 +01:00
In this commit, we turn the package into a new Go module (version 2), and then port over the current set of types and functions to mainly alias to the more optimized and maintained dcrec variant. Taking a look at the benchmarks, most operations other than normalization (which IIRC is a bit slower now due to constant time fixes) enjoy some nice speeds up: ``` benchcmp is deprecated in favor of benchstat: https://pkg.go.dev/golang.org/x/perf/cmd/benchstat benchmark old ns/op new ns/op delta BenchmarkAddJacobian-8 464 328 -29.20% BenchmarkAddJacobianNotZOne-8 1138 372 -67.27% BenchmarkScalarBaseMult-8 47336 31531 -33.39% BenchmarkScalarBaseMultLarge-8 42465 32057 -24.51% BenchmarkScalarMult-8 123355 117579 -4.68% BenchmarkNAF-8 582 168 -71.12% BenchmarkSigVerify-8 175414 120794 -31.14% BenchmarkFieldNormalize-8 23.8 24.4 +2.39% BenchmarkParseCompressedPubKey-8 24282 10907 -55.08% ```
51 lines
1.8 KiB
Go
51 lines
1.8 KiB
Go
// Copyright (c) 2013-2014 The btcsuite developers
|
|
// Use of this source code is governed by an ISC
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package btcec
|
|
|
|
import (
|
|
secp "github.com/decred/dcrd/dcrec/secp256k1/v4"
|
|
)
|
|
|
|
// These constants define the lengths of serialized public keys.
|
|
const (
|
|
PubKeyBytesLenCompressed = 33
|
|
)
|
|
|
|
const (
|
|
pubkeyCompressed byte = 0x2 // y_bit + x coord
|
|
pubkeyUncompressed byte = 0x4 // x coord + y coord
|
|
pubkeyHybrid byte = 0x6 // y_bit + x coord + y coord
|
|
)
|
|
|
|
// IsCompressedPubKey returns true the the passed serialized public key has
|
|
// been encoded in compressed format, and false otherwise.
|
|
func IsCompressedPubKey(pubKey []byte) bool {
|
|
// The public key is only compressed if it is the correct length and
|
|
// the format (first byte) is one of the compressed pubkey values.
|
|
return len(pubKey) == PubKeyBytesLenCompressed &&
|
|
(pubKey[0]&^byte(0x1) == pubkeyCompressed)
|
|
}
|
|
|
|
// ParsePubKey parses a public key for a koblitz curve from a bytestring into a
|
|
// ecdsa.Publickey, verifying that it is valid. It supports compressed,
|
|
// uncompressed and hybrid signature formats.
|
|
func ParsePubKey(pubKeyStr []byte) (*PublicKey, error) {
|
|
return secp.ParsePubKey(pubKeyStr)
|
|
}
|
|
|
|
// PublicKey is an ecdsa.PublicKey with additional functions to
|
|
// serialize in uncompressed, compressed, and hybrid formats.
|
|
type PublicKey = secp.PublicKey
|
|
|
|
// NewPublicKey instantiates a new public key with the given x and y
|
|
// coordinates.
|
|
//
|
|
// It should be noted that, unlike ParsePubKey, since this accepts arbitrary x
|
|
// and y coordinates, it allows creation of public keys that are not valid
|
|
// points on the secp256k1 curve. The IsOnCurve method of the returned instance
|
|
// can be used to determine validity.
|
|
func NewPublicKey(x, y *FieldVal) *PublicKey {
|
|
return secp.NewPublicKey(x, y)
|
|
}
|