github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/valkeystore/signer.go (about)

     1  package valkeystore
     2  
     3  import (
     4  	"crypto/ecdsa"
     5  
     6  	"github.com/unicornultrafoundation/go-u2u/crypto"
     7  
     8  	"github.com/unicornultrafoundation/go-u2u/native/validatorpk"
     9  	"github.com/unicornultrafoundation/go-u2u/valkeystore/encryption"
    10  )
    11  
    12  type SignerI interface {
    13  	Sign(pubkey validatorpk.PubKey, digest []byte) ([]byte, error)
    14  }
    15  
    16  type Signer struct {
    17  	backend KeystoreI
    18  }
    19  
    20  func NewSigner(backend KeystoreI) *Signer {
    21  	return &Signer{
    22  		backend: backend,
    23  	}
    24  }
    25  
    26  func (s *Signer) Sign(pubkey validatorpk.PubKey, digest []byte) ([]byte, error) {
    27  	if pubkey.Type != validatorpk.Types.Secp256k1 {
    28  		return nil, encryption.ErrNotSupportedType
    29  	}
    30  	key, err := s.backend.GetUnlocked(pubkey)
    31  	if err != nil {
    32  		return nil, err
    33  	}
    34  
    35  	secp256k1Key := key.Decoded.(*ecdsa.PrivateKey)
    36  
    37  	sigRSV, err := crypto.Sign(digest, secp256k1Key)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	sigRS := sigRSV[:64]
    42  	return sigRS, err
    43  }