"use node"; /** * Utilitários de criptografia compatíveis com Node.js * Para uso em actions que rodam em ambiente Node.js */ /** * Descriptografa senha SMTP usando Web Crypto API compatível com Node.js * Esta versão funciona em ambiente Node.js (actions) */ export async function decryptSMTPPasswordNode(encryptedPassword: string): Promise { try { // Em Node.js, crypto.subtle está disponível globalmente const crypto = globalThis.crypto; if (!crypto || !crypto.subtle) { throw new Error("Web Crypto API não disponível"); } // Chave base - mesma usada em auth/utils.ts const keyMaterial = new TextEncoder().encode("SGSE-EMAIL-ENCRYPTION-KEY-2024"); // Importar chave material const keyMaterialKey = await crypto.subtle.importKey( "raw", keyMaterial, { name: "PBKDF2" }, false, ["deriveBits", "deriveKey"] ); // Derivar chave de 256 bits usando PBKDF2 const key = await crypto.subtle.deriveKey( { name: "PBKDF2", salt: new TextEncoder().encode("SGSE-SALT"), iterations: 100000, hash: "SHA-256", }, keyMaterialKey, { name: "AES-GCM", length: 256 }, false, ["encrypt", "decrypt"] ); // Decodificar base64 manualmente (compatível com Node.js e browser) const binaryString = atob(encryptedPassword); const combined = Uint8Array.from(binaryString, (c) => c.charCodeAt(0)); // Extrair IV e dados criptografados const iv = combined.slice(0, 12); const encrypted = combined.slice(12); // Descriptografar const decrypted = await crypto.subtle.decrypt( { name: "AES-GCM", iv: iv, }, key, encrypted ); // Converter para string const decoder = new TextDecoder(); return decoder.decode(decrypted); } catch (error) { const errorMessage = error instanceof Error ? error.message : String(error); console.error("Erro ao descriptografar senha SMTP (Node.js):", errorMessage); throw new Error(`Falha ao descriptografar senha SMTP: ${errorMessage}`); } }