constant-time-compare.test.ts 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { describe, expect, it } from "vitest";
  2. import { constantTimeEqual } from "@/lib/security/constant-time-compare";
  3. describe("constantTimeEqual", () => {
  4. it("returns true for equal strings", () => {
  5. expect(constantTimeEqual("hello", "hello")).toBe(true);
  6. });
  7. it("returns false for different strings of same length", () => {
  8. expect(constantTimeEqual("hello", "world")).toBe(false);
  9. });
  10. it("returns false for strings of different lengths", () => {
  11. expect(constantTimeEqual("short", "a-much-longer-string")).toBe(false);
  12. });
  13. it("returns true for empty strings", () => {
  14. expect(constantTimeEqual("", "")).toBe(true);
  15. });
  16. it("returns false when one string is empty and the other is not", () => {
  17. expect(constantTimeEqual("", "nonempty")).toBe(false);
  18. expect(constantTimeEqual("nonempty", "")).toBe(false);
  19. });
  20. it("handles unicode correctly", () => {
  21. expect(constantTimeEqual("\u00e9", "\u00e9")).toBe(true);
  22. expect(constantTimeEqual("\u00e9", "e")).toBe(false);
  23. });
  24. it("handles long token-like strings", () => {
  25. const tokenA = "sk-ant-api03-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
  26. const tokenB = "sk-ant-api03-AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
  27. const tokenC = "sk-ant-api03-BBBBBBBBBBBBBBBBBBBBBBBBBBBBBB";
  28. expect(constantTimeEqual(tokenA, tokenB)).toBe(true);
  29. expect(constantTimeEqual(tokenA, tokenC)).toBe(false);
  30. });
  31. it("is reflexive", () => {
  32. const s = "test-token-value";
  33. expect(constantTimeEqual(s, s)).toBe(true);
  34. });
  35. });