...

Source file src/github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr/pubkey.go

Documentation: github.com/decred/dcrd/dcrec/secp256k1/v4/schnorr

     1  // Copyright (c) 2013-2014 The btcsuite developers
     2  // Copyright (c) 2015-2020 The Decred developers
     3  // Use of this source code is governed by an ISC
     4  // license that can be found in the LICENSE file.
     5  
     6  package schnorr
     7  
     8  import (
     9  	"fmt"
    10  
    11  	"github.com/decred/dcrd/dcrec/secp256k1/v4"
    12  )
    13  
    14  // These constants define the lengths of serialized public keys.
    15  const (
    16  	PubKeyBytesLen = 33
    17  )
    18  
    19  const (
    20  	// pubkeyCompressed is the header byte for a compressed secp256k1 pubkey.
    21  	pubkeyCompressed byte = 0x2 // y_bit + x coord
    22  )
    23  
    24  // ParsePubKey parses a public key for a koblitz curve from a bytestring into a
    25  // ecdsa.Publickey, verifying that it is valid. It supports compressed signature
    26  // formats only.
    27  func ParsePubKey(pubKeyStr []byte) (key *secp256k1.PublicKey, err error) {
    28  	if pubKeyStr == nil {
    29  		err = fmt.Errorf("nil pubkey byte string")
    30  		return
    31  	}
    32  	if len(pubKeyStr) != PubKeyBytesLen {
    33  		err = fmt.Errorf("bad pubkey byte string size (want %v, have %v)",
    34  			PubKeyBytesLen, len(pubKeyStr))
    35  		return
    36  	}
    37  	format := pubKeyStr[0]
    38  	format &= ^byte(0x1)
    39  	if format != pubkeyCompressed {
    40  		err = fmt.Errorf("wrong pubkey type (not compressed)")
    41  		return
    42  	}
    43  
    44  	return secp256k1.ParsePubKey(pubKeyStr)
    45  }
    46  

View as plain text