diff options
Diffstat (limited to '')
-rw-r--r-- | src/scrypt.go | 90 |
1 files changed, 71 insertions, 19 deletions
diff --git a/src/scrypt.go b/src/scrypt.go index 511546f..6e212b4 100644 --- a/src/scrypt.go +++ b/src/scrypt.go @@ -3,12 +3,14 @@ package scrypt import ( "crypto/rand" "encoding/hex" + "flag" "fmt" "io" "os" "slices" gt "gotext" + g "gobang" ) @@ -39,17 +41,29 @@ var ( -type HashInput struct{ +type HashInputT struct{ Password []byte Salt []byte } -type CheckInput struct{ +type CheckInputT struct{ Password []byte Salt []byte Hash []byte } +type argsT struct{ + allArgs []string + input HashInputT +} + +type envT struct{ + args argsT + in io.Reader + out io.Writer + err io.Writer +} + // Package scrypt implements the scrypt key derivation function as defined in @@ -108,7 +122,7 @@ func scrypt( return out, nil } -func Hash(input HashInput) ([]byte, error) { +func Hash(input HashInputT) ([]byte, error) { if len(input.Salt) < _SALT_MIN_LENGTH { return nil, ErrSaltTooSmall } @@ -137,8 +151,8 @@ func Salt() ([]byte, error) { return SaltFrom(rand.Reader) } -func Check(input CheckInput) (bool, error) { - hashInput := HashInput{ +func Check(input CheckInputT) (bool, error) { + hashInput := HashInputT{ Password: input.Password, Salt: input.Salt, } @@ -151,29 +165,67 @@ func Check(input CheckInput) (bool, error) { return slices.Equal(candidate, input.Hash), nil } +func usage(argv0 string, w io.Writer) { + fmt.Fprintf( + w, + "Usage: %s PASSWORD SALT\n", + argv0, + ) +} +func getopt(allArgs []string, w io.Writer) (argsT, int) { + argv0 := allArgs[0] + argv := allArgs[1:] + fs := flag.NewFlagSet("", flag.ContinueOnError) + fs.Usage = func() {} + fs.SetOutput(w) -func Main() { - if len(os.Args) != 3 { - fmt.Fprintf(os.Stderr, gt.Gettext("Usage: scrypt PASSWORD SALT\n")) - os.Exit(2) + if fs.Parse(argv) != nil { + usage(argv0, w) + return argsT{}, 2 + } + + subArgs := fs.Args() + if len(subArgs) != 2 { + usage(argv0, w) + return argsT{}, 2 } - password := []byte(os.Args[1]) - salt := []byte(os.Args[2]) - input := HashInput{ + password := []byte(subArgs[0]) + salt := []byte(subArgs[1]) + input := HashInputT{ Password: password, Salt: salt, } - payload, err := Hash(input) + return argsT{ + allArgs: allArgs, + input: input, + }, 0 +} + +func run(env envT) int { + payload, err := Hash(env.args.input) if err != nil { - if err == ErrSaltTooSmall { - fmt.Fprintln(os.Stderr, err) - os.Exit(2) - } - panic(err) + fmt.Fprintln(env.err, err) + return 1 } - fmt.Println(hex.EncodeToString(payload)) + fmt.Fprintln(env.out, hex.EncodeToString(payload)) + return 0 +} + + + +func Main() { + g.Init() + gt.Init(Name, LOCALEDIR) + args, rc := getopt(os.Args, os.Stderr) + g.ExitIf(rc) + os.Exit(run(envT{ + args: args, + in: os.Stdin, + out: os.Stdout, + err: os.Stderr, + })) } |