summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRose Hogenson <rosehogenson@posteo.net>2025-09-23 22:14:57 -0700
committerRose Hogenson <rosehogenson@posteo.net>2025-09-23 22:14:57 -0700
commit24bdae7a803461bd9b13408f4fd332ebed5b5ac3 (patch)
treea70ab4b723bce8a6a499bb367b90a04af0d9ea6c
parente3f71dedf3fcbd9e9112880f4b2a442cabd9fba6 (diff)
downloadroseh.moe-24bdae7a803461bd9b13408f4fd332ebed5b5ac3.tar.zst
Use HMAC instead of ed25519
-rw-r--r--roseh.moe.go38
1 files changed, 20 insertions, 18 deletions
diff --git a/roseh.moe.go b/roseh.moe.go
index e2500ca..c75acca 100644
--- a/roseh.moe.go
+++ b/roseh.moe.go
@@ -4,8 +4,9 @@ import (
"bytes"
"crypto/aes"
"crypto/cipher"
- "crypto/ed25519"
+ "crypto/hmac"
"crypto/rand"
+ "crypto/sha512"
"crypto/subtle"
"embed"
"encoding/base64"
@@ -36,8 +37,7 @@ var (
var (
notepadPassword []byte
notepadPasswordSalt []byte
- privateKey ed25519.PrivateKey
- publicKey ed25519.PublicKey
+ privateKey []byte
encryptionKeyMu sync.Mutex
encryptionKey cipher.AEAD
@@ -54,21 +54,19 @@ func loadSecrets() error {
if _, err := hex.Decode(notepadPassword, pw); err != nil {
return err
}
- } else if key, ok := bytes.CutPrefix(line, []byte("secret-key=")); ok {
- seed := make([]byte, hex.DecodedLen(len(key)))
- if _, err := hex.Decode(seed, key); err != nil {
- return err
- }
- if len(seed) != ed25519.SeedSize {
- return fmt.Errorf("invalid ed25519 key")
- }
- privateKey = ed25519.NewKeyFromSeed(seed)
- publicKey = privateKey.Public().(ed25519.PublicKey)
} else if salt, ok := bytes.CutPrefix(line, []byte("salt=")); ok {
notepadPasswordSalt = make([]byte, hex.DecodedLen(len(salt)))
if _, err := hex.Decode(notepadPasswordSalt, salt); err != nil {
return err
}
+ } else if key, ok := bytes.CutPrefix(line, []byte("secret-key=")); ok {
+ if hex.DecodedLen(len(key)) != sha512.Size256 {
+ return fmt.Errorf("invalid HMAC-SHA512/256 key")
+ }
+ privateKey = make([]byte, hex.DecodedLen(len(key)))
+ if _, err := hex.Decode(privateKey, key); err != nil {
+ return err
+ }
}
}
return nil
@@ -146,10 +144,11 @@ func attachCookie(w http.ResponseWriter) error {
if err != nil {
return err
}
- sig := ed25519.Sign(privateKey, nowBytes)
+ mac := hmac.New(sha512.New512_256, privateKey)
+ mac.Write(nowBytes)
http.SetCookie(w, &http.Cookie{
Name: "auth",
- Value: base64.RawStdEncoding.EncodeToString(append(nowBytes, sig...)),
+ Value: base64.RawStdEncoding.EncodeToString(append(nowBytes, mac.Sum(nil)...)),
Path: "/notepad",
Expires: time.Now().Add(cookieExpiration),
Secure: true,
@@ -171,11 +170,14 @@ func cookieAuth(w http.ResponseWriter, r *http.Request) (string, bool) {
if err != nil {
return "", false
}
- if len(bytes) < ed25519.SignatureSize {
+ mac := hmac.New(sha512.New512_256, privateKey)
+ macSize := mac.Size()
+ if len(bytes) < macSize {
return "", false
}
- msg, sig := bytes[:len(bytes)-ed25519.SignatureSize], bytes[len(bytes)-ed25519.SignatureSize:]
- if !ed25519.Verify(publicKey, msg, sig) {
+ msg, sig := bytes[:len(bytes)-macSize], bytes[len(bytes)-macSize:]
+ mac.Write(msg)
+ if !hmac.Equal(sig, mac.Sum(nil)) {
return "", false
}
var t time.Time