github.com/kubri/kubri@v0.5.1-0.20240317001612-bda2aaef967e/pkg/cmd/keys_public.go (about)

     1  package cmd
     2  
     3  import (
     4  	"github.com/spf13/cobra"
     5  
     6  	"github.com/kubri/kubri/pkg/crypto/dsa"
     7  	"github.com/kubri/kubri/pkg/crypto/ed25519"
     8  	"github.com/kubri/kubri/pkg/crypto/pgp"
     9  	"github.com/kubri/kubri/pkg/crypto/rsa"
    10  	"github.com/kubri/kubri/pkg/secret"
    11  )
    12  
    13  func keysPublicCmd() *cobra.Command {
    14  	cmd := &cobra.Command{
    15  		Use:       "public (dsa|ed25519|pgp|rsa)",
    16  		Short:     "Output public key",
    17  		Aliases:   []string{"p"},
    18  		Args:      cobra.ExactArgs(1),
    19  		ValidArgs: []string{"dsa", "ed25519", "pgp", "rsa"},
    20  		RunE: func(cmd *cobra.Command, args []string) error {
    21  			var (
    22  				pub []byte
    23  				err error
    24  			)
    25  			switch args[0] {
    26  			case "dsa":
    27  				pub, err = getPublicKey("dsa_key", dsa.UnmarshalPrivateKey, dsa.Public, dsa.MarshalPublicKey)
    28  			case "ed25519":
    29  				pub, err = getPublicKey("ed25519_key", ed25519.UnmarshalPrivateKey, ed25519.Public, ed25519.MarshalPublicKey)
    30  			case "pgp":
    31  				pub, err = getPublicKey("pgp_key", pgp.UnmarshalPrivateKey, pgp.Public, pgp.MarshalPublicKey)
    32  			case "rsa":
    33  				pub, err = getPublicKey("rsa_key", rsa.UnmarshalPrivateKey, rsa.Public, rsa.MarshalPublicKey)
    34  			}
    35  			if err != nil {
    36  				return err
    37  			}
    38  			_, err = cmd.OutOrStdout().Write(pub)
    39  			return err
    40  		},
    41  	}
    42  
    43  	return cmd
    44  }
    45  
    46  func getPublicKey[Private, Public any](
    47  	name string,
    48  	unmarshal func([]byte) (Private, error),
    49  	public func(Private) Public,
    50  	marshal func(Public) ([]byte, error),
    51  ) ([]byte, error) {
    52  	priv, err := secret.Get(name)
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  	key, err := unmarshal(priv)
    57  	if err != nil {
    58  		return nil, err
    59  	}
    60  	return marshal(public(key))
    61  }