initial
This commit is contained in:
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user