github.com/line/ostracon@v1.0.10-0.20230328032236-7f20145f065d/crypto/encoding/codec.go (about) 1 package encoding 2 3 import ( 4 "fmt" 5 6 pc "github.com/tendermint/tendermint/proto/tendermint/crypto" 7 8 "github.com/line/ostracon/crypto" 9 "github.com/line/ostracon/crypto/ed25519" 10 "github.com/line/ostracon/crypto/secp256k1" 11 "github.com/line/ostracon/libs/json" 12 ) 13 14 func init() { 15 json.RegisterType((*pc.PublicKey)(nil), "ostracon.crypto.PublicKey") 16 json.RegisterType((*pc.PublicKey_Ed25519)(nil), "ostracon.crypto.PublicKey_Ed25519") 17 json.RegisterType((*pc.PublicKey_Secp256K1)(nil), "ostracon.crypto.PublicKey_Secp256K1") 18 } 19 20 // PubKeyToProto takes crypto.PubKey and transforms it to a protobuf Pubkey 21 func PubKeyToProto(k crypto.PubKey) (pc.PublicKey, error) { 22 var kp pc.PublicKey 23 switch k := k.(type) { 24 case ed25519.PubKey: 25 kp = pc.PublicKey{ 26 Sum: &pc.PublicKey_Ed25519{ 27 Ed25519: k, 28 }, 29 } 30 case secp256k1.PubKey: 31 kp = pc.PublicKey{ 32 Sum: &pc.PublicKey_Secp256K1{ 33 Secp256K1: k, 34 }, 35 } 36 default: 37 return kp, fmt.Errorf("toproto: key type %v is not supported", k) 38 } 39 return kp, nil 40 } 41 42 // PubKeyFromProto takes a protobuf Pubkey and transforms it to a crypto.Pubkey 43 func PubKeyFromProto(k *pc.PublicKey) (crypto.PubKey, error) { 44 switch k := k.Sum.(type) { 45 case *pc.PublicKey_Ed25519: 46 if len(k.Ed25519) != ed25519.PubKeySize { 47 return nil, fmt.Errorf("invalid size for PubKeyEd25519. Got %d, expected %d", 48 len(k.Ed25519), ed25519.PubKeySize) 49 } 50 pk := make(ed25519.PubKey, ed25519.PubKeySize) 51 copy(pk, k.Ed25519) 52 return pk, nil 53 case *pc.PublicKey_Secp256K1: 54 if len(k.Secp256K1) != secp256k1.PubKeySize { 55 return nil, fmt.Errorf("invalid size for PubKeySecp256k1. Got %d, expected %d", 56 len(k.Secp256K1), secp256k1.PubKeySize) 57 } 58 pk := make(secp256k1.PubKey, secp256k1.PubKeySize) 59 copy(pk, k.Secp256K1) 60 return pk, nil 61 default: 62 return nil, fmt.Errorf("fromproto: key type %v is not supported", k) 63 } 64 }