package main import ( "context" "encoding" "flag" "log" "os" "dim13.org/signify/ask" "dim13.org/signify/b64file" "dim13.org/signify/key" "github.com/google/subcommands" ) // Usage: signify -G [-n] [-c comment] -p pubkey -s seckey type generateCmd struct { nopass bool comment string pubFile string secFile string } func (m *generateCmd) Name() string { return "generate" } func (m *generateCmd) Synopsis() string { return "generate key" } func (m *generateCmd) Usage() string { return "generate [-n] [-c comment] -p pubkey -s seckey\n" } func (m *generateCmd) SetFlags(f *flag.FlagSet) { f.BoolVar(&m.nopass, "n", false, "no key passphrase") f.StringVar(&m.comment, "c", "signify", "comment") f.StringVar(&m.pubFile, "p", "", "public key file (required)") f.StringVar(&m.secFile, "s", "", "secret key file (required)") } func (m *generateCmd) Execute(ctx context.Context, f *flag.FlagSet, args ...interface{}) subcommands.ExitStatus { if m.pubFile == "" || m.secFile == "" { f.Usage() return subcommands.ExitUsageError } if err := ValidateNames(m.pubFile, m.secFile); err != nil { log.Println(err) return subcommands.ExitFailure } var der key.Deriver if !m.nopass { der = ask.Confirmed{} } pubKey, secKey, err := key.Generate(der) if err != nil { log.Println(err) return subcommands.ExitFailure } if err := m.writeFile(m.secFile, "secret key", secKey, ModeSec); err != nil { log.Println(err) return subcommands.ExitFailure } if err := m.writeFile(m.pubFile, "public key", pubKey, ModePub); err != nil { log.Println(err) return subcommands.ExitFailure } return subcommands.ExitSuccess } func (m *generateCmd) writeFile(fname, comment string, u encoding.BinaryMarshaler, mode os.FileMode) error { fd, err := Create(fname, mode) if err != nil { return err } defer fd.Close() return b64file.Encode(fd, u, m.comment+" "+comment, nil) }