summaryrefslogtreecommitdiff
path: root/src/scrypt.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/scrypt.go90
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,
+ }))
}