From 70b86244a7b6d2fcd2f409193a654d3574f4a942 Mon Sep 17 00:00:00 2001 From: Christopher Date: Wed, 28 Jan 2026 07:22:11 -0800 Subject: [PATCH] Refactor Base64 variant handling in tryDecodeBase64 Simplifies and clarifies the logic for selecting Base64 variants by using a Set to ensure uniqueness and order. This change improves maintainability and robustness when decoding Base64 strings with different variants. --- src/lib/crypto/sodium-chat.ts | 29 +++++++++++++---------------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/src/lib/crypto/sodium-chat.ts b/src/lib/crypto/sodium-chat.ts index 329f0b7..390c16e 100644 --- a/src/lib/crypto/sodium-chat.ts +++ b/src/lib/crypto/sodium-chat.ts @@ -58,25 +58,22 @@ export async function generateChatKeyPair(): Promise<{ // Helper to robustly decode Base64 regardless of variant (Original vs URLSafe) function tryDecodeBase64(str: string): Uint8Array { - const variants = [ - // Standard Base64 (likely for Remote keys with +/) - (sodium.base64_variants && sodium.base64_variants.ORIGINAL), - // URL-Safe Base64 (likely for Local keys) - (sodium.base64_variants && sodium.base64_variants.URLSAFE), - // No Padding variants - (sodium.base64_variants && sodium.base64_variants.ORIGINAL_NO_PADDING), - (sodium.base64_variants && sodium.base64_variants.URLSAFE_NO_PADDING), - // Fallback/Default - undefined - ]; + // Use a Set to ensure uniqueness and order, explicitly allowing undefined + const variants = new Set(); - // Filter out undefined variants (if enum missing) and create unique set - const validVariants = [...new Set(variants.filter(v => v !== undefined))]; - // Add undefined at the end as fallback if not present - if (!validVariants.includes(undefined)) validVariants.push(undefined); + // Prefer standard/known variants first + if (sodium.base64_variants) { + if (sodium.base64_variants.ORIGINAL !== undefined) variants.add(sodium.base64_variants.ORIGINAL); + if (sodium.base64_variants.URLSAFE !== undefined) variants.add(sodium.base64_variants.URLSAFE); + if (sodium.base64_variants.ORIGINAL_NO_PADDING !== undefined) variants.add(sodium.base64_variants.ORIGINAL_NO_PADDING); + if (sodium.base64_variants.URLSAFE_NO_PADDING !== undefined) variants.add(sodium.base64_variants.URLSAFE_NO_PADDING); + } + + // Always add default (undefined) as fallback + variants.add(undefined); let lastError; - for (const v of validVariants) { + for (const v of variants) { try { return v !== undefined ? sodium.from_base64(str, v)