summaryrefslogtreecommitdiff
path: root/src/scrypt.go
diff options
context:
space:
mode:
authorEuAndreh <eu@euandre.org>2026-02-28 11:39:42 -0300
committerEuAndreh <eu@euandre.org>2026-02-28 11:39:44 -0300
commitf691d7cdb45477fe2eba0689f054035ec68cac25 (patch)
tree2b55a14336c340d380e7a60d97da4c4c427572f4 /src/scrypt.go
parentMakefile: Add switch for picking number of parallel fuzz workers (diff)
downloadscrypt-f691d7cdb45477fe2eba0689f054035ec68cac25.tar.gz
scrypt-f691d7cdb45477fe2eba0689f054035ec68cac25.tar.xz
src/scrypt.go: Get password and salt from stdinHEADmain
Instead of passing the password and salt as arguments to the command, read it from stdin instead, as the argument to a process are visible to all other processes.
Diffstat (limited to 'src/scrypt.go')
-rw-r--r--src/scrypt.go92
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
+ }
+ }
}