package main import ( "errors" "flag" "fmt" "os" ) /* signify -C [-q] -p pubkey -x sigfile [file ...] signify -G [-n] [-c comment] -p pubkey -s seckey signify -S [-ez] [-x sigfile] -s seckey -m message signify -V [-eqz] [-p pubkey] [-t keytype] [-x sigfile] -m message */ const safePath = "/etc/signify" var ErrEZ = errors.New("can't combine -e and -z options") var ( checksum = flag.Bool("C", false, "Verify a signed checksum list") generate = flag.Bool("G", false, "Generate a new key pair") sign = flag.Bool("S", false, "Sign the specfied message") verify = flag.Bool("V", false, "Verify the message") comment = flag.String("c", "signify", "Comment") embedded = flag.Bool("e", false, "Embed the message") msg = flag.String("m", "", "Message file") nopass = flag.Bool("n", false, "No key passphrase") pub = flag.String("p", "", "Public key file") quiet = flag.Bool("q", false, "Quiet mode") sec = flag.String("s", "", "Secret key file") sig = flag.String("x", "", "Signature file") gzip = flag.Bool("z", false, "Sign and verify gzip archives") ) type Mode int const ( ModeNone Mode = iota ModeCheck ModeGenerate ModeSign ModeVerify ) func (m *Mode) Set(v Mode) { if *m != ModeNone { usage() } *m = v } func usage() { flag.Usage() os.Exit(2) } func fatal(err error) { fmt.Println(err) os.Exit(1) } func main() { flag.Parse() mode := new(Mode) if *embedded && *gzip { fatal(ErrEZ) } if *generate { mode.Set(ModeGenerate) } if *checksum { mode.Set(ModeCheck) } if *sign { mode.Set(ModeSign) } if *verify { mode.Set(ModeVerify) } switch *mode { case ModeGenerate: if err := Generate(*pub, *sec, *comment, *nopass); err != nil { fatal(err) } case ModeSign: if err := Sign(*msg, *sec, *embedded); err != nil { fatal(err) } case ModeVerify: if err := Verify(*msg, *pub, *quiet); err != nil { fatal(err) } default: usage() } }