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  }