summaryrefslogtreecommitdiff
path: root/internal/notify/vapid_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'internal/notify/vapid_test.go')
-rw-r--r--internal/notify/vapid_test.go64
1 files changed, 64 insertions, 0 deletions
diff --git a/internal/notify/vapid_test.go b/internal/notify/vapid_test.go
new file mode 100644
index 0000000..a45047d
--- /dev/null
+++ b/internal/notify/vapid_test.go
@@ -0,0 +1,64 @@
+package notify
+
+import (
+ "encoding/base64"
+ "testing"
+)
+
+// TestValidateVAPIDPublicKey verifies that ValidateVAPIDPublicKey accepts valid
+// public keys and rejects private keys, empty strings, and invalid base64.
+func TestValidateVAPIDPublicKey(t *testing.T) {
+ pub, priv, err := GenerateVAPIDKeys()
+ if err != nil {
+ t.Fatalf("GenerateVAPIDKeys: %v", err)
+ }
+ if !ValidateVAPIDPublicKey(pub) {
+ t.Error("valid public key should pass validation")
+ }
+ if ValidateVAPIDPublicKey(priv) {
+ t.Error("private key (32 bytes) should fail public key validation")
+ }
+ if ValidateVAPIDPublicKey("") {
+ t.Error("empty string should fail validation")
+ }
+ if ValidateVAPIDPublicKey("notbase64!!!") {
+ t.Error("invalid base64 should fail validation")
+ }
+}
+
+// TestGenerateVAPIDKeys_PublicKeyIs65Bytes verifies that the public key returned
+// by GenerateVAPIDKeys is a 65-byte uncompressed P256 EC point (base64url, no padding = 87 chars)
+// and the private key is 32 bytes (43 chars). Previously the return values were swapped.
+func TestGenerateVAPIDKeys_PublicKeyIs65Bytes(t *testing.T) {
+ pub, priv, err := GenerateVAPIDKeys()
+ if err != nil {
+ t.Fatalf("GenerateVAPIDKeys: %v", err)
+ }
+
+ // Public key: 65 bytes → 87 base64url chars (no padding).
+ if len(pub) != 87 {
+ t.Errorf("public key: want 87 chars (65 bytes), got %d chars (%q)", len(pub), pub)
+ }
+ pubBytes, err := base64.RawURLEncoding.DecodeString(pub)
+ if err != nil {
+ t.Fatalf("public key base64url decode: %v", err)
+ }
+ if len(pubBytes) != 65 {
+ t.Errorf("public key bytes: want 65, got %d", len(pubBytes))
+ }
+ if pubBytes[0] != 0x04 {
+ t.Errorf("public key first byte: want 0x04 (uncompressed point), got 0x%02x", pubBytes[0])
+ }
+
+ // Private key: 32 bytes → 43 base64url chars (no padding).
+ if len(priv) != 43 {
+ t.Errorf("private key: want 43 chars (32 bytes), got %d chars (%q)", len(priv), priv)
+ }
+ privBytes, err := base64.RawURLEncoding.DecodeString(priv)
+ if err != nil {
+ t.Fatalf("private key base64url decode: %v", err)
+ }
+ if len(privBytes) != 32 {
+ t.Errorf("private key bytes: want 32, got %d", len(privBytes))
+ }
+}