github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/tm2/pkg/crypto/keys/client/verify.go (about)

     1  package client
     2  
     3  import (
     4  	"context"
     5  	"encoding/hex"
     6  	"flag"
     7  	"os"
     8  
     9  	"github.com/gnolang/gno/tm2/pkg/commands"
    10  	"github.com/gnolang/gno/tm2/pkg/crypto/keys"
    11  )
    12  
    13  type VerifyCfg struct {
    14  	RootCfg *BaseCfg
    15  
    16  	DocPath string
    17  }
    18  
    19  func NewVerifyCmd(rootCfg *BaseCfg, io commands.IO) *commands.Command {
    20  	cfg := &VerifyCfg{
    21  		RootCfg: rootCfg,
    22  	}
    23  
    24  	return commands.NewCommand(
    25  		commands.Metadata{
    26  			Name:       "verify",
    27  			ShortUsage: "verify [flags] <key-name> <signature>",
    28  			ShortHelp:  "verifies the document signature",
    29  		},
    30  		cfg,
    31  		func(_ context.Context, args []string) error {
    32  			return execVerify(cfg, args, io)
    33  		},
    34  	)
    35  }
    36  
    37  func (c *VerifyCfg) RegisterFlags(fs *flag.FlagSet) {
    38  	fs.StringVar(
    39  		&c.DocPath,
    40  		"docpath",
    41  		"",
    42  		"path of document file to verify",
    43  	)
    44  }
    45  
    46  func execVerify(cfg *VerifyCfg, args []string, io commands.IO) error {
    47  	var (
    48  		kb  keys.Keybase
    49  		err error
    50  	)
    51  
    52  	if len(args) != 2 {
    53  		return flag.ErrHelp
    54  	}
    55  
    56  	name := args[0]
    57  	sig, err := parseSignature(args[1])
    58  	if err != nil {
    59  		return err
    60  	}
    61  	docpath := cfg.DocPath
    62  	kb, err = keys.NewKeyBaseFromDir(cfg.RootCfg.Home)
    63  	if err != nil {
    64  		return err
    65  	}
    66  	msg := []byte{}
    67  
    68  	// read document to sign
    69  	if docpath == "" { // from stdin.
    70  		msgstr, err := io.GetString(
    71  			"Enter document to sign.",
    72  		)
    73  		if err != nil {
    74  			return err
    75  		}
    76  		msg = []byte(msgstr)
    77  	} else { // from file
    78  		msg, err = os.ReadFile(docpath)
    79  		if err != nil {
    80  			return err
    81  		}
    82  	}
    83  
    84  	// validate document to sign.
    85  	// XXX
    86  
    87  	// verify signature.
    88  	err = kb.Verify(name, msg, sig)
    89  	if err == nil {
    90  		io.Println("Valid signature!")
    91  	}
    92  	return err
    93  }
    94  
    95  func parseSignature(sigstr string) ([]byte, error) {
    96  	sig, err := hex.DecodeString(sigstr)
    97  	if err != nil {
    98  		return nil, err
    99  	}
   100  	return sig, nil
   101  }