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  }