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 }