Signatur
Beschreibung
sodium_crypto_core_ristretto255_is_valid_point() überprüft, ob ein Byte-String einen gültigen, nicht-neutralen Punkt auf der ristretto255-Kurve darstellt. Die Funktion gibt true zurück, wenn der übergebene Punkt sowohl korrekt kodiert als auch kein Neutralelement (Punkt im Unendlichen) ist.
ristretto255 ist eine kryptographische Gruppe, die auf der Curve25519 basiert und speziell entwickelt wurde, um Probleme mit Cofaktor-Schwachstellen zu vermeiden. Sie wird häufig in Zero-Knowledge-Protokollen, Passwort-Authentifizierungsprotokollen (z. B. OPAQUE, VOPRF) und anderen modernen kryptographischen Konstrukten eingesetzt.
Diese Validierungsfunktion ist besonders wichtig, wenn Punkte aus unsicheren Quellen (z. B. von Netzwerk-Gegenstellen oder Nutzereingaben) stammen. Das Verarbeiten eines ungültigen Punktes in nachfolgenden kryptographischen Operationen kann zu Fehlern oder Sicherheitsproblemen führen. Die Prüfung sollte daher stets vor der Verwendung eines empfangenen Punktes durchgeführt werden.
Die Länge des erwarteten Byte-Strings beträgt SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES Bytes (32 Bytes). Punkte mit falscher Länge oder ungültiger Kodierung werden als ungültig abgewiesen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $p Pflicht | string | Ein Byte-String der Länge SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES (32 Bytes), der den zu prüfenden Punkt auf der ristretto255-Kurve enthält. |
Rückgabewert
true zurück, wenn $p ein gültiger, nicht-neutraler Punkt auf der ristretto255-Kurve ist. Gibt false zurück, wenn der Punkt ungültig kodiert ist, das Neutralelement darstellt oder eine falsche Länge hat.Beispiele
Validierung eines zufällig generierten Punktes
<?php
// Erzeuge einen gültigen zufälligen Punkt auf der ristretto255-Kurve
$validPoint = sodium_crypto_core_ristretto255_random();
if (sodium_crypto_core_ristretto255_is_valid_point($validPoint)) {
echo "Der Punkt ist gültig und liegt auf der ristretto255-Kurve." . PHP_EOL;
} else {
echo "Der Punkt ist UNGÜLTIG!" . PHP_EOL;
}
// Erzeuge einen absichtlich ungültigen Punkt (zufällige Bytes)
$invalidPoint = random_bytes(SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES);
if (sodium_crypto_core_ristretto255_is_valid_point($invalidPoint)) {
echo "Der Punkt ist gültig." . PHP_EOL;
} else {
echo "Zufällige Bytes ergeben in der Regel keinen gültigen Punkt." . PHP_EOL;
}
Sicherheits-Validierung vor kryptographischer Verarbeitung
<?php
/**
* Empfange einen Punkt von einem Netzwerk-Gegenstück und validiere ihn,
* bevor er in weiteren Berechnungen verwendet wird.
*/
function verarbeiteEmpfangenenPunkt(string $empfangenerPunkt): void
{
// Zuerst Länge prüfen
if (strlen($empfangenerPunkt) !== SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES) {
throw new InvalidArgumentException('Ungültige Punktlänge: erwartet ' . SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES . ' Bytes.');
}
// Dann kryptographische Gültigkeit prüfen
if (!sodium_crypto_core_ristretto255_is_valid_point($empfangenerPunkt)) {
throw new InvalidArgumentException('Der empfangene Wert ist kein gültiger ristretto255-Punkt.');
}
// Sicher: Punkt kann weiterverarbeitet werden
$skalar = sodium_crypto_core_ristretto255_scalar_random();
$ergebnis = sodium_crypto_scalarmult_ristretto255($skalar, $empfangenerPunkt);
echo 'Punktmultiplikation erfolgreich. Ergebnis (hex): ' . bin2hex($ergebnis) . PHP_EOL;
}
// Simuliere einen gültigen empfangenen Punkt
$punkt = sodium_crypto_core_ristretto255_random();
verarbeiteEmpfangenenPunkt($punkt);
// Simuliere einen Angriff mit einem ungültigen Punkt
try {
verarbeiteEmpfangenenPunkt(str_repeat("\x00", 32)); // Neutralelement
} catch (InvalidArgumentException $e) {
echo 'Fehler abgefangen: ' . $e->getMessage() . PHP_EOL;
}
// Wichtig · Fallstricke
Sicherheitshinweis: Das Neutralelement (32 Null-Bytes) ist kein gültiger Punkt im Sinne dieser Funktion und wird als ungültig zurückgewiesen. Dennoch sollte man beim Einsatz in kryptographischen Protokollen stets sicherstellen, dass Punkte, die von Dritten stammen, immer vor ihrer Verwendung validiert werden, da kleine-Untergruppen-Angriffe und andere Manipulationen zu Sicherheitsproblemen führen können.
Die Funktion setzt die libsodium-Bibliothek voraus. Unter PHP muss die sodium-Erweiterung aktiviert sein. In PHP 7.2+ ist sie standardmäßig gebündelt, aber unter Umständen nicht aktiviert.
Die Konstante SODIUM_CRYPTO_CORE_RISTRETTO255_BYTES hat den Wert 32 und entspricht der erwarteten Länge eines kodierten ristretto255-Punktes.