====== std.crypto.x25519 ======
X25519 Diffie-Hellman Schlüsselaustausch auf Curve25519 (RFC 7748). Implementiert die Montgomery-Leiter in constant-time — kein Timing-Side-Channel auf geheimen Skalaren. Grundlage für [[lyx_-_programmiersprache:units:crypto:pqc:hybrid|std.crypto.pqc.hybrid]] (X25519 + ML-KEM-768).
import std.crypto.x25519;
→ [[lyx_-_programmiersprache:units:crypto|std.crypto]] · [[lyx_-_programmiersprache:units|Standard Library]]
----
===== Konstanten =====
^ Konstante ^ Wert ^ Bedeutung ^
| ''X25519_PK'' | 32 | Public-Key-Länge in Bytes |
| ''X25519_SK'' | 32 | Private-Key-Länge in Bytes |
| ''X25519_SS'' | 32 | Shared-Secret-Länge in Bytes |
----
===== Funktionen =====
^ Funktion ^ Beschreibung ^
| ''X25519KeyGen(seed, pk, sk)'' | Leitet pk (32B) und sk (32B) aus einem 32-Byte-Seed ab. sk = seed (nach Clamp), pk = X25519(sk, 9) |
| ''X25519SharedSecret(sk, pk, ss)'' | Berechnet ss = X25519(sk, pk) — ECDH-Shared-Secret aus eigenem sk und dem Public-Key der Gegenseite |
| ''X25519(out, k, u)'' | Low-Level: Skalarmultiplikation auf Curve25519. k = 32-Byte-Skalar, u = 32-Byte-u-Koordinate |
Puffer-Anforderungen: alle Puffer exakt 32 Bytes.
----
===== Verwendungsbeispiel =====
**ECDH-Schlüsselaustausch (zwei Parteien):**
import std.crypto.x25519;
import std.crypto.rand;
import std.alloc;
fn main(): int64 {
// Alice: Schlüsselpaar erzeugen
var alice_seed: int64 := alloc(32);
var alice_pk: int64 := alloc(X25519_PK);
var alice_sk: int64 := alloc(X25519_SK);
RandBytesExact(alice_seed, 32);
X25519KeyGen(alice_seed, alice_pk, alice_sk);
// Bob: Schlüsselpaar erzeugen
var bob_seed: int64 := alloc(32);
var bob_pk: int64 := alloc(X25519_PK);
var bob_sk: int64 := alloc(X25519_SK);
RandBytesExact(bob_seed, 32);
X25519KeyGen(bob_seed, bob_pk, bob_sk);
// Alice berechnet Shared Secret mit Bobs Public Key:
var alice_ss: int64 := alloc(X25519_SS);
X25519SharedSecret(alice_sk, bob_pk, alice_ss);
// Bob berechnet Shared Secret mit Alices Public Key:
var bob_ss: int64 := alloc(X25519_SS);
X25519SharedSecret(bob_sk, alice_pk, bob_ss);
// alice_ss == bob_ss (identische 32 Bytes)
free(alice_seed, 32); free(alice_pk, 32); free(alice_sk, 32); free(alice_ss, 32);
free(bob_seed, 32); free(bob_pk, 32); free(bob_sk, 32); free(bob_ss, 32);
return 0;
}
----
===== Mathematischer Hintergrund =====
Feld: GF(2²⁵⁵ − 19), p = 2²⁵⁵ − 19
Darstellung: 10 int64-Limbs, alternierend 26/25 Bit
Skalarmultiplikation: Montgomery-Leiter (RFC 7748 §5)
**Clamp-Prozedur** (wird von X25519KeyGen automatisch angewendet):
sk[0] &= 248 (Bits 0–2 = 0)
sk[31] &= 127 (Bit 255 = 0)
sk[31] |= 64 (Bit 254 = 1)
Constant-Time-Garantie: Die Montgomery-Leiter führt bei jedem Bit eine CTSelect-Operation durch — kein Branch auf geheimem Skalar.
----
===== Sicherheitshinweise =====
* ''seed'' muss kryptographisch sicher sein → ''RandBytesExact'' aus ''std.crypto.rand''
* Shared Secret nach Verwendung löschen → ''dadqZeroize'' oder ''SecureZero'' aus ''std.crypto.ct''
* X25519 allein ist kein authentifizierter Schlüsselaustausch — für PQC-sichere KEM → [[lyx_-_programmiersprache:units:crypto:pqc:hybrid|std.crypto.pqc.hybrid]]
Letzte Aktualisierung: 2026-06-08