github.com/okex/exchain@v1.8.0/libs/tendermint/crypto/encoding/codec.go (about) 1 package encoding 2 3 import ( 4 "errors" 5 "fmt" 6 7 "github.com/okex/exchain/libs/tendermint/crypto" 8 "github.com/okex/exchain/libs/tendermint/crypto/ed25519" 9 "github.com/okex/exchain/libs/tendermint/crypto/secp256k1" 10 pc "github.com/okex/exchain/libs/tendermint/proto/crypto/keys" 11 ) 12 13 type PubKeyType uint8 14 15 const ( 16 Unknown PubKeyType = iota 17 Ed25519 18 Secp256k1 19 ) 20 21 // PubKeyToProto takes crypto.PubKey and transforms it to a protobuf Pubkey 22 func PubKeyToProto(k crypto.PubKey) (pc.PublicKey, error) { 23 if k == nil { 24 return pc.PublicKey{}, errors.New("nil PublicKey") 25 } 26 var kp pc.PublicKey 27 switch k := k.(type) { 28 case ed25519.PubKeyEd25519: 29 kp = pc.PublicKey{ 30 Sum: &pc.PublicKey_Ed25519{ 31 Ed25519: k[:], 32 }, 33 } 34 case secp256k1.PubKeySecp256k1: 35 kp = pc.PublicKey{ 36 Sum: &pc.PublicKey_Secp256K1{ 37 Secp256K1: k[:], 38 }, 39 } 40 default: 41 return kp, fmt.Errorf("toproto: key type %v is not supported", k) 42 } 43 return kp, nil 44 } 45 46 // PubKeyFromProto takes a protobuf Pubkey and transforms it to a crypto.Pubkey 47 // Return one more parameter to prevent of slowing down the whole procedure 48 func PubKeyFromProto(k *pc.PublicKey) (crypto.PubKey, PubKeyType, error) { 49 if k == nil { 50 return nil, Unknown, errors.New("nil PublicKey") 51 } 52 switch k := k.Sum.(type) { 53 case *pc.PublicKey_Ed25519: 54 if len(k.Ed25519) != ed25519.PubKeyEd25519Size { 55 return nil, Unknown, fmt.Errorf("invalid size for PubKeyEd25519. Got %d, expected %d", 56 len(k.Ed25519), ed25519.PubKeyEd25519Size) 57 } 58 var pk ed25519.PubKeyEd25519 59 copy(pk[:], k.Ed25519) 60 return pk, Ed25519, nil 61 case *pc.PublicKey_Secp256K1: 62 if len(k.Secp256K1) != secp256k1.PubKeySecp256k1Size { 63 return nil, Unknown, fmt.Errorf("invalid size for PubKeySecp256k1. Got %d, expected %d", 64 len(k.Secp256K1), secp256k1.PubKeySecp256k1Size) 65 } 66 var pk secp256k1.PubKeySecp256k1 67 copy(pk[:], k.Secp256K1) 68 return pk, Secp256k1, nil 69 default: 70 return nil, Unknown, fmt.Errorf("fromproto: key type %v is not supported", k) 71 } 72 }