diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx
index c1c306d..d01a146 100644
--- a/frontend/src/App.jsx
+++ b/frontend/src/App.jsx
@@ -5,8 +5,26 @@ import CalendarWidget, { CalendarSettings } from './calendar.jsx';
import { DateiSettings } from './tools/dateien.jsx';
import { useConfirm } from './confirm.jsx';
import { HomeIcon, AppsIcon, AdminIcon, MoreIcon, UserIcon, LogOutIcon, ChevronIcon, UpdateIcon, TrashIcon, MessageIcon } from './icons.jsx';
+import { getOrCreateKeyPair, getPublicKeyJwk, getFingerprint, exportEncrypted, importEncrypted, generateNewKeyPair } from './crypto.js';
-const ICONS = ['🔗','🌐','📊','📁','🛠','📧','🗓','💾','🖥','📡','🔒','📖','🎯','⚡','🏠','🔧','📱','🎮','🚀','💡'];
+const CONST_ICONS = ['🔗','🌐','📊','📁','🛠','📧','🗓','💾','🖥','📡','🔒','📖','🎯','⚡','🏠','🔧','📱','🎮','🚀','💡'];
+
+// Schlüsselpaar beim Login generieren und public key registrieren (fire & forget)
+async function initNachrichtenKeys() {
+ const LS_KEY = 'dd_msg_keypair';
+ let pubJwk;
+ const stored = localStorage.getItem(LS_KEY);
+ if (stored) {
+ try { pubJwk = JSON.parse(stored).pub; } catch { localStorage.removeItem(LS_KEY); }
+ }
+ if (!pubJwk) {
+ const kp = await crypto.subtle.generateKey({ name:'ECDH', namedCurve:'P-256' }, true, ['deriveKey']);
+ pubJwk = await crypto.subtle.exportKey('jwk', kp.publicKey);
+ const priv = await crypto.subtle.exportKey('jwk', kp.privateKey);
+ localStorage.setItem(LS_KEY, JSON.stringify({ pub: pubJwk, priv }));
+ }
+ try { await api('/tools/nachrichten/keys', { body: { public_key: JSON.stringify(pubJwk) } }); } catch {}
+}
// ── Responsive Hook ───────────────────────────────────────────────────────────
function useIsMobile() {
@@ -93,7 +111,7 @@ function Login({ onLogin }) {
const [err,setErr]=useState(''); const [busy,setBusy]=useState(false);
const go = async () => {
setErr(''); setBusy(true);
- try { const d=await api('/auth/login',{body:{username:u,password:p}}); localStorage.setItem('sk_token',d.token); onLogin(d.user); }
+ try { const d=await api('/auth/login',{body:{username:u,password:p}}); localStorage.setItem('sk_token',d.token); initNachrichtenKeys(); onLogin(d.user); }
catch(e) { setErr(e.message); } finally { setBusy(false); }
};
return (
@@ -496,7 +514,7 @@ function QuickLinks({ toast, mobile }) {
ICON
- {ICONS.map(ic => (
+ {CONST_ICONS.map(ic => (