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 }