github.com/chain5j/chain5j-pkg@v1.0.7/crypto/signature/secp256k1/btcecv1/privkey.go (about)

     1  // Copyright (c) 2013-2016 The btcsuite developers
     2  // Use of this source code is governed by an ISC
     3  // license that can be found in the LICENSE file.
     4  
     5  package btcecv1
     6  
     7  import (
     8  	"crypto/ecdsa"
     9  	"crypto/elliptic"
    10  	"crypto/rand"
    11  	"math/big"
    12  )
    13  
    14  // PrivateKey wraps an ecdsa.PrivateKey as a convenience mainly for signing
    15  // things with the the private key without having to directly import the ecdsa
    16  // package.
    17  type PrivateKey ecdsa.PrivateKey
    18  
    19  // PrivKeyFromBytes returns a private and public key for `curve' based on the
    20  // private key passed as an argument as a byte slice.
    21  func PrivKeyFromBytes(curve elliptic.Curve, pk []byte) (*PrivateKey,
    22  	*PublicKey) {
    23  	x, y := curve.ScalarBaseMult(pk)
    24  
    25  	priv := &ecdsa.PrivateKey{
    26  		PublicKey: ecdsa.PublicKey{
    27  			Curve: curve,
    28  			X:     x,
    29  			Y:     y,
    30  		},
    31  		D: new(big.Int).SetBytes(pk),
    32  	}
    33  
    34  	return (*PrivateKey)(priv), (*PublicKey)(&priv.PublicKey)
    35  }
    36  
    37  // NewPrivateKey is a wrapper for ecdsa.GenerateKey that returns a PrivateKey
    38  // instead of the normal ecdsa.PrivateKey.
    39  func NewPrivateKey(curve elliptic.Curve) (*PrivateKey, error) {
    40  	key, err := ecdsa.GenerateKey(curve, rand.Reader)
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  	return (*PrivateKey)(key), nil
    45  }
    46  
    47  // PubKey returns the PublicKey corresponding to this private key.
    48  func (p *PrivateKey) PubKey() *PublicKey {
    49  	return (*PublicKey)(&p.PublicKey)
    50  }
    51  
    52  // ToECDSA returns the private key as a *ecdsa.PrivateKey.
    53  func (p *PrivateKey) ToECDSA() *ecdsa.PrivateKey {
    54  	return (*ecdsa.PrivateKey)(p)
    55  }
    56  
    57  // Sign generates an ECDSA signature for the provided hash (which should be the result
    58  // of hashing a larger message) using the private key. Produced signature
    59  // is deterministic (same message and same key yield the same signature) and canonical
    60  // in accordance with RFC6979 and BIP0062.
    61  func (p *PrivateKey) Sign(hash []byte) (*Signature, error) {
    62  	return signRFC6979(p, hash)
    63  }
    64  
    65  // PrivKeyBytesLen defines the length in bytes of a serialized private key.
    66  const PrivKeyBytesLen = 32
    67  
    68  // Serialize returns the private key number d as a big-endian binary-encoded
    69  // number, padded to a length of 32 bytes.
    70  func (p *PrivateKey) Serialize() []byte {
    71  	b := make([]byte, 0, PrivKeyBytesLen)
    72  	return paddedAppend(PrivKeyBytesLen, b, p.ToECDSA().D.Bytes())
    73  }