From bcbb629db87b6bc0e9a7880ec4ee1c90d284a6c7 Mon Sep 17 00:00:00 2001 From: Rose Hogenson Date: Sun, 5 Oct 2025 21:58:44 -0700 Subject: Bring back the notepad --- tools/finditers/finditers.go | 42 ++++++++++++++++++++++++++++++++++++++++++ tools/hashpw/hashpw.go | 32 ++++++++++++++++++++++++++++++++ tools/secret-key/secret-key.go | 14 ++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 tools/finditers/finditers.go create mode 100644 tools/hashpw/hashpw.go create mode 100644 tools/secret-key/secret-key.go (limited to 'tools') diff --git a/tools/finditers/finditers.go b/tools/finditers/finditers.go new file mode 100644 index 0000000..31a7e33 --- /dev/null +++ b/tools/finditers/finditers.go @@ -0,0 +1,42 @@ +package main + +import ( + "encoding/hex" + "fmt" + "sort" + "testing" + "time" + + "gitlab.com/rhogenson/roseh.moe/internal/pwhash" +) + +func mustHex(t testing.TB, s string) []byte { + t.Helper() + b, err := hex.DecodeString(s) + if err != nil { + t.Fatalf("Invalid hex %q: %s", s, err) + } + return b +} + +var iterations int + +func BenchmarkHashIter(b *testing.B) { + const pw = "atypical evasion foyer roulette throng awning stability exchange humorless vowed" + salt := mustHex(b, "4250af599e07cde7") + for b.Loop() { + pwhash.HashIter(pw, salt, iterations) + } +} + +func main() { + const targetDuration = 5 * time.Second + for iterations = 4096; time.Duration(testing.Benchmark(BenchmarkHashIter).NsPerOp()) < targetDuration; iterations *= 2 { + } + lo := iterations / 2 + hi := iterations + fmt.Println(lo + sort.Search(hi-lo, func(i int) bool { + iterations = lo + i + return time.Duration(testing.Benchmark(BenchmarkHashIter).NsPerOp()) > targetDuration + })) +} diff --git a/tools/hashpw/hashpw.go b/tools/hashpw/hashpw.go new file mode 100644 index 0000000..c668622 --- /dev/null +++ b/tools/hashpw/hashpw.go @@ -0,0 +1,32 @@ +package main + +import ( + "encoding/base64" + "fmt" + "os" + + "gitlab.com/rhogenson/roseh.moe/internal/pwhash" + "golang.org/x/term" +) + +func hashpw() error { + fmt.Fprint(os.Stderr, "Enter password: ") + password, err := term.ReadPassword(int(os.Stdin.Fd())) + fmt.Fprintln(os.Stderr) + if err != nil { + return err + } + hash, err := pwhash.Hash(string(password)) + if err != nil { + return err + } + fmt.Printf("notepad-password=%s\n", base64.RawURLEncoding.EncodeToString(hash)) + return nil +} + +func main() { + if err := hashpw(); err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(1) + } +} diff --git a/tools/secret-key/secret-key.go b/tools/secret-key/secret-key.go new file mode 100644 index 0000000..969828a --- /dev/null +++ b/tools/secret-key/secret-key.go @@ -0,0 +1,14 @@ +package main + +import ( + "crypto/rand" + "crypto/sha256" + "encoding/base64" + "fmt" +) + +func main() { + buf := make([]byte, sha256.BlockSize) + rand.Read(buf) + fmt.Printf("secret-key=%s\n", base64.RawURLEncoding.EncodeToString(buf)) +} -- cgit v1.3.1