7c2a3f68a3cd

test: add shared Vault V4 long-password vector (v5.1.3)

time
2026-09-05 13:00 UTC · 1 month ago
machine
koh2
agent
gpt-6
session
Vault V4 password and passphrase support
parent
004b3227fc8e
5 files fixtures/golden/peach-payload-v4.json+13 −0manifest.firefox.json+1 −1manifest.json+1 −1package.json+1 −1src/crypto/peachPayload.test.ts+19 −0
fixtures/golden/peach-payload-v4.json+13 −0
@@ -0,0 +1,13 @@1+{2+  "format": 4,3+  "passphrase": "cross-platform-v4",4+  "passwords": {5+    "ascii": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",6+    "unicode": "界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界界"7+  },8+  "entryIds": [9+    "123e4567-e89b-42d3-a456-426614174001",10+    "123e4567-e89b-42d3-a456-426614174002"11+  ],12+  "envelopeBase64": "N5j5qjYXq/lg0PIE1Gy2rnYpqn42juHbqYb3u0zoYFIynUEHLSCW2VbIDD8CObJR8FfSGV1xHIfKn/Kdp7QQx5+YQKKSlOrQ0xN3iOrh8wDsWudtp/ucwxrW49wTDMIyzV+yaIs2bDJ8cQT3+i+pAnXMei8PSa8WKM4HfscuXuYYyN3aJCB8/QyPD0eEqhiFHr3e4NOLluhjQ5ssKf6OClpAp5dZ8uZihDSaUzK8zX4C7MTM9N3MJyQAayrlYtkWWIv9Ba9h/GuNzbJAJMuS14wurz/PUQbi7pywIQdAlpHQdbuGM3IOoXwq5ylrIwvh/jezKWEIjt2FGnOdb/H09BV1b2jwEbXsJKbAG6AK/Pt8nvq3f6fZsgTfSbMOLDmgVM2GpnCqXJ4kcgz4S+PdqEi8x1p3CkEcLa/R4CmYI4M7N70n5KWhvjiiFvRWFJ+9H7rMujtBHJmM4oT5plVNQqXm6/NkTqYGUXXbItTvGH5DFvVXkt9e21TZdxneyOr6RCmcst/a255FKrHKIRLlhAYxJNMxVyzMMyXBB8tJeKM+344EcNYH57kQPvsZt1iBShYib/z/QZ8l9hG1jCg0bMwQsPNVGtJ1eOW+kdpweZMnXNMhGLksaQvVhObVP0codlgO5yg0xDvHWBxSej5p3nxBCjaSboadgQC7SXe/qVGXFGkOVXwJHPwsnzHkIY8seUCdu52Pp95t3ALK2rRDQNIIswmxnBkDZ6K1lVsFg3EovmJrkgdgbdAxQWmhFVx+qlKBAWohbMsjJQO3yegdF/Oax2cF+oGH/NnxTdeOhezJuz1HDOl3I9UzQQuNV37lWCEEK4gucaTAdr9o8pBFIPzIgmoygaVjLQAI9tZv8HLmdhkkKBd4KG09Cm6hR8gLBtS9V2jb0VwcACPCiPktx587qz5w4mX3msLp6U73tve+4mQtTo/z+VfFpzZTspsV3CeKKVgxMronNrzqXqm9B7RG20wOGLHFPeQizEy6Sqs3COpf60haumQg51B9ZXAZDo4eVNDV9+QeSESMR3+s4h0T2uEocqXT61auTYZHB5vDvNGXKt1prcPPFXuvfp8BDkyItGKBdLanMFmvtqw3gmd0kGfI7KkwlX5mFMgtdwYvXTXPty4zaurSDZ29r9t5/T9ydwVXKaKleYad/7ErTChutBPdgaM4TrCDkbocNMUyp8I4j0YpDDl2H4Pq/urftcUSBHz1IdekPY+PpilRybqAeR9xRY0HfNk3XVcuUJC9B1EHortXBAWMdA98jvncJaIEB51Jy7BAXyHlNtpkwNxMry4u60UO1f8bWVgb5eqJIUMBf3bh/gMDKLbBB3o38MQBEOHIYSckHARXJbUv3Vrv0DMotKeSVYtztw/92KeVzaDOZiisS1/jXg/g8SBERzfL0W3c4B5iu7Ac"13+}

view file

manifest.firefox.json+1 −1
@@ -1,7 +1,7 @@11 {22   "manifest_version": 3,33   "name": "Peach Password Manager",4-  "version": "5.1.2",4+  "version": "5.1.3",55   "description": "Zero-knowledge password manager",66   "browser_specific_settings": {77     "gecko": {

view file

manifest.json+1 −1
@@ -2,7 +2,7 @@22   "manifest_version": 3,33   "minimum_chrome_version": "116",44   "name": "Peach Password Manager",5-  "version": "5.1.2",5+  "version": "5.1.3",66   "description": "Zero-knowledge password manager",77   "action": {88     "default_popup": "src/popup/index.html",

view file

package.json+1 −1
@@ -1,6 +1,6 @@11 {22   "name": "peach",3-  "version": "5.1.2",3+  "version": "5.1.3",44   "description": "Zero-knowledge password manager",55   "license": "GPL-3.0-only",66   "type": "module",

view file

src/crypto/peachPayload.test.ts+19 −0
@@ -20,6 +20,15 @@2020   envelopeBase64: string;2121 };2222 23+const V4_VECTOR = JSON.parse(24+  readFileSync("fixtures/golden/peach-payload-v4.json", "utf8"),25+) as {26+  passphrase: string;27+  passwords: { ascii: string; unicode: string };28+  entryIds: string[];29+  envelopeBase64: string;30+};31+2332 function loginEntry(over: Partial<VaultEntry> = {}): VaultEntry {2433   return {2534     id: crypto.randomUUID(),@@ -92,6 +101,16 @@92101 }93102 94103 describe("peachPayload", () => {104+  test("shared V4 vector decodes 256-character ASCII and Unicode passwords", async () => {105+    const envelope = Uint8Array.from(atob(V4_VECTOR.envelopeBase64), (character) => character.charCodeAt(0));106+    const decoded = await parsePayload(envelope, V4_VECTOR.passphrase);107+    expect(decoded.entries.map((entry) => entry.id)).toEqual(V4_VECTOR.entryIds);108+    expect(decoded.entries.map((entry) => entry.password)).toEqual([109+      V4_VECTOR.passwords.ascii,110+      V4_VECTOR.passwords.unicode,111+    ]);112+  });113+95114   test("UUID round-trip preserves the hyphenated string", () => {96115     const id = "123e4567-e89b-42d3-a456-426614174000";97116     expect(bytesToUuid(uuidToBytes(id))).toBe(id);

view file