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 }