import { getCryptoBackend } from './backend.js'; export interface X25519KeyPair { publicKey: Uint8Array; // 32 bytes privateKey: Uint8Array; // 32 bytes } export async function generateX25519KeyPair(): Promise { const backend = getCryptoBackend(); const kp = backend.generateKeyPair(); return { publicKey: kp.publicKey, privateKey: kp.privateKey }; } // ---- base64 helpers (used to persist private keys client-side) ---------- // Use browser-native btoa/atob. Both are available in Tauri webview and RN // (Expo polyfills atob/btoa). No external dep needed. export async function toBase64(bytes: Uint8Array): Promise { let binary = ''; for (let i = 0; i < bytes.length; i++) { binary += String.fromCharCode(bytes[i]!); } return btoa(binary); } export async function fromBase64(input: string): Promise { const binary = atob(input); const out = new Uint8Array(binary.length); for (let i = 0; i < binary.length; i++) { out[i] = binary.charCodeAt(i); } return out; } // Wipe a key best-effort. JS can't truly guarantee zeroization but // overwriting the buffer removes the value from live references. export function wipe(bytes: Uint8Array): void { for (let i = 0; i < bytes.length; i++) bytes[i] = 0; }