github.com/project-88388/tendermint-v0.34.14-terra.2@v1.0.0/crypto/encoding/codec.go (about)

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