summaryrefslogtreecommitdiff
path: root/server/passwords/passwords.go
diff options
context:
space:
mode:
Diffstat (limited to 'server/passwords/passwords.go')
-rw-r--r--server/passwords/passwords.go38
1 files changed, 38 insertions, 0 deletions
diff --git a/server/passwords/passwords.go b/server/passwords/passwords.go
new file mode 100644
index 0000000..0524f24
--- /dev/null
+++ b/server/passwords/passwords.go
@@ -0,0 +1,38 @@
+package passwords
+
+import (
+ "golang.org/x/crypto/argon2"
+ "crypto/subtle"
+ "crypto/rand"
+ "bytes"
+ "log"
+)
+
+const version = 0
+
+func doHash(ver int, password string, salt []byte) []byte {
+ return argon2.IDKey([]byte(password), salt, 1, 64*1024, 4, 32)
+}
+
+func Hash(password string) []byte {
+ var buf bytes.Buffer
+ buf.WriteByte(version)
+
+ salt := make([]byte, 32)
+ _, err := rand.Read(salt)
+ if err != nil {
+ log.Fatal("error generating password hash:", err)
+ }
+ buf.Write(doHash(version, password, salt))
+ buf.Write(salt)
+
+ return buf.Bytes()
+}
+
+func Check(password string, hash []byte) bool {
+ ver := int(hash[0])
+ hashData := hash[1:33]
+ salt := hash[33:]
+ check := doHash(ver, password, salt)
+ return subtle.ConstantTimeCompare(hashData, check) == 1
+}