This commit is contained in:
2026-04-18 23:11:35 +02:00
commit f7cfd2a86e
196 changed files with 35538 additions and 0 deletions
+39
View File
@@ -0,0 +1,39 @@
import { getCryptoBackend } from './backend.js';
export interface X25519KeyPair {
publicKey: Uint8Array; // 32 bytes
privateKey: Uint8Array; // 32 bytes
}
export async function generateX25519KeyPair(): Promise<X25519KeyPair> {
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<string> {
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<Uint8Array> {
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;
}