// Copyright (C) 2019 Marius Schellenberger package main import ( "flag" "fmt" "git.giftfish.de/ston1th/gocrypt/pkg/crypto" "git.giftfish.de/ston1th/godrop/v2" "io" "io/ioutil" "os" ) var ( encMode bool decMode bool input string output string ) func fatal(err error) { if err != nil { fatals(err.Error()) } } func fatals(s string) { stderr("error: " + s + "\n") os.Exit(1) } func stderr(s string) { fmt.Fprintf(os.Stderr, s) } func init() { fatal(godrop.PledgePromises("stdio rpath wpath cpath tty unveil")) fatal(godrop.Unveil("/", "")) flag.BoolVar(&encMode, "enc", false, "encryption mode - password is read from stdin") flag.BoolVar(&decMode, "dec", false, "decryption mode - password is read from stdin") flag.StringVar(&input, "f", "", "input file") flag.StringVar(&output, "o", "-", "output file (default stdout)") flag.Parse() } func main() { var ( in []byte out io.WriteCloser err error ) if input == "" { fatals("input file is empty") } else { fatal(godrop.Unveil(input, "r")) in, err = ioutil.ReadFile(input) fatal(err) } if output == "" { fatals("output file is empty") } else if output == "-" { out = os.Stdout } else { fatal(godrop.Unveil(output, "wc")) out, err = os.OpenFile(output, os.O_WRONLY|os.O_CREATE, 0640) fatal(err) } fatal(godrop.PledgePromises("stdio tty")) stderr("Enter password: ") pass, err := crypto.Password() stderr("\n") fatal(err) fatal(godrop.PledgePromises("stdio")) switch { case encMode == true: err = crypto.Encrypt(pass, in, out) fatal(err) case decMode == true: err = crypto.Decrypt(pass, in, out) fatal(err) } fatal(out.Close()) }