package main import ( "errors" "flag" "fmt" "io/ioutil" "dim13.org/signify/file" "dim13.org/signify/key" ) // Usage: signify -V [-eqz] [-p pubkey] [-t keytype] [-x sigfile] -m message func verify(args []string) error { opts := flag.NewFlagSet("verify", flag.ExitOnError) var ( embedded = opts.Bool("e", false, "Embed message") quiet = opts.Bool("q", false, "Quiet mode") zip = opts.Bool("z", false, "Verify gzip archive") // TODO pubFile = opts.String("p", "", "Public key file") keyType = opts.String("t", "", "Key type") // TODO sigFile = opts.String("x", "", "Signature file") msgFile = opts.String("m", "", "Message file (required)") ) opts.Parse(args) if *embedded && *zip { return errors.New("can't combine -e and -z options") } if *msgFile == "" { opts.Usage() return nil } if *sigFile == "" { *sigFile = file.SigName(*msgFile) } _ = keyType // TODO sig, msg, verifyWith, err := openSig(*sigFile) if err != nil { return err } if *pubFile == "" { *pubFile = verifyWith } pubKey, err := openPub(*pubFile) if err != nil { return err } if !*embedded { msg, err = ioutil.ReadFile(*msgFile) if err != nil { return err } } if err := sig.Verify(msg, pubKey); err != nil { return err } if !*quiet { fmt.Println("Signature Verified") } return nil } func openPub(fname string) (*key.Pub, error) { block, err := file.DecodeFile(fname) if err != nil { return nil, err } return key.NewPub(block.Bytes) } func openSig(fname string) (*key.Sig, []byte, string, error) { block, err := file.DecodeFile(fname) if err != nil { return nil, nil, "", err } sig, err := key.NewSig(block.Bytes) if err != nil { return nil, nil, "", err } pubKey, _ := file.PubFile(block.Comment) return sig, block.Message, pubKey, nil }