Start · Sprachen · PHP · Referenz · rnp_op_verify

rnp_op_verify

Funktion

Erstellt eine Verifizierungs-Operation für eingebettete oder Klartext-Signaturen und gibt ein Operationsobjekt zurück.

Kategorie: crypto

Signatur

rnp_op_verify(FFI\CData $ffi, resource $input, resource|null $output): resource|false

Beschreibung

rnp_op_verify gehört zur RNP-Erweiterung für PHP, welche die OpenPGP-Bibliothek librnp kapselt. Die Funktion initiiert eine Signaturprüfoperation auf einem Eingabe-Datenstrom ($input), der entweder eine eingebettete Signatur (Signed Message) oder eine Klartext-Signatur enthält. Das zurückgegebene Operationshandle wird anschließend mit rnp_op_verify_execute ausgeführt und mit rnp_op_verify_get_signature_at ausgewertet.

Der Parameter $output nimmt den Handle entgegen, in den der verifizierte Klartextinhalt geschrieben werden soll. Bei detached-Signaturen (getrennte Signatur) ist stattdessen rnp_op_verify_detached zu verwenden. Für eingebettete oder Klartext-Signaturen ist rnp_op_verify die korrekte Wahl.

Das Operationsobjekt muss nach der Verwendung mit rnp_op_verify_destroy freigegeben werden, um Speicherlecks zu vermeiden. Input- und Output-Handles werden separat über rnp_input_destroy bzw. rnp_output_destroy verwaltet.

  • Unterstützt komprimierte und verschlüsselte Nachrichten mit eingebetteter Signatur.
  • Erlaubt den Zugriff auf einzelne Signaturen und deren Status (gültig, abgelaufen, unbekannt).
  • Für Batch-Verifizierung empfiehlt es sich, alle Signaturen mittels Schleife über rnp_op_verify_get_signature_count zu prüfen.

Parameter

Name Typ Default Beschreibung
$ffi Pflicht FFI\CData Das RNP-FFI-Handle, das mit rnp_ffi_create erzeugt wurde und den Keyring mit den Verifikationsschlüsseln enthält.
$input Pflicht resource Ein mit rnp_input_from_memory oder rnp_input_from_path erstelltes Input-Handle, das die zu prüfende Nachricht (eingebettete oder Klartext-Signatur) enthält.
$output resource|null null Ein mit rnp_output_to_memory oder rnp_output_to_path erstelltes Output-Handle, in das der entschlüsselte/verifizierte Klartextinhalt geschrieben wird. Kann null sein, wenn der Inhalt nicht benötigt wird.

Rückgabewert

Typ
resource|false
Beschreibung
Gibt bei Erfolg ein Operationshandle zurück, das für weitere Aufrufe wie rnp_op_verify_execute benötigt wird. Im Fehlerfall (z. B. ungültige Parameter oder interner Fehler) wird false zurückgegeben.

Beispiele

Eingebettete OpenPGP-Signatur prüfen

<?php
// FFI-Kontext erstellen
$ffi = rnp_ffi_create('GPG', 'GPG');

// Öffentlichen Schlüssel laden
rnp_load_keys($ffi, 'GPG', rnp_input_from_path('/path/to/pubring.gpg'), RNP_LOAD_SAVE_PUBLIC_KEYS);

// Eingabe: signierte Nachricht
$signedMessage = file_get_contents('/path/to/signed_message.gpg');
$input  = rnp_input_from_memory($signedMessage);
$output = rnp_output_to_memory();

// Verifizierungs-Operation erstellen
$verify = rnp_op_verify($ffi, $input, $output);
if ($verify === false) {
    die('Fehler beim Erstellen der Verifizierungs-Operation.');
}

// Operation ausführen
if (!rnp_op_verify_execute($verify)) {
    die('Verifizierung fehlgeschlagen.');
}

// Signaturen auswerten
$count = rnp_op_verify_get_signature_count($verify);
for ($i = 0; $i < $count; $i++) {
    $sig    = rnp_op_verify_get_signature_at($verify, $i);
    $status = rnp_op_verify_signature_get_status($sig);
    echo "Signatur $i Status: $status\n";
}

// Klartextinhalt ausgeben
$plaintext = rnp_output_memory_get_buf($output);
echo "Inhalt: $plaintext\n";

// Ressourcen freigeben
rnp_op_verify_destroy($verify);
rnp_input_destroy($input);
rnp_output_destroy($output);
rnp_ffi_destroy($ffi);
Signatur 0 Status: 0 Inhalt: Hallo, Welt!

Prüfung einer Klartext-Signatur (Cleartext-Signatur)

<?php
$ffi = rnp_ffi_create('GPG', 'GPG');
rnp_load_keys(
    $ffi,
    'GPG',
    rnp_input_from_path('/path/to/pubring.gpg'),
    RNP_LOAD_SAVE_PUBLIC_KEYS
);

// Klartext-signierte Nachricht (ASCII-Armor-Format)
$clearSigned = file_get_contents('/path/to/message.asc');
$input  = rnp_input_from_memory($clearSigned);
$output = rnp_output_to_memory();

$verify = rnp_op_verify($ffi, $input, $output);
if ($verify === false) {
    die('Konnte Verifizierungs-Operation nicht erstellen.');
}

$result = rnp_op_verify_execute($verify);
$count  = rnp_op_verify_get_signature_count($verify);
echo "Anzahl Signaturen: $count\n";

for ($i = 0; $i < $count; $i++) {
    $sig    = rnp_op_verify_get_signature_at($verify, $i);
    $status = rnp_op_verify_signature_get_status($sig);
    if ($status === 0) {
        echo "Signatur $i ist GÜLTIG.\n";
    } else {
        echo "Signatur $i ist UNGÜLTIG (Statuscode: $status).\n";
    }
}

rnp_op_verify_destroy($verify);
rnp_input_destroy($input);
rnp_output_destroy($output);
rnp_ffi_destroy($ffi);
Anzahl Signaturen: 1 Signatur 0 ist GÜLTIG.

// Wichtig · Fallstricke

Sicherheitshinweise:

  • Eine erfolgreiche Ausführung von rnp_op_verify_execute ohne Fehler bedeutet nicht zwingend, dass alle Signaturen gültig sind. Jede Signatur muss mit rnp_op_verify_signature_get_status einzeln geprüft werden.
  • Stellen Sie sicher, dass der verwendete öffentliche Schlüssel aus einer vertrauenswürdigen Quelle stammt und korrekt in den Keyring geladen wurde. Andernfalls kann eine Signatur als unbekannt oder nicht prüfbar erscheinen.
  • Für abgelaufene Schlüssel oder widerrufene Schlüssel liefert rnp_op_verify_signature_get_status entsprechende Fehlercodes, die nicht als gültig interpretiert werden dürfen.
  • Für detached Signaturen (Signatur in separater Datei) muss stattdessen rnp_op_verify_detached verwendet werden – rnp_op_verify eignet sich nur für eingebettete und Klartext-Signaturen.