github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/cosmos-sdk/crypto/keys/keybase_base_okchain.go (about)

     1  package keys
     2  
     3  import (
     4  	"encoding/hex"
     5  	"fmt"
     6  	ethcrypto "github.com/ethereum/go-ethereum/crypto"
     7  	"github.com/pkg/errors"
     8  )
     9  
    10  func encode(derivedPriv [32]byte) string {
    11  	src := make([]byte, len(derivedPriv))
    12  	for idx, m := range derivedPriv {
    13  		src[idx] = m
    14  	}
    15  	dst := make([]byte, hex.EncodedLen(len(src)))
    16  	hex.Encode(dst, src)
    17  	return string(dst)
    18  }
    19  
    20  func decode(key string) [32]byte {
    21  	src := []byte(key)
    22  	dst := make([]byte, hex.DecodedLen(len(src)))
    23  	n, err := hex.Decode(dst, src)
    24  	if err != nil {
    25  		panic(err)
    26  	}
    27  
    28  	if n != 32 {
    29  		panic("invalid input!")
    30  	}
    31  
    32  	var res [32]byte
    33  	for idx, m := range dst {
    34  		res[idx] = m
    35  	}
    36  
    37  	return res
    38  }
    39  
    40  func deriveKeyByPrivKey(privKey string, algo SigningAlgo) ([]byte, error) {
    41  	switch algo {
    42  	case Secp256k1:
    43  		decodePriv := decode(privKey)
    44  		keyStr := encode(decodePriv)
    45  		if privKey != keyStr {
    46  			return nil, fmt.Errorf("invalid private key '%s', algo '%s'", privKey, algo)
    47  		}
    48  		return decodePriv[:], nil
    49  	case SigningAlgo("eth_secp256k1"):
    50  		privKeyECDSA, err := ethcrypto.HexToECDSA(privKey)
    51  		if err != nil {
    52  			return nil, fmt.Errorf("invalid private key '%s', algo '%s', error: %s", privKey, algo, err)
    53  		}
    54  
    55  		return ethcrypto.FromECDSA(privKeyECDSA), nil
    56  	default:
    57  		return nil, errors.Wrap(ErrUnsupportedSigningAlgo, string(algo))
    58  	}
    59  }