diff options
Diffstat (limited to 'src/scrypt.go')
| -rw-r--r-- | src/scrypt.go | 92 |
1 files changed, 73 insertions, 19 deletions
diff --git a/src/scrypt.go b/src/scrypt.go index 1cb3b44..be00674 100644 --- a/src/scrypt.go +++ b/src/scrypt.go @@ -1,6 +1,7 @@ package scrypt import ( + "bufio" "crypto/rand" "encoding/hex" "flag" @@ -8,6 +9,7 @@ import ( "io" "os" "slices" + "strings" gt "gotext" g "gobang" @@ -54,7 +56,7 @@ type CheckInputT struct{ type argsT struct{ allArgs []string - input HashInputT + isCheck bool } type envT struct{ @@ -168,7 +170,7 @@ func Check(input CheckInputT) (bool, error) { func usage(argv0 string, w io.Writer) { fmt.Fprintf( w, - gt.Gettext("Usage: %s PASSWORD SALT\n"), + gt.Gettext("Usage: %s [-c]\n"), argv0, ) } @@ -177,6 +179,7 @@ func getopt(allArgs []string, w io.Writer) (argsT, int) { argv0 := allArgs[0] argv := allArgs[1:] fs := flag.NewFlagSet("", flag.ContinueOnError) + isCheck := fs.Bool("c", false, "") fs.Usage = func() {} fs.SetOutput(w) @@ -185,34 +188,85 @@ func getopt(allArgs []string, w io.Writer) (argsT, int) { return argsT{}, 2 } - subArgs := fs.Args() - if len(subArgs) != 2 { - usage(argv0, w) - return argsT{}, 2 - } - - password := []byte(subArgs[0]) - salt := []byte(subArgs[1]) - input := HashInputT{ - Password: password, - Salt: salt, - } return argsT{ allArgs: allArgs, - input: input, + isCheck: *isCheck, }, 0 } func run(env envT) int { - payload, err := Hash(env.args.input) + reader := bufio.NewReader(env.in) + + hexPassword, err := reader.ReadString('\n') if err != nil { fmt.Fprintln(env.err, err) - return 1 + return 2 } - fmt.Fprintln(env.out, hex.EncodeToString(payload)) - return 0 + password, err := hex.DecodeString(strings.TrimSpace(hexPassword)) + if err != nil { + fmt.Fprintln(env.err, err) + return 2 + } + + hexSalt, err := reader.ReadString('\n') + if err != nil { + fmt.Fprintln(env.err, err) + return 2 + } + + salt, err := hex.DecodeString(strings.TrimSpace(hexSalt)) + if err != nil { + fmt.Fprintln(env.err, err) + return 2 + } + + if !env.args.isCheck { + input := HashInputT{ + Password: password, + Salt: salt, + } + + payload, err := Hash(input) + if err != nil { + fmt.Fprintln(env.err, err) + return 2 + } + + fmt.Fprintln(env.out, hex.EncodeToString(payload)) + return 0 + } else { + hexHash, err := reader.ReadString('\n') + if err != nil { + fmt.Println(env.err, err) + return 2 + } + + hash, err := hex.DecodeString(strings.TrimSpace(hexHash)) + if err != nil { + fmt.Fprintln(env.err, err) + return 2 + } + + input := CheckInputT{ + Password: password, + Salt: salt, + Hash: hash, + } + + match, err := Check(input) + if err != nil { + fmt.Fprintln(env.err, err) + return 2 + } + + if match { + return 0 + } else { + return 1 + } + } } |
